大图片加载
- 手机屏幕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版本,使用不同的apiif(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());
本文探讨了手机屏幕尺寸限制下如何有效加载大图片,包括图片缩放、内存管理及图片特效处理方法。
9万+

被折叠的 条评论
为什么被折叠?



