2012-04-19 3 views
0

Я создаю приложение на Android, где мне нужно манипулировать файлами JPG. Я не получаю много информации заголовка для формата JPG, поэтому для этого я конвертирую его в Bitmap, манипулируя значениями пикселей в растровом изображении, а затем снова конвертирую его обратно в JPG.кодирование и декодирование изображений JPG в Android

В этой проблеме я столкнулся - после манипулирования только некоторыми пикселями растрового изображения и , преобразовывая его обратно в JPG, я не получаю тот же набор пикселей, что и раньше (для тех пикселей, которыми я не манипулировал). Я получаю то же изображение, что и оригинал в новом изображении. Но когда я проверяю новые значения пикселей изображения для декодирования, нетронутые пикселей отличаются ...

File imagefile = new File(filepath); 
FileInputStream fis = new FileInputStream(imagefile); 
Bitmap bi = BitmapFactory.decodeStream(fis); 
int intArray[]; 
bi=bi.copy(Bitmap.Config.ARGB_8888,true);  
intArray = new int[bi.getWidth()*bi.getHeight()]; 
bi.getPixels(intArray, 0, bi.getWidth(), 0, 0, bi.getWidth(), bi.getHeight()); 

int newArray[] = encodeImage(msgbytes,intArray,mbytes); // method where i am manipulating my pixel values 

// converting the bitmap data back to JPG file 
bi = Bitmap.createBitmap(newArray, bi.getWidth(), bi.getHeight(), Bitmap.Config.ARGB_8888); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] data = baos.toByteArray(); 

Bitmap bitmapimage = BitmapFactory.decodeByteArray(data, 0, data.length); 
String filepath = "/sdcard/image/new2.jpg"; 
File imagefile = new File(filepath); 
FileOutputStream fos = new FileOutputStream(imagefile); 
bitmapimage.compress(CompressFormat.JPEG, 100, fos); 

Помощь меня, если я ошибаюсь, где-то должен ли я использовать другой метод для управления значениями JPG пиксельные ...

ответ

3

JPEG - это формат изображения, который обычно основывается на lossy compression. Это означает, что некоторая информация, которая не важна для человеческого глаза, выбрасывается для дальнейшего сокращения размера файла. Попробуйте сохранить изображение в формате PNG (формат без потерь).

+0

Да, но мне нужно сохранить его в файлах JPG, так как большинство мобильных пользователей используют файлы изображений JPG .... нет ли способа сделать все мои кодировки в JPG n все еще в состоянии получить все данные? – Tani

+0

Зависит от того, что вы имеете в виду с _retrieve всех данных_. По умолчанию JPEG является форматом с потерями, и есть только несколько манипуляций (например, обрезка и поворот), которые можно выполнить без потери дополнительной информации с помощью JPEG. По крайней мере, если вы откроете и сохраните изображение с помощью методов, предоставляемых SDK, вы потеряете информацию. – Niels

0

Будьте осторожны с использованием

Bitmap bi = BitmapFactory.decodeStream(fis); 
bi = bi.copy(Bitmap.Config.ARGB_8888, true); 

В точке, где у вас есть первый bi вы, возможно, уже потеряли много информации, вместо того, чтобы попытаться использовать BitmapFactory.Options, чтобы заставить 8888 (который по умолчанию тоже):

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
options.inDither = false; 
Bitmap bi = BitmapFactory.decodeStream(fis, options); 

Если вы остаетесь с copy, вы все равно должны recycle() тот, который вы выбрасываете.