2012-02-08 3 views
1

Я загружаю jpeg-файл через BitmapFactory и пытаюсь сохранить его снова (позже я хочу сделать некоторые вычисления по данным пикселов, прежде чем снова его сохранить).Сохранение файлов JPEG в Android без потери информации о пикселях

Но если я пытаюсь сохранить его

FileOutputStream fos = new FileOutputStream(new File("/sdcard/test.jpg")); 
originalImage.compress(Bitmap.CompressFormat.JPEG, 100, fos); 

, то это не точно такой же результат, как и в оригинальной картине. Некоторые пиксели имеют разные значения цвета, и это не полезно для моих последующих вычислений.

Есть ли возможность безопасного его без потерь? Или проблема уже при загрузке изображения с

Bitmap originalImage = BitmapFactory.decodeFile("/sdcard/input.jpg"); 

несколько строк раньше?

ответ

5

Есть ли возможность безопасного его без потерь?

№ В формате JPEG используется сжатие с потерями. Она не дает никаких гарантий, формальных, даже если вы установите качество на 100.

Или проблема уже тогда, когда я загрузить изображение с [...]

Нет, растровые изображения .. карты битов, то есть они представляют собой точные биты данных изображения.

+0

Хорошо, но когда я пытаюсь использовать Java в обычном проекте, я бы сделал это с помощью 'BufferedImage originalImage = ImageIO.read (new File (" input.jpg ")); ImageIO.write (originalImage, "jpg", новый файл ("test.jpg")); 'и это будет работать без потерь. К сожалению, Android не поддерживает ImageIO, но нет ли способа сделать это так? – Steve

+1

Используйте сжатие без потерь, например PNG, если вы не хотите, чтобы значения пикселей изменялись. – BitBank

+0

К сожалению, нет гарантии, что * x = compressJpeg (распаковатьJpeg (x)) * выполняется для всех * x *. (Это может быть * очевидно, для некоторых значений * x * и некоторых jpeg-алгоритмов, но вы не должны полагаться на него.) Как говорит BitBank, используйте PNG (или BMP) для хранения изображений без потерь. – aioobe

Смежные вопросы