您的位置:首页 > 移动开发 > Android开发

Android多媒体编程——图片的操作与处理

2015-10-26 15:31 369 查看

大图片加载

手机屏幕320*480,总像素:153600
图片宽高2400*3200,总像素7680000
手机的屏幕加载不了图片的像素,就会出现内存的溢出

处理大图片的方式

按照屏幕的宽高来缩放图片

图片缩放计算

* 2400 / 320 = 7 

* 3200 / 480 = 6

img = ((ImageView) findViewById(R.id.img_iv));
//只解析图片的宽高 Option类的常量设置
BitmapFactory.Options op = new BitmapFactory.Options();
op.inJustDecodeBounds = true;
/**
* 当设置options的常量inJustDecodeBounds为true的时候,解析器返回的Bitmap对象为空
* 只会解析到图片的信息
*/
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/dog.jpg",op);
//TODO 获取图片的宽高
int imageWidth = op.outWidth;
int imageHeight = op.outHeight;
//TODO 获取屏幕的宽高
Display display = getWindowManager().getDefaultDisplay();
int screenWidth;
int screenHight;
//判断SDK版本,使用不同的api
if(Build.VERSION.SDK_INT>8)
{
Point point = new Point();
display.getSize(point);
screenHight = point.y;
screenWidth = point.x;
}else{
screenWidth = display.getWidth();
screenHight = display.getHeight();
}
//设置缩放比例
int scale = 1;
//判断缩放比例,取大的
int scaleWidth = imageWidth/screenWidth;
int scaleHeight = imageHeight/screenHight;
if(scaleWidth>=scaleHeight&&scaleWidth>=1){
scale = scaleWidth;
}else if(scaleWidth<scaleHeight&&scaleHeight>=1)
{
scale = scaleHeight;
}
//设置图片设置参数的缩放比例
op.inSampleSize = scale;
//关闭只解析宽高
op.inJustDecodeBounds = false;
//解析图片
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/dog.jpg", op);
if (bitmap != null) {
img.setImageBitmap(bitmap);
} else {
Toast.makeText(MainActivity.this, "图片不存在", Toast.LENGTH_SHORT).show();
}


在内存中创建图片的副本

直接加载的bitmap对象是只读的,无法修改,要修改图片只能在内存中创建出一个一模一样的bitmap副本,然后修改副本,原图加载完成后就无效了。

//加载原图
Bitmap srcBm = BitmapFactory.decodeFile("sdcard/photo3.jpg");
iv_src.setImageBitmap(srcBm);

//创建与原图大小一致的空白bitmap
Bitmap copyBm = Bitmap.createBitmap(srcBm.getWidth(), srcBm.getHeight(), srcBm.getConfig());
//定义画笔
Paint paint = new Paint();
//把纸铺在画版上
Canvas canvas = new Canvas(copyBm);
//把srcBm的内容绘制在copyBm上
canvas.drawBitmap(srcBm, new Matrix(), paint);

iv_copy.setImageBitmap(copyBm);

对图片进行特效处理

首先定义一个矩阵对象

设置矩阵的时候需要,set是第一次生效,如果想用第二次生效的效果则需要设置post 

Matrix mt = new Matrix();


缩放效果
//x轴缩放1倍,y轴缩放0.5倍
mt.setScale(1, 0.5f);


旋转效果
//以copyBm.getWidth() / 2, copyBm.getHeight() / 2点为轴点,顺时旋转30度
mt.setRotate(30, copyBm.getWidth() / 2, copyBm.getHeight() / 2);


平移
//x轴坐标+10,y轴坐标+20
mt.setTranslate(10, 20);


镜面
//把X坐标都变成负数
mt.setScale(-1, 1);
//图片整体向右移
mt.postTranslate(copyBm.getWidth(), 0);


倒影
//把Y坐标都变成负数
mt.setScale(1, -1);
//图片整体向下移
mt.postTranslate(0, copyBm.getHeight());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: