正篇
首先,我们看看根据坐标系的做法:
// 获得图片的宽高 int width = bm.getWidth(); int height = bm.getHeight(); // 设置想要的大小 int newWidth = 640; int newHeight = 480; // 计算缩放比 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height,matrix,true);
还有非常重要的质量压缩方法:
Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.test); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int option = 100; bm.compress(Bitmap.CompressFormat.JPEG, option, bos); byte[] bytes = bos.toByteArray(); srcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
其中option在0-100之间,越小代表压缩率越高,质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,所以bitmap所占内存大小是不会变的,一般头像可以用这个方法,不过质量压缩对png格式这种图片格式没有作用,因为png是无损压缩的。
接着我们看一下采样率压缩:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 5; srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
采样率压缩是通过缩放bitamp的尺寸,改变inSampleSize参数,比如当inSampleSize为5时,宽高会为原来的1/5,所以内存也会变成原来的1/25. 此外,还有RGB_565压缩:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
通过压缩像素占用的内存来达到压缩的效果,没有用过,暂时不知道是什么效果,当然还可以指定大小压缩:
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test); srcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true); bm = null;
同样没用过,不过最后应该将原来的bitmap释放掉,不然容易占空间,应该就是指定宽高的感觉。
总结
虽然最近需要用这方面知识,但还是掌握的不牢靠,还需要多加练习测试代码效果,不然很快就会忘却的。