位图调整大小和旋转:线性噪声

时间:2011-02-11 18:41:08

标签: android image matrix resize rotation

我正在调整图像大小并使用Matrix旋转它:

Matrix mtx = new Matrix();
if(orientation>0) {
    mtx.postRotate(orientation);
    Log.d(TAG,"image rotated: "+orientation);
}
if(scale<1) {
    mtx.postScale(scale,scale);
    Log.d(TAG,"image scaled: "+scale);
}
bmp = Bitmap.createBitmap(bm_orig, 0, 0, width, height, mtx, true);
bm_orig.recycle();
bmp.compress(Bitmap.CompressFormat.JPEG,95,output);
bmp.recycle();

当拍摄bmp_orig时,使用 3.2 Mpx 相机,图像调整大小并旋转看起来正常。

但是当光源 4 Mpx或更大时,调整后的结果几乎没有明显的线性噪声

我不知道,为什么会出现这种噪音,以及如何将其删除。

任何想法? 可能是调整大小和旋转的另一种方法吗?

1 个答案:

答案 0 :(得分:0)

发现此问题与源和生成的图像大小有关。

解决它,在加载前检查图像尺寸,然后加载半尺寸图像,如果源图像尺寸大于结果尺寸的2倍。

BitmapFactory.Options options_to_get_size = new BitmapFactory.Options();
options_to_get_size.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options_to_get_size);
int load_scale = 1; // load 100% sized image
int width_tmp=options_to_get_size.outWidth
int height_tmp=options_to_get_size.outHeight;

while(width_tmp/2>maxW && height_tmp/2>maxH){
width_tmp/=2;//load half sized image
height_tmp/=2;
load_scale*=2;
}
Log.d(TAG,"load inSampleSize: "+ load_scale);

//Now load image with precalculated scale. scale must be power of 2 (1,2,4,8,16...)
BitmapFactory.Options option_to_load = new BitmapFactory.Options();
option_to_load.inSampleSize = load_scale;
((FileInputStream)input).getChannel().position(0); # reset input stream to read again
Bitmap bm_orig = BitmapFactory.decodeStream(input,null,option_to_load);

input.close();
//now you can resize and rotate image using matrix as stated in question