将两个位图与newCanvas.drawBitmap结合使用

时间:2015-02-27 01:27:49

标签: android canvas bitmap imageview

我在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

2 个答案:

答案 0 :(得分:1)

基本上这个概念只是将视图转换为图像文件, 这样脸部图像可以在布局中进行背景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> 

在manifestx中添加权限

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

答案 1 :(得分:0)

使用ImageView。   位图1作为背景,bitmap2作为src;   此视图上的setTouchListener;   将您所做的任何动作放入矩阵(移动,缩放,旋转...)   通过setImageMatrix()应用于imageView;   最后,通过imageView.getImageMatrix()获取Matrix来完成组合工作。   只是一个想法。