Android图片的合成

mainActivity如下:

package c.c;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
/**
 * 需求描述:
 * 从相册中选取两张图片合成一张图片
 *
 * 小结:
 * 1 依据图片的Uri加载图片
 * mBitmap1=BitmapFactory.decodeStream
 * (getContentResolver().openInputStream(photoFileUri));
 * 为什么使用getContentResolver呢?因为在相册本身是一个内容提供者
 * 2 注意构造方法:
 * Canvas canvas=new Canvas(bitmap);
 * 为什么要传入一个bitmap呢?
 * 我们画东西肯定是在画布上画.
 * 但是在这里传入一个bitmap
 * 即该bitmap是一个载体,相当于把bitmap作为了画布.
 * 当然本质上是:把东西画在了canvas里的bitmap上
 * 也可以这么想:
 * 我们最后不是要用mImageView.setImageBitmap(参数是一个Bitmap)来显示
 * 一张图片么?所以在构造Canvas的时候传入了一个Bitmap.然后把两张图片
 * 画到了该Bitmap上.最后该Bitmap就是两张照片的合成图.
 * 所以当然要把两张图片画到一个Bitmap上
 */
public class MainActivity extends Activity {
	private static int REQUESTCODE=0;
	private final static int PICK_FIRST_PHOTO=1;
	private final static int PICK_SECOND_PHOTO=2;
	private boolean isPickedFirstPhoto=false;
	private boolean isPickedSecondPhoto=false;
    private Button mButton1;
    private Button mButton2;
    private Bitmap mBitmap1;
    private Bitmap mBitmap2;
    private ImageView mImageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    private void init(){
    	mButton1=(Button) findViewById(R.id.button1);
    	mButton1.setOnClickListener(new ButtonOnClickListenerImpl());
    	mButton2=(Button) findViewById(R.id.button2);
    	mButton2.setOnClickListener(new ButtonOnClickListenerImpl());
    	mImageView=(ImageView) findViewById(R.id.imageView);
    }
    private class ButtonOnClickListenerImpl implements OnClickListener{
		public void onClick(View v) {
			if (v.getId()==R.id.button1) {
				REQUESTCODE=PICK_FIRST_PHOTO;
			} else {
				REQUESTCODE=PICK_SECOND_PHOTO;
			}
			Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
			startActivityForResult(intent, REQUESTCODE);
		}

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	super.onActivityResult(requestCode, resultCode, data);
    	if (resultCode==RESULT_OK) {
    		Uri photoFileUri=data.getData();
			if (requestCode==PICK_FIRST_PHOTO) {
				try {
					mBitmap1=BitmapFactory.decodeStream
					(getContentResolver().openInputStream(photoFileUri));
					isPickedFirstPhoto=true;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (requestCode==PICK_SECOND_PHOTO) {
				try {
					mBitmap2=BitmapFactory.decodeStream
					(getContentResolver().openInputStream(photoFileUri));
					isPickedSecondPhoto=true;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (isPickedFirstPhoto&&isPickedSecondPhoto) {
				Bitmap bitmap=
				Bitmap.createBitmap(mBitmap1.getWidth(), mBitmap1.getHeight(), mBitmap1.getConfig());
				Canvas canvas=new Canvas(bitmap);
				Paint paint=new Paint();
				canvas.drawBitmap(mBitmap1, 0, 0, paint);
				paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.MULTIPLY));
				canvas.drawBitmap(mBitmap2, 0, 0,paint);
				mImageView.setImageBitmap(bitmap);

			}

		}
    }
}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="选择第一张图片"
         />
    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/button1"
        android:text="选择第二张图片"
     />
    <ImageView
      android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_below="@id/button2"
     />

</RelativeLayout>

 

时间: 2024-12-20 14:29:47

Android图片的合成的相关文章

android 图片显示问题

问题描述 android 图片显示问题 我锁定了activity的横屏显示,但是我在这个activity中有拍照的功能,当我横屏拍照的时候,这张图片会自动竖屏显示,我希望它怎么拍的就怎么显示, 哪位大神可以帮我解答一下呀 解决方案 android图片显示的方向问题Android创建图片图库不显示问题关于android gridview不显示图片,文字等问题 解决方案二: 难道你横屏拍下的照片竖屏显示时视角跟横屏拍照时的视角不一样? 拍完把图片旋转下呢

android 图片快速选择切换 显示不全

问题描述 android 图片快速选择切换 显示不全 有哪位做过这种功能:listview中显示系统图库中照片,还有另外一个imageview显示当前选中的图片(要原图),当快速切换listview选中图片时,mageview有时显示不全. 解决方案 加载延迟,你可以修改下图片的大小 解决方案二: 类似Instagram中图片选择功能 解决方案三: 多谢,请教下Instagram的图片选择功能是什么原理,好流畅 解决方案四: 多谢,请教下Instagram的图片选择功能是什么原理,好流畅

设计简单的Android图片加载框架_Android

目前Android 发展至今优秀的图片加载框架太多,例如: Volley ,Picasso,Imageloader,Glide等等.但是作为程序猿,懂得其中的实现原理还是相当重要的,只有懂得才能更好地使用.于是乎,今天我就简单设计一个网络加载图片框架.主要就是熟悉图片的网络加载机制. 一般来说,一个优秀的 图片加载框架(ImageLoader) 应该具备如下功能: 图片压缩 内存缓存 磁盘缓存 图片的同步加载 图片的异步加载 网络拉取 那我们就从以上几个方面进行介绍: 1.图片压缩(有效的降低O

效果-android 图片大小的处理

问题描述 android 图片大小的处理 我通过SVN上传上去了一个UI界面,第二天,我update了后发现显示的图片缩小了,比以前更清晰了点,但是与这个UI相关的资源和我上传前的资源是一模一样的.然后我将我电脑上的图片(同一图片,但是没经过SVN)放上去后图片果然变大了,和我上传SVN前一样的效果.我想请教下这个图片的变化是怎么处理的?(肯定是别人处理了我上传的资源) 解决方案 不太懂 svn不会改变的把 不然怎么保存数据啊 解决方案二: 可能你通过网页访问的是预览图,预览图做了压缩平滑和尺寸

android 图片换位- android 图片滑动换位,左右两边图片与中间图片滑动换位

问题描述 android 图片滑动换位,左右两边图片与中间图片滑动换位 如图所示,左右两边图片与中间图片滑动换位,初始化的时候只有中间的"添加"图片,点击添加后动态的添加左右两边图片出来,有点着急,找不到好的解决方法,求大神指点 解决方案 参考:http://download.csdn.net/detail/zhoudiyao/7726779 解决方案二: 是不是动画效果 objectAnimator吧 焦点不会错乱

动画-关于android图片缩放的问题

问题描述 关于android图片缩放的问题 我有一张很大的图片,比如说它的分辨率为960*800(宽和高),而手机的分辨率为480*800(宽和高),刚开始的时候图片放在一个imageview中,它的scaleType为center,如果我想通过动画的形式把这个图片的scaleType设为fitcenter,动画效果要求:图片本身不动,慢慢从四周缩小到fitcenter的比例形式. 解决方案 自己做个View/ImageView,然后override onDraw.

android图片处理方法(不断收集中)

http://gundumw100.iteye.com/blog/849729 将一个图片切割成多个图片 有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量. import android.graphics.Bitmap; public class ImagePiece { public int

Android 图片移动一点就隐藏了

问题描述 Android 图片移动一点就隐藏了 一个图片移动代码,但是移动不是全屏幕的,上下移动一点就有部分隐藏了,求解.上图 解决方案 部分隐藏,是哪部分呢?是不是因为显示区域不足,移动后有部分超出了显示区域而没有显示出来,而不是你所谓的隐藏. 解决方案二: 这是布局文件,布局是全屏的 解决方案三: 1.你试试把layout_width和height设置成match_parent 2.你把src用background代替试试 解决方案四: 那你试试把布局不要设置成全屏,设置成wrap_cont

Android图片压缩(质量压缩和尺寸压缩)

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图.两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了.下面这个博客说的比较清晰: android图片压缩总结 总结来看,图片有三种存在形式:硬盘上时是fi