用 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做组合工作。
只是一个想法。
我在 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做组合工作。 只是一个想法。