web-dev-qa-db-ja.com

android)で2つのビットマップをマージします

2つのビットマップをマージしたいのですが、これが私のコードです

// Camera arg conversion to Bitmap
                    Bitmap cameraBitmap = BitmapFactory.decodeByteArray(arg0, 0,
                            arg0.length);
                    Bitmap back = Bitmap.createBitmap(cameraBitmap.getWidth(),
                        cameraBitmap.getHeight(), Bitmap.Config.ARGB_8888);
                    Canvas cam = new Canvas(back);
                    cam.drawBitmap(cameraBitmap, matrix, null);


                    // FrameLayout to Bitmap
                    FrameLayout mainLayout = (FrameLayout) findViewById(R.id.frame);
                    Bitmap foreground = Bitmap.createBitmap(mainLayout.getWidth(),
                            mainLayout.getHeight(), Bitmap.Config.ARGB_8888);
                    Canvas c = new Canvas(foreground);
                    mainLayout.draw(c);

                    Bitmap cs = null;
                    cs = Bitmap.createBitmap(foreground.getWidth(), cameraBitmap.getHeight(), Bitmap.Config.ARGB_8888); 

                    Canvas comboImage = new Canvas(cs); 
                    comboImage.drawBitmap(cameraBitmap, 0f, 0f, null); 
                    comboImage.drawBitmap(foreground, 0f, cameraBitmap.getHeight(), null); 

                    FileOutputStream fos = null;
                    try {
                        fos = new FileOutputStream(file);
                        if (fos != null) {
                            cs.compress(Bitmap.CompressFormat.PNG, 90, fos);
                            fos.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }   

カメラ画像は背景になり、前景が一番上の画像になります。 2つの画像をAndroid Canvasを使用 で組み合わせる)==から試しましたが、役に立ちませんでした。アイデアはありませんか。ありがとうございます。

12
Numair

あなたの例から、次の行を追加するのを忘れました:

 comboImage.drawBitmap(c, 0f, 0f, null); 
 comboImage.drawBitmap(s, 0f, c.getHeight(), null);

上記の例では、キャンバスに画像を描画していません。これが問題です。あなたのキャンバスはあなたのスケッチブックだと考えることができます。今のところ、あなたは何もペイントしていません、そしてあなたは私が色を見ることができない方法を自問します。

したがって、私のアドバイスとして、最初に2つのビットマップを作成してから、次のことを行います。

c.drawBitmap(cameraBitmap, top point, left point, null);
c.drawBitmap(foreground, top point, left point, null); 

次のコードのように、最初にビットマップからドローアブルオブジェクトを作成することによってこれを行うこともできます。

Drawable cameraBitmap = BitmapDrawable(cameraBitmap);
Drawable foreground= BitmapDrawable(foreground);

次に、描画可能なオブジェクトがある場合は、境界を設定できます。そのようにして、その画像を表示する場所を設定します。

cameraBitmap.setBounds(left, top, right, bottom);
foreground.setBounds(left, top, right, bottom);

そして最後にそれをキャンバスに描きます:

cameraBitmap.draw(canvas);
foreground.draw(canvas);

編集:

これは例です。これを使用して、実装を理解してください。

    Bitmap bitmap = null;
    try {

        bitmap = Bitmap.createBitmap(500, 500, Config.ARGB_8888);
        Canvas c = new Canvas(bitmap);
        Resources res = getResources();


        Bitmap bitmap1 = BitmapFactory.decodeResource(res, R.drawable.test1); //blue

        Bitmap bitmap2 = BitmapFactory.decodeResource(res, R.drawable.test2); //green
        Drawable drawable1 = new BitmapDrawable(bitmap1);
        Drawable drawable2 = new BitmapDrawable(bitmap2);


        drawable1.setBounds(100, 100, 400, 400);
        drawable2.setBounds(150, 150, 350, 350);
        drawable1.draw(c);
        drawable2.draw(c);


    } catch (Exception e) {
    }
    return bitmap;

これは私が上記のコードから得たものです:

enter image description here

30
Ofir A.

BitmapDrawable(Bitmap)は非推奨になっていることに注意してください。 Kinldyチェック this 代替案。

BitmapDrawable(Bitmap bitmap)このコンストラクターはAPIレベル4で非推奨になりました。BitmapDrawable(Resources, Bitmap)を使用して、ドローアブルがターゲット密度を正しく設定していることを確認してください。

0

1つが大きく、2つ目が小さい場合、2つのビットマップを垂直方向にマージします
この方法に従ってください

 public Bitmap finalcombieimage(Bitmap c, Bitmap s) {
    Bitmap cs = null;
    DisplayMetrics metrics = getBaseContext().getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas comboImage = new Canvas(cs);
    Rect dest1 = new Rect(0, 0, width, height); // left,top,right,bottom
    comboImage.drawBitmap(c, null, dest1, null);
    Rect dest2 = new Rect(0, height-400 / 2, width, height);
    comboImage.drawBitmap(s, null, dest2, null);
    return cs;
}

enter image description here

0
Najaf Ali

透かし画像のサイズを元の画像と同じサイズに変更します

Uri bmpUri1 = getLocalBitmapUri(ivImage);
Uri bmpUri2 = getLocalBitmapUri(watermark_imageview);

try {
    bm1 = BitmapFactory.decodeStream(
            getContentResolver().openInputStream(bmpUri1));
    bm2 = BitmapFactory.decodeStream(
            getContentResolver().openInputStream(bmpUri2));

    Bitmap bmOverlay = Bitmap.createBitmap(bm1.getWidth(), bm1.getHeight(), bm1.getConfig());
    bm2 = Bitmap.createScaledBitmap(bm2, bm1.getWidth(), bm1.getHeight(),
            true);

    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bm1, 0,0, null);
    canvas.drawBitmap(bm2, 0,0, null);
    watermarkimage.setVisibility(View.GONE);
    im =new ImageView(ImageClick.this);
    im.setImageBitmap(bmOverlay);
    bmpUri = getLocalBitmapUri(im);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

private Uri getLocalBitmapUri(ImageView imageView) {
    Drawable drawable = imageView.getDrawable();
    Bitmap bmp = null;
    if (drawable instanceof BitmapDrawable){
        bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    } else {
        return null;
    }
    // Store image to default external storage directory
    Uri bmpUri = null;
    try {
        File file =  new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png");
        file.getParentFile().mkdirs();
        FileOutputStream out = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
        out.close();
        bmpUri = Uri.fromFile(file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bmpUri;
}
0
ashish