Andoroidで画像処理入門

t-kado2010-11-20

来週にはIS03が発売されるということで(予約済み)
Androidの勉強を再開しました


大学時代は画像処理に明け暮れていたので
Androidでもそちらの方面から攻めていこうかなと

この2つページを参考にしました
https://sites.google.com/a/gclue.jp/android-docs/35-%E7%94%BB%E5%83%8F%E3%81%AE%E6%8F%8F%E7%94%BB
http://labs.techfirm.co.jp/android/cho/279

package com.tkada.bitmaptest;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;

/**
 *  起動クラス
 */
public class Bitmap_test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new MainView( getApplication() ));
    }
}
/**
 * 描画用のクラス
 */
class MainView extends View {
    private Paint myPaint = new Paint();
    private Bitmap myBitmap;
    /**
     * コンストラクタ
     * @param c
     */
    public MainView(Context c) {
        super(c);

        /* Resourceインスタンスの生成 */
        Resources res = this.getContext().getResources();
        /* 画像の読み込み(res/drawable/testj.jpg) */
        myBitmap = BitmapFactory.decodeResource(res, R.drawable.testj);
    }

    /**
     * 描画処理
     */
    protected void onDraw(Canvas canvas) {
        /* 背景色を設定 */
        canvas.drawColor(Color.BLUE);
    //画像の縦横の大きさを取得
        int Width=myBitmap.getWidth();
        int Height=myBitmap.getHeight();
    //出力用画像領域確保
        Bitmap output=Bitmap.createBitmap(Width, Height, Bitmap.Config.ARGB_8888);
    //画像処理用配列
        int[] pixels = new int[Width*Height];
    //pixelsの配列にmyBitmapのデータを格納する
        myBitmap.getPixels(pixels, 0, Width, 0, 0, Width, Height);
        for(int x=0;x<Width;x++){
        	 for(int y=0;y<Height;y++){
         //1画素ずつ取得
        		int pixel=pixels[x+y*Width];
         //RGB各色に分離
        		int r=Color.red(pixel);
        		int g=Color.green(pixel);
        		int b=Color.blue(pixel);
         //今回の画像処理はカラー画像をグレースケールに変換する
        		int gray=(int)(r*0.3+g*0.59+b*0.11); //輝度値=R×0.30+G×0.59+B×0.11
         //データを戻す
        		pixels[x+y*Width]=Color.argb(Color.alpha(pixel),gray,gray,gray);
        	}
        }
    //出力用の領域にセットする
        output.setPixels(pixels, 0, Width, 0, 0, Width, Height);
    /* Bitmapイメージの描画 */        
        canvas.drawBitmap(output, 0,0, myPaint);
    }
}


画像処理できるフレームワークが何となく分かったので
ネイティブ化、カメラとの連携辺りをやっていつかはマーケットに公開したいな