2012-04-19 4 views
0

Je crée une application sur Android où j'ai besoin de manipuler mes fichiers JPG. Je ne reçois pas beaucoup d'informations d'en-tête pour le format JPG, donc pour cela je le convertis en Bitmap, manipulé les valeurs de pixels dans l'image bitmap, puis à nouveau le convertir en JPG.encodage et décodage d'images JPG sous Android

Ici, le problème auquel je fais face est qu'après avoir manipulé seulement quelques pixels de bitmap et en le convertissant en JPG, je n'ai pas le même ensemble de pixels que précédemment (pour les pixels que je n'ai pas manipulés). Je reçois la même image que l'original dans la nouvelle image. Mais quand je vérifie les nouvelles valeurs de pixels d'image pour le décodage, les pixels intacts sont différents ...

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); 

Aidez-moi si je me trompe quelque part ou si je devrais utiliser une autre méthode pour manipuler les valeurs de pixels JPG ...

Répondre

3

JPEG est un format d'image généralement basé sur lossy compression. Cela signifie que certaines informations qui ne sont pas importantes pour l'œil humain sont jetées pour réduire davantage la taille du fichier. Essayez de sauvegarder votre image au format PNG (un format sans perte).

+0

ouais mais je dois l'enregistrer dans des fichiers JPG comme la plupart des utilisateurs mobiles utilisent des fichiers image JPG .... est-il impossible que je peux faire tout mon codage en JPG n être toujours capable de récupérer toutes les données? – Tani

+0

Dépend de ce que vous entendez par _retrieve toutes les données_. Par défaut, le format JPEG est un format avec perte et il n'y a que quelques manipulations (par exemple, recadrage et rotation) qui peuvent être effectuées sans perdre plus d'informations avec un fichier JPEG. Au moins si vous ouvrez et enregistrez l'image avec les méthodes fournies par le SDK, vous perdrez des informations. – Niels

0

Soyez prudent avec l'utilisation

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

Au point où vous avez la première bi vous avez déjà perdu beaucoup d'informations, au lieu essayer d'utiliser BitmapFactory.Options pour forcer 8888 (ce qui est la valeur par défaut trop):

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

Si vous restez avec copy vous devriez toujours recycle() celui que vous jetez.

Questions connexes