用 newCanvas.drawBitmap 组合两个位图

Combine two bitmaps with newCanvas.drawBitmap

我在 RelativeLayout 中有 2 个 ImageView,一个是背景,一个是用户可以缩放和移动并放置在背景之上的图像。接下来我想将它们组合起来,保留顶部图像的大小和位置。因此,当用户点击保存时,他们会得到一个新图像。这可能吗?我是 Android 中处理图像的新手。截至目前,我的代码将它们组合在一起,但图像 2 恢复到其原始大小并且始终以图像 1 为中心。

有什么关于从哪里开始的建议吗?我想我需要在缩放后将图像 2 另存为新位图。我不确定位置吗?

private Bitmap combineBitmap() throws FileNotFoundException {

    Drawable bm1New = adding_toFace.getDrawable();

    xx = adding_toFace.getTranslationX();
    yy = adding_toFace.getTranslationX();
    Bitmap newBitmap = null;

    int w;
    if (bm1.getWidth() >= bm2.getWidth()) {
        w = bm1.getWidth();
    } else {
        w = bm2.getWidth();
    }

    int h;
    if (bm1.getHeight() >= bm2.getHeight()) {
        h = bm1.getHeight();
    } else {
        h = bm2.getHeight();
    }


    Config config = bm1.getConfig();
    if (config == null) {
        config = Bitmap.Config.ARGB_8888;
    }



    newBitmap = Bitmap.createBitmap(w, h, config);
    Canvas newCanvas = new Canvas(newBitmap);

    newCanvas.drawBitmap(bm1, 0, 0, null); 

    Paint paint = new Paint();
    paint.setAlpha(128);

    //int y = adding_toFace.getTop();
    //int x = adding_toFace.getLeft();
    newCanvas.drawBitmap(bm2, 0, 0, paint);

    return newBitmap;
}// combineBitmap

基本上这个概念只是将视图转换为图像文件, 这样人脸图片可以在布局中作为背景src,副图可以在布局中,如果你不想在图片中显示按钮,请将按钮移出相关布局即可。

MainActivity.class

package com.example.atestapp;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {
    private RelativeLayout relativelayoutview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        relativelayoutview = (RelativeLayout) findViewById(R.id.relativelayoutview);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Bitmap bm = viewToBitmap(relativelayoutview);
                Log.i("MainActivity", "bm: "+bm);

                saveBitmap(bm);
            }

        });

    }

    public Bitmap viewToBitmap(View view) {
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        return bitmap;
    }


    public void saveBitmap(Bitmap bitmap){
        try {
            FileOutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory() + "/Download/file.png");
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
            output.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativelayoutview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="@drawable/smile"
     >

    <ImageView 
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/huh"
        android:layout_centerVertical="true"
        />    

    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"
        android:layout_centerInParent="true"
        android:layout_alignParentBottom="true"
        />



</RelativeLayout> 

在manifex中也添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

使用ImageView。 位图 1 作为背景,位图 2 作为 src; 在此视图上设置 TouchListener; 将您所做的任何操作放入矩阵(移动、缩放、旋转...) 通过 setImageMatrix() 应用于 imageView; 最后,通过imageView.getImageMatrix()得到Matrix做组合工作。 只是一个想法。