2009-07-24 8 views
2

Comment une image 32bpp (ARGB) pourrait-elle être convertie en une image 16bpp (ARGB) en utilisant les bibliothèques Java? Pour ma curiosité, au niveau du pixel, que fait cette conversion? Si j'ai une valeur int qui contient la valeur d'un pixel (avec tous les canaux), comment cet entier serait-il différent après la conversion?Conversion d'une image 32bpp en une image 16bpp en Java

Répondre

3

Une valeur AARRGGBB 32 bits converti en une valeur ARVB 16 bits serait quelque chose comme ceci:

int argb = ((aarrggbb & 0x000000F0) >> 4) 
     | ((aarrggbb & 0x0000F000) >> 8) 
     | ((aarrggbb & 0x00F00000) >> 12) 
     | ((aarrggbb & 0xF0000000) >> 16); 

Il colle tout dans les 16 bits inférieurs et laisse les 16 bits supérieurs comme 0.

Pour chaque canal, vous perdez les 4 bits les plus bas de l'info couleur, les plus hauts étant un peu plus importants. Les couleurs seraient quantifiées à la valeur équivalente à 4 bits la plus proche, ce qui se traduirait par un effet de bande de couleur visuellement désagréable à travers l'image. Incidemment, la couleur 16 bits n'inclut normalement pas de composante alpha. Normalement (mais pas toujours) il se décompose en 5 bits pour le rouge, 6 bits pour le vert (puisque nos yeux sont plus sensibles aux couleurs vert/bleu) et 5 bits pour le bleu. Cette conversion perdrait seulement 2 ou 3 bits d'information sur chaque canal au lieu de 4, et supposerait que le pixel source ne contenait pas d'alpha.

+0

Merci pour l'explication détaillée! – Geo

-1

Lisez l'image et enregistrez-la dans le format dont vous avez besoin. De http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html

// Create an image to save 
RenderedImage rendImage = myCreateImage(); 

// Write generated image to a file 
try { 
    // Save as PNG 
    File file = new File("newimage.png"); 
    ImageIO.write(rendImage, "png", file); 

    // Save as JPEG 
    file = new File("newimage.jpg"); 
    ImageIO.write(rendImage, "jpg", file); 
} catch (IOException e) { 
} 

Voir la sortie de javax.imageio.ImageIO.getWriterFormatNames() pour localiser le format dont vous avez besoin.

La représentation interne de chaque pixel ne change pas (sauf pour la perte de représentation) lors de l'utilisation de 16 bpp, mais les octets stockés sur le disque seront.

+0

Comment est-ce que sauvegarder une image en png ou jpeg m'aide? – Geo

+0

Il est logique de parler de 16 bpp sur les fichiers image. Java utilise des images non compressées en mémoire. Si la réponse n'a pas de sens, vous pouvez reformuler la question. –