图片处理(缩放、压缩)

来源:互联网 发布:linux 查找字符串 编辑:程序博客网 时间:2024/06/05 11:07

项目中用到自定义相机,由于摄像头都是width > height,并且拍照完了以后的图片总是需要旋转90度以后才是自己想要的结果,问题就出来了因为拍照以后生成的图片分辨率太高,旋转的时候总是OutOfMemoryError。在网上搜索解决办法的时候有建议:“尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。”对于不能直接使用hdpi或mdpi等的问题,是否可以获取资源文件的io流以后再调用decodeStream函数传入io。

还有对内存的分配,可以参考:http://blog.csdn.net/huangbiao86/article/details/8072128

顺便记录一下图片的一些处理:

按质量压缩图片:

ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 80, baos);//质量压缩方法,压缩到80%        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片

按比例压缩图片:

BitmapFactory.Options newOpts = new BitmapFactory.Options();        //开始读入图片,此时把options.inJustDecodeBounds 设回true了          newOpts.inJustDecodeBounds = true;        Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空          newOpts.inJustDecodeBounds = false;        int w = newOpts.outWidth;        int h = newOpts.outHeight;        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为          float hh = 800f;//这里设置高度为800f          float ww = 480f;//这里设置宽度为480f          //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可          int be = 1;//be=1表示不缩放          if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放              be = (int) (newOpts.outWidth / ww);        } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放              be = (int) (newOpts.outHeight / hh);        }        if (be <= 0)            be = 1;        newOpts.inSampleSize = be;//设置缩放比例(采样率),这里其实图片缩放了2be(宽高都缩放了)        //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了          bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
X、Y方向上按比例缩放:

Matrix matrix = new Matrix();        matrix.setScale(0.5f, 0.5f); // x方向和y方向上分别缩放0.5        Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);



0 0
原创粉丝点击