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());
相关文章推荐
- 浅谈RecyclerView
- android studio 导入工程问题总结
- android studio使用笔记
- android 、java中 系统日期时间的获取
- Android创建桌面快捷图标
- 监听后台Service是否被Kill并重新启动Service
- Android 横竖屏处理
- Android编程实现小说阅读器滑动效果的方法
- Android 绘制虚线
- LeakCanary-Android内存泄露检测
- Android Studio Gradle基础
- android 动画
- 【Android学习笔记】 菜单Menu
- Android编程中TextView宽度过大导致Drawable无法居中问题解决方法
- android studio 断点调试
- android源码 键盘消息处理机制
- Google Breakpad 用VS编译windows和android平台的库文件
- android ImageView scaleType属性
- android 扇形菜单
- android学习——popupWindow 在指定位置上的显示