У меня есть файл образа на диске, и я изменяю размер файла и сохраняю его обратно на диск в качестве нового файла изображения. Ради этого вопроса я не привожу их в память, чтобы отображать их на экране, только чтобы изменить их размер и сохранить их. Все это работает отлично. Однако масштабированные изображения имеют на них артефакты, как показано здесь: 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 и, как упоминалось в очень первый связанный пост выше. Это ничего не изменило. Кроме того, в первом посте, которое я связал, Ромен Гай сказал:
Вместо изменения размера во время рисования (что будет очень дорогостоящим), попробуйте изменить размер в растровом изображении вне экрана и убедитесь, что битмап 32 бита (ARGB888).
Однако я не знаю, как убедиться, что битмап остается 32 бита в течение всего процесса.
Я также прочитал пару других статей, таких как http://android.nakatome.net/2010/04/bitmap-basics.html, но все они, казалось, обращались к чертежу и отображению растрового изображения, Я просто хочу изменить его размер и сохранить его обратно на диск без этой проблемы с качеством.
Спасибо большое