Androidで複数のImageViewを1枚の画像に合成保存する方法
面白いカメラアプリが作りたい!
でも、画像が上手く合成出来ない…と言う事で合成の方法を調べた備忘録
Androidで複数ImageViewを使用した写真合成アプリのような物を想像してください。
その時に、見た目そのままの内容で画像を保存したいというのが、普通です。
じゃあ見たままの内容を保存する為にはどうしたらいいのでしょうか?
まずは手順から
- 背景となるBitmapを生成する
- 1.で作成したBitmapインスタンスを元にCanvasを生成する
- 2.で作成したCanvasに必要なImageViewから取得したBitmapとMatrixを使用してdrawBitmapを行う
- ファイルに出力する
このような手順になります。
手順1
ImageView imageView = (ImageView) findViewById(R.id.base_image);
Bitmap newBitmap = Bitmap.createBitmap(imageView.getWidth(), imageView.getHeight(), Bitmap.Config.ARGB_8888);
画面の表示サイズを取得する為、1行目でImageViewのインスタンスを取得これは、画面サイズがわかるViewであればImageViewである必要はないです。
手順2
Canvas offScreen = new Canvas(newBitmap);
手順1のBitmapを元にCavasを作成する、これで画像のベースとなるCanvasが出来上がる。
手順3
ImageView imageView1 = (ImageView) findViewById(R.id.image1);
ImageView imageView2 = (ImageView) findViewById(R.id.image2);
Bitmap bitmap1 = ((BitmapDrawable) imageView1.getDrawable()).getBitmap();
Bitmap bitmap2 = ((BitmapDrawable) imageView2.getDrawable()).getBitmap();
offScreen.drawBitmap(bitmap1, imageView1.getImageMatrix(), null);
offScreen.drawBitmap(bitmap2, imageView2.getImageMatrix(), null);
Canvasに必要な数だけdrawBitmapするその時にImageViewの中のMatrixを使用するように注意
手順4
OutputStream outputStream = null;
try {
outputStream = getContentResolver().openOutputStream(mUri);
newBitmap.compress(CompressFormat.JPEG, 100, outputStream);
} catch (FileNotFoundException e) {
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {}
}
}
ファイルに出力
ここでは、前もって作成済みのUriクラスのインスタンスmUriを使用してファイル出力を行うように記述しています。
FileOutputStreamを使用して普通にファイル出力を行っても問題ありません。
以上で、ImageViewの画像合成の出来上がりです。