2010年4月6日火曜日

Android Bitmap Tips - jpg, png 作成とか -

Bitmap.Config の値
ALPHA_8  :Alpha のみ
ARGB_4444 :128
ARGB_8888 :256
RGB_565  :Alphaなし Bitmap.hasAlpha() は常に false になる

今気づいたけど、Bitmap って Parcelable だったんだ。


Bitmap を単一色で塗りつぶす

Resource から BitmapFactory.decodeResource(getResources(), R.id.bitmap1)
とかで作った Bitmap は immutable = 不変 なので、
eraseColor() とかするには、mutable な Bitmap をコピーして
作成しないといけない。

つまり、これはエラー(IllegalStateException)になる
  1. Bitmap bm1 = BitmapFactory.decodeResource(getResources(), R.id.bitmap1);  
  2. bm1.eraseColor(Color.BLACK);  


こっちは、エラーにならない
  1. Bitmap bm1 = BitmapFactory.decodeResource(getResources(), R.id.bitmap1);  
  2. Bitmap bm2 = bm1.copy(bm1.getConfig(), true);  
  3. bm2.eraseColor(Color.BLACK);  




Bitmap から .png .jpg ファイルを作成する

boolean Bimap.compress (Bitmap.CompressFormat format, int quality, OutputStream stream)
を使います。

format には、
Bitmap.CompressFormat.JPEG
or
Bitmap.CompressFormat.PNG
を指定し、

quality には 0 ~ 100 を指定します。普通は100?

stream には、圧縮したビットストリームを流し込む先
を指定します。

成功すると true が返ってきます。
あとは、stream を hogehoge.png とか hogehoge.jpg で
保存すればOK



Alpha値だけの Bitmap にする

Alpha値だけ抜き出した Bitmap を作成するには
Bitmap.extractAlpha()
を使います。

* Xperia ではこのメソッドは使えませんでした。
 代わりに
  Bitmap.copy(Bitmap.Config.ALPHA_8, true)
 で Alpha値だけ抜き出した Bitmap が作れます


  1. Bitmap bm1 = BitmapFactory.decodeResource(getResources(), R.id.bitmap1);  
  2. Bitmap bm2 = mb1.extractAlpha();  



特定のXY座標の色を取得する

ある、XY座標の Color を取得するには
int Bitmap.getPixel (int x, int y)
を使います。

x の範囲は 0 ~ width - 1
y の範囲は 0 ~ height - 1

戻り値は argb Color です。

x, y が Bitmap の境界より大きい場合は
IllegalArgumentException が返ってきます。

2010年4月3日土曜日

Android カメラに autofocus を実装する。

google先生にお尋ねしても、わかりやすいサイトが
なかったので、書きました。

カメラ部分は木南さんの本を参考にしています。
『Google-Androidアプリケーション開発入門』
ありがとうございます!!
買った方がいいですよ~。

シャッターボタンを押されたときに
Camera.autoFocus(Camera.AutoFocusCallback);
を呼んで,
Camera.AutoFocusCallback
で、autofocus を切って、takePicture すればOK

そうそう、カメラを使う場合には、manifest に

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

が必要です~。


  1. public class MyPic extends Activity {  
  2.   
  3.   private static final String TAG = "MyPic";  
  4.   private static final int IN_SAMPLE_SIZE = 1;  
  5.    
  6.   private Camera mCamera;  
  7.   private ImageView mImage;  
  8.   private boolean mInProgress;  
  9.    
  10.   private SurfaceHolder.Callback mSurfaceListener =  
  11.     new SurfaceHolder.Callback() {  
  12.      
  13.     @Override  
  14.     public void surfaceCreated(SurfaceHolder holder) {  
  15.       mCamera = Camera.open();  
  16.       Log.i(TAG, "Camera opened");  
  17.       try {  
  18.         mCamera.setPreviewDisplay(holder);  
  19.       }  
  20.       catch (Exception e) {  
  21.         e.printStackTrace();  
  22.       }  
  23.     }  
  24.      
  25.     @Override  
  26.     public void surfaceDestroyed(SurfaceHolder holder) {  
  27.       mCamera.release();  
  28.       mCamera = null;  
  29.       Log.i(TAG, "Camera released");  
  30.     }  
  31.      
  32.     @Override  
  33.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  34.       Camera.Parameters parameters = mCamera.getParameters();  
  35.       parameters.setPreviewSize(width, height);  
  36.       mCamera.setParameters(parameters);  
  37.       mCamera.startPreview();  
  38.       Log.i(TAG, "Camera preview started");  
  39.       Log.i(TAG, "width  : " + width);  
  40.       Log.i(TAG, "height : " + height);  
  41.     }  
  42.   };  
  43.   
  44.   private Camera.AutoFocusCallback mAutoFocusListener =  
  45.     new Camera.AutoFocusCallback() {    
  46.     @Override  
  47.     public void onAutoFocus(boolean success, Camera camera) {  
  48.       Log.i(TAG,"AutoFocus : " + success);  
  49.       camera.autoFocus(null);  
  50.       camera.takePicture(mShutterListener, null, mPictureListener);  
  51.       mInProgress = true;  
  52.     }  
  53.   };  
  54.     
  55.   private Camera.ShutterCallback mShutterListener =   
  56.     new Camera.ShutterCallback() {  
  57.     @Override  
  58.     public void onShutter() {  
  59.       Log.i(TAG, "onShutter");  
  60.     }  
  61.   };  
  62.     
  63.   private View.OnClickListener mButtonListener =   
  64.     new View.OnClickListener() {     
  65.     @Override  
  66.     public void onClick(View v) {  
  67.       if(mCamera != null && mInProgress == false){  
  68.         mCamera.autoFocus(mAutoFocusListener);  
  69.       }  
  70.     }  
  71.   };  
  72.     
  73.   private Camera.PictureCallback mPictureListener =   
  74.     new Camera.PictureCallback() {     
  75.     @Override  
  76.     public void onPictureTaken(byte[] data, Camera camera) {  
  77.       Log.i(TAG, "Picture taken");  
  78.       if(data != null) {  
  79.         Log.i(TAG, "JPEG Picture Taken");  
  80.         BitmapFactory.Options options = new BitmapFactory.Options();  
  81.         options.inSampleSize = IN_SAMPLE_SIZE;  
  82.         Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);  
  83.        
  84.         mImage.setImageBitmap(bitmap);  
  85.         mImage.setVisibility(View.VISIBLE);  
  86.       }  
  87.     }  
  88.   };  
  89.     
  90.   @Override  
  91.   public void onCreate(Bundle savedInstanceState) {  
  92.     super.onCreate(savedInstanceState);  
  93.     setContentView(R.layout.camera2);  
  94.     
  95.     mImage = (ImageView) findViewById(R.id.handpreview);  
  96.     SurfaceView surface = (SurfaceView) findViewById(R.id.surfaceview);  
  97.     SurfaceHolder holder = surface.getHolder();  
  98.     
  99.     holder.addCallback(mSurfaceListener);  
  100.     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  101.     
  102.     ImageButton button = (ImageButton) findViewById(R.id.shutter);  
  103.     button.setOnClickListener(mButtonListener);  
  104.   }   
  105. }  

2010年4月2日金曜日

Android Toast で画像を表示する

Toast に setView() で View を設定すると、任意の View
を表示することができます。

こんな感じ

  1. ImageView v = new ImageView(this);  
  2. v.setImageResource(R.drawable.addnote_off);  
  3. toast = new Toast(this);  
  4. toast.setDuration(Toast.LENGTH_LONG);  
  5. toast.setView(v);  
  6. toast.show();  


View ならばOKなので、xml でレイアウトを
定義した場合は Infrater を使います。

  1. LayoutInflater inflater = getLayoutInflater();  
  2. View v = inflater.inflate(R.layout.iv, null);  
  3. toast = new Toast(this);  
  4. toast.setDuration(Toast.LENGTH_LONG);  
  5. toast.setView(v);  


  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   android:orientation="vertical"   
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent" >  
  6.   <ImageView  
  7.     android:layout_width="wrap_content"  
  8.     android:layout_height="wrap_content"  
  9.     android:src="@drawable/addnote_off" />  
  10.   <TextView   
  11.     android:layout_width="fill_parent"  
  12.     android:layout_height="wrap_content"   
  13.     android:text="hello toast"  
  14.     android:textColor="#000000"  
  15.     android:background="#ffffff" />  
  16. </LinearLayout>