`

android多媒体学习笔记三___图像合成

阅读更多

/**
* 图像合成
*
* @time 下午06:21:22
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class ChosePictureCompositeActivity extends Activity implements OnClickListener {
public static final int PICKED_ONE = 0;
public static final int PICKED_TWO = 1;


private Button btn_choose_picture1;
private Button btn_choose_picture2;
private ImageView img_choose_picture;


private Bitmap bitmap1, bitmap2;
private Options bmpOptions;
private Canvas canvas;
private Paint paint;
private boolean onePicked = false;
private boolean twoPicked = false;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chose_picture_composite);
findView();


}


private void findView() {
btn_choose_picture1 = (Button) this.findViewById(R.id.btn_choose_picture_composite1);
btn_choose_picture1.setOnClickListener(this);
btn_choose_picture2 = (Button) this.findViewById(R.id.btn_choose_picture_composite2);
btn_choose_picture2.setOnClickListener(this);


img_choose_picture = (ImageView) this.findViewById(R.id.img_choose_picture_composite);
}


@Override
public void onClick(View v) {
int witch = -1;
if (v == btn_choose_picture1) {
witch = PICKED_ONE;
} else if (v == btn_choose_picture2) {
witch = PICKED_TWO;
}
Intent intent = new Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, witch);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);


if (resultCode == RESULT_OK) {
Uri imageFileUri = data.getData();


if (requestCode == PICKED_ONE) {
bitmap1 = loadBitmap(imageFileUri);
onePicked = true;
} else if (requestCode == PICKED_TWO) {
bitmap2 = loadBitmap(imageFileUri);
twoPicked = true;
}


if (onePicked && twoPicked) {
Log.i("tag", "=====choose is over!");
Bitmap drawingBitmap = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1.getConfig());
canvas = new Canvas(drawingBitmap);
paint = new Paint();
canvas.drawBitmap(bitmap1, 0, 0, paint);


// 图像重叠的绘制规则 PorterDuffXfermode
// 常量:
// SRC 只绘制原图像:


// DST 只绘制目标图像:
// 另外和四个规则,在一幅图像上放置另一幅图像,如何合成
// LIGHT: 获得每个位置上两幅图像中最亮的像素并显示
// DARKEN:最暗的像素并显示
// MULTIPLY:将第个位置的像素相乘,除以255,创建一个新像素显示
// SCREEN: 反转每个颜色,执行如(MULTIPLY)常量的操作
paint.setXfermode(new PorterDuffXfermode(Mode.SCREEN));
canvas.drawBitmap(bitmap2, 0, 0, paint);


img_choose_picture.setImageBitmap(drawingBitmap);
}
}


}


/**
* 加载位图图像
*/
private Bitmap loadBitmap(Uri imageFileUri) {


// 取得屏幕大小
Display display = getWindowManager().getDefaultDisplay();
int dw = display.getWidth();
int dh = display.getHeight();
// 期望是ARGB_4444
Bitmap bitmap = Bitmap.createBitmap((int) dw, (int) dh, Bitmap.Config.ARGB_4444);


try {
// 加载图像的尺寸而不是图像本身
bmpOptions = new BitmapFactory.Options();
// 如果为true,只须返回图像的范围,不须尝试解码图像本身
bmpOptions.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpOptions);


int hRatio = (int) Math.ceil(bmpOptions.outHeight / (float) dh);
int wRatio = (int) Math.ceil(bmpOptions.outWidth / (float) dw);


Log.i("tag", "hRatio" + hRatio);
Log.i("tag", "wRatio" + wRatio);
// 如果两个比率都大于1
// 那么图像的一条边将大小屏幕
if (hRatio > 1 && wRatio > 1) {
if (hRatio > wRatio) {
Log.i("tag", "hRatio" + hRatio);
// 若高度比率更大,则根据它缩放
bmpOptions.inSampleSize = hRatio;
} else {
Log.i("tag", "wRatio" + wRatio);
// 反之则根据宽度缩放
bmpOptions.inSampleSize = wRatio;
}
}
// 对图像进行解码
bmpOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, bmpOptions);


} catch (FileNotFoundException e) {
e.printStackTrace();
}
return bitmap;

}

}

分享到:
评论

相关推荐

    Android学习笔记(十)——实现新闻列表

    Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) Android学习笔记(四)Android 中Activity页面的跳转及传值 Android学习笔记(五)——Toast提示、Dialog对话框、Menu菜单 ...

    黑马66期android学习笔记16_按钮点击事件

    在Android开发中,按钮点击事件是用户与应用交互的关键部分,它使得用户可以通过点击按钮来触发特定的功能或...在黑马66期的Android学习笔记中,你将深入学习到这些概念,并通过实践进一步提升你的Android开发技能。

    Android开发学习笔记

    ### Android开发学习笔记 #### Button按钮的实现与交互 在Android开发中,`Button`控件是最常用的用户界面元素之一,用于触发特定的操作或事件。本文档将详细讲解如何创建并自定义一个简单的按钮,并设置点击事件...

    u-blox_Android_GNSS_driver_v2.3.zip_Android_GNSS_Driver_gnss and

    2. **应用笔记**:阐述了如何在实际应用中集成和使用u-blox Android GNSS驱动,包含配置参数说明、集成步骤和常见问题解答,对开发者来说极具价值。 四、子文件"gps" 此压缩包中还包含一个名为"gps"的子文件,可能...

    第一行代码 android学习笔记 完整版

    "Android学习笔记" Android学习笔记是Android开发者的必读书籍,书中涵盖了Android系统架构、Activity、Intent、资源管理等多方面的知识。本笔记对应的学习资源《第一行代码》是Android开发者的入门必读书籍,书中...

    黑马66期android学习笔记19_线性布局的特性

    在黑马66期的Android学习笔记中,重点讲解了线性布局的特性及其在实际应用中的运用。下面将详细阐述线性布局的相关知识点。 一、线性布局介绍 线性布局按照垂直或水平方向排列其子视图(Views),这些子视图会依次...

    网络技术学习笔记四__IP地址.docx

    接《网络技术学习笔记三__小秘加联络员的联系方式TCP+IP》,互联的局域网太多了,有大有小,怎么管理?

    Android_学习笔记

    ### Android学习笔记——从HelloWorld开始 #### 一、Google的Android SDK介绍 自从Google发布了Android SDK以来,这款开源移动操作系统迅速吸引了众多开发者的关注。Android SDK为开发者提供了丰富的工具和API,...

    Android_note.rar_ANDROID Note_Android_note_DEMO_androidnote

    【Android_note.rar】是一个压缩包,包含了名为"Android学习笔记"的文件,这是一份关于Android开发的学习资源,特别针对Android Note和Android_note_DEMO,也就是AndroidNote项目的一个示例。这个压缩包对于那些刚刚...

    Android开发学习笔记(整理)

    Android开发学习笔记(整理),整理论坛android学习笔记,较完整的讲解了android的内容。包括:view、activity、service、intent、广播机制、http连接、数据sqllite存储、后台线程、各种layout、偏好、本地文件操作、...

    eclipse插件开发学习笔记PDF_01

    《Eclipse插件开发学习笔记》PDF 高清版

    学习笔记5_逐层可视化图像特征-薛开宇1

    【学习笔记5_逐层可视化图像特征-薛开宇1】这篇笔记主要讲解了如何在深度学习框架Caffe中逐层可视化图像特征。这是一项重要的技能,有助于理解卷积神经网络(CNN)的工作原理和特征提取的过程。 1. **开始IPython ...

    JavaScript_数据结构_算法_学习笔记仓库_1741867528.zip

    在给定的文件中,“JavaScript_数据结构_算法_学习笔记仓库_1741867528.zip”这一标题指出了文件的性质和内容范围,即这是一份关于JavaScript编程语言中数据结构和算法学习的笔记仓库。其中的数据结构涵盖了如数组、...

    Android_学习笔记.zip

    在Android学习过程中,笔记是积累知识的重要方式。这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 ...

    Android Studio 学习笔记-新手入门-(1)第一个案例

    这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的基本操作。 首先,让我们了解一下Android Studio的核心功能。它基于IntelliJ IDEA,具备代码自动补全、重构、调试等强大的开发特性。...

    数据结构_Android_伪代码_学习笔记_1741870241.zip

    整体来说,这份学习笔记应该是一个结合了数据结构理论知识和Android开发实践的综合材料,既适用于数据结构的基础学习,又对提升Android应用开发水平有所帮助。通过阅读这份笔记,学习者可以加深对数据结构概念的理解...

    android入门学习笔记

    ### Android入门学习笔记知识点梳理 #### 第四讲:Android应用中的资源管理与界面布局 **1. 显示“Hello World”的方法** - **资源管理**:在Android开发中,资源通常存储在`res`目录下,包括图片、布局文件、...

    SPSS学习笔记之_重复测量的多因素方差分析报告.doc

    SPSS学习笔记之_重复测量的多因素方差分析报告.doc

    SDK编程笔记_—_计时器篇

    SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_...

    Android+学习笔记

    ### Android学习笔记知识点详解 #### 一、简介与背景 Android作为全球最受欢迎的移动操作系统之一,自2007年谷歌发布以来,迅速占领市场并持续引领移动技术的发展。随着移动互联网的兴起和发展,Android应用开发...

Global site tag (gtag.js) - Google Analytics