Проблемы с качеством при изменении размера изображения во время выполнения

У меня есть файл изображения на диске, и я изменяю размер файла и сохраняю его обратно на диск как новый файл изображения . Ради этого вопроса я не заношу их в память, чтобы отобразить на экране, только чтобы изменить их размер и повторно сохранить. Все это прекрасно работает. Однако на масштабированных изображениях есть артефакты, как показано здесь: android: качество изображений изменено во время выполнения

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

Я использую код, похожий на этот Странная проблема нехватки памяти при загрузке изображения в объект Bitmap для декодирования растрового изображения в память:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageFilePathString, options);

int srcWidth = options.outWidth;
int srcHeight = options.outHeight;
int scale = 1;

while(srcWidth / 2 > desiredWidth){
   srcWidth /= 2;
   srcHeight /= 2;
   scale *= 2;
}

options.inJustDecodeBounds = false;
options.inDither = false;
options.inSampleSize = scale;
Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(imageFilePathString, options);

Затем я выполняю фактическое масштабирование с помощью:

Bitmap scaledBitmap = Bitmap.createScaledBitmap(sampledSrcBitmap, desiredWidth, desiredHeight, false);

Наконец, новое изображение с измененным размером сохраняется на диск с помощью:

FileOutputStream out = new FileOutputStream(newFilePathString);
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

Затем, как я уже упоминал, если я сниму этот файл с диска и посмотрю на него, у него будет проблема с качеством, указанная выше, и он будет выглядеть ужасно. Если я пропущу createScaledBitmap и просто сохраню sampledSrcBitmap обратно на диск, проблем не будет, похоже, это произойдет только в том случае, если размер изменится.

Я пробовал, как вы можете видеть в коде, установив inDither значение false, как упомянуто здесь http://groups.google.com/group/android-developers/browse_thread/thread/8b1abdbe881f9f71 и как упоминалось в самом первом связанном сообщении выше. Это ничего не изменило. Также, (что будет очень дорого), попробуйте изменить размер внеэкранного растрового изображения и убедитесь, что Bitmap - 32 бита (ARGB888).

Однако я понятия не имею, как сделать так, чтобы Bitmap оставался 32-битным на протяжении всего процесса.

Я также прочитал пару других статей, таких как эта http: // android .nakatome.net / 2010/04 / bitmap-basics.html , но все они, похоже, обращались к рисованию и отображению растрового изображения, я просто хочу изменить его размер и сохранить обратно на диск без этой проблемы качества.

Большое спасибо

28
задан Community 23 May 2017 в 12:34
поделиться