Изменение размера и вращение растрового изображения: линейный шум - PullRequest
1 голос
/ 11 февраля 2011

Я изменяю размер изображения и поворачиваю его, используя матрицу:

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 мегапикселя или больше , результат после изменения размера имеет едва заметный линейный шум

Я не знаю, почему появляется этот шум, и какудали его.

Есть идеи ?Может быть еще один способ изменить размер и повернуть?

1 Ответ

0 голосов
/ 17 марта 2011

Обнаружено, что эта проблема связана с исходным и результирующим размером изображения.

Решено, когда проверяете размер изображения перед его загрузкой, а затем загружаете половинное изображение, если размер исходного изображения более чем в 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
...