У меня есть файл изображения на диске, и я изменяю размер файла и сохраняю его обратно на диск как новый файл изображения . Ради этого вопроса я не заношу их в память, чтобы отобразить на экране, только чтобы изменить их размер и повторно сохранить. Все это прекрасно работает. Однако на масштабированных изображениях есть артефакты, как показано здесь: 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 , но все они, похоже, обращались к рисованию и отображению растрового изображения, я просто хочу изменить его размер и сохранить обратно на диск без этой проблемы качества.
Большое спасибо