2013年4月19日金曜日

カメラ画像からの透過画像作成

今回のアプリPhotoRouletteでちょっと手こずった透過画像の作成です。






このようなカメラから取得した画像(実際はもっと大きいです)を





ルーレットで使用するためこのように台形状に切り出して透過画像を作成したい


今回とった手法は以下のような感じ
  1. Bitmap.createBitmapでカメラ画像から必要な大きさ分を切り出して作成
  2. もう一回Bitmap.createBitmapで切り出した画像から編集用Bitmapを作成。
    この時注意することとして、createBitmapのconfig指定をBitmap.Config.ARGB_4444かARGB_8888RGにする。RGB_565にしてしまうと透過しない。
  3. paint.setColor(Color.TRANSPARENT)を指定
  4. paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.CLEAR))を指定
  5. drawPathで画像の左右の透過したい三角の部分を塗りつぶします。
ソースとしては以下

 //切り出し画像作成
 Bitmap clip = Bitmap.createBitmap(image, (int)(image.getWidth() * 0.2), (int)((image.getHeight() - (image.getWidth() * 0.5)) / 2), (int)(image.getWidth() * 0.6), (int)(image.getWidth() * 0.5));
 //透過編集用画像作成 
 Bitmap edit = Bitmap.createBitmap(clip.getWidth(), clip.getHeight(), Bitmap.Config.ARGB_8888);
 Canvas canvas = new Canvas(edit);
 canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
 canvas.drawBitmap(clip, 0, 0, paint);
 //透過用Paint作成
 Paint paint = new Paint();
 paint.setColor(Color.TRANSPARENT);
 paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.CLEAR));
 paint.setStyle(Style.FILL);
 //左下透過部分
 Path path = new Path();
 path.moveTo(0, 0);
 path.lineTo(0, edit.getHeight());
 path.lineTo(edit.getHeight() * 0.265f, edit.getHeight());
 path.lineTo(0, 0);
 canvas.drawPath(path, paint);
 //右下透過部分
 path = new Path();
 path.moveTo(edit.getWidth(), 0);
 path.lineTo(edit.getWidth(), edit.getHeight());
 path.lineTo(edit.getWidth() - (edit.getHeight() * 0.265f), edit.getHeight());
 path.lineTo(edit.getWidth(), 0);
 canvas.drawPath(path, paint);

0 件のコメント:

コメントを投稿