私は実際に3つの質問があります:
- ビットマップ上に画像を描画するか、リソースとしてビットマップを作成してからビットマップ上に描画する方が良いですか? 性能的には、どちらが優れていますか?
- ビットマップ上に透明なものを描画したい場合、どうすればよいでしょうか?
- ある透過ビットマップを別の透過ビットマップに重ねたい場合、どうすればよいですか?
リストが長くなって申し訳ありませんが、学習のために、両方のアプローチを検討したいと思います。
まだ誰も答えていないなんて信じられない!SOではまれな出来事です!
その質問は私にはまったく意味がありません。しかし、私はそれに刺します。キャンバスへの直接描画(ポリゴン、シェーディング、テキストなど)と、描画の複雑さに応じてビットマップをロードしてキャンバスにブリットすることについて質問している場合。図面がより複雑になると、それに応じて必要なCPU時間が増加します。ただし、ビットマップをキャンバスにブリットすることは、常にビットマップのサイズに比例する一定の時間になります。
「何か」が何であるかを知らずに、どうすればそれを行う方法をあなたに示すことができますか?#3の答えから#2を理解できるはずです。
仮定:
両方を左上隅からオーバーレイする必要があります。
private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(bmp1, new Matrix(), null);
canvas.drawBitmap(bmp2, new Matrix(), null);
return bmOverlay;
}
次のようなことができます。
public void putOverlay(Bitmap bitmap, Bitmap overlay) {
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(overlay, 0, 0, paint);
}
アイデアは非常に単純です。ビットマップをキャンバスに関連付けると、キャンバスの任意のメソッドを呼び出してビットマップ上に描画できます。
これは、透明度のあるビットマップで機能します。ビットマップにアルファ チャネルがある場合、ビットマップは透明になります。Bitmap.Configを見てください。おそらく ARGB_8888 を使用したいと思うでしょう。
重要:描画を実行するさまざまな方法については、このAndroid サンプルを参照してください。それはあなたを大いに助けます。
パフォーマンスの観点から (正確にはメモリの観点から)、ビットマップはネイティブ ビットマップをラップするだけなので、使用するのに最適なオブジェクトです。ImageView は View のサブクラスであり、BitmapDrawable は内部に Bitmap を保持しますが、他にも多くのものを保持します。しかし、これは過度の単純化です。正確な回答を得るために、パフォーマンス固有のシナリオを提案できます。
public static Bitmap overlayBitmapToCenter(Bitmap bitmap1, Bitmap bitmap2) {
int bitmap1Width = bitmap1.getWidth();
int bitmap1Height = bitmap1.getHeight();
int bitmap2Width = bitmap2.getWidth();
int bitmap2Height = bitmap2.getHeight();
float marginLeft = (float) (bitmap1Width * 0.5 - bitmap2Width * 0.5);
float marginTop = (float) (bitmap1Height * 0.5 - bitmap2Height * 0.5);
Bitmap overlayBitmap = Bitmap.createBitmap(bitmap1Width, bitmap1Height, bitmap1.getConfig());
Canvas canvas = new Canvas(overlayBitmap);
canvas.drawBitmap(bitmap1, new Matrix(), null);
canvas.drawBitmap(bitmap2, marginLeft, marginTop, null);
return overlayBitmap;
}
目的がビットマップを取得することである場合、これは非常に簡単です。
Canvas canvas = new Canvas();
canvas.setBitmap(image);
canvas.drawBitmap(image2, new Matrix(), null);
最終的に、image には image と image2 のオーバーラップが含まれます。
この例は、透明な画像を別の画像の上に重ねるのに間違いなく役立つと思います。これは、キャンバスに画像を描画し、ビットマップ画像を返すことで可能になります。
詳細を読むか、ここからデモをダウンロードしてください
private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){
Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
Canvas canvas = new Canvas(result);
canvas.drawBitmap(firstImage, 0f, 0f, null);
canvas.drawBitmap(secondImage, 10, 10, null);
return result;
}
ボタンクリックで上記の関数を呼び出し、以下に示すように2つの画像を関数に渡します
public void buttonMerge(View view) {
Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2);
Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage);
img.setImageBitmap(mergedImages);
}
2 つ以上の画像については、このリンクをたどることができます。Android で複数の画像をプログラムでマージする方法
public static Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage, ImageView secondImageView){
Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
Canvas canvas = new Canvas(result);
canvas.drawBitmap(firstImage, 0f, 0f, null);
canvas.drawBitmap(secondImage, secondImageView.getX(), secondImageView.getY(), null);
return result;
}