J'ai un tableau d'octets qui correspond à un "bitmap à échelle de gris" (un octet->un pixel), et je dois créer un fichier PNG pour cette image.
La méthode ci-dessous fonctionne, mais le png créé est ENORME, car le bitmap que j'utilise est un bitmap ARGB_8888, qui prend 4 octets par pixel au lieu de 1 octet.
Je n'ai pas réussi à le faire fonctionner avec d'autres Bitmap.Config différents de ARGB_8888. Peut-être qu'ALPHA_8 est ce dont j'ai besoin, mais je n'ai pas réussi à le faire fonctionner.
J'ai également essayé la méthode toGrayScale qui est incluse dans d'autres messages ( Convertir un bitmap en échelle de gris dans Android ), mais j'ai le même problème avec la taille.
public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width,
int height,File pngFile) throws IOException{
if (grayBytes.remaining()!=width*height){
Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null);
return false;
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// for each byte, I set it in three color channels.
int gray,color;
int x=0,y=0;
while(grayBytes.remaining()>0){
gray = grayBytes.get();
// integer may be negative as byte is signed. make them positive.
if (gray<0){gray+=256;}
// for each byte, I set it in three color channels.
color= Color.argb(-1, gray, gray, gray);
bitmap.setPixel(x, y, color);
x++;
if (x==width){
x=0;
y++;
}
}
FileOutputStream fos=null;
fos = new FileOutputStream(pngFile);
boolean result= bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
fos.close();
return result;
}
EDIT : Lien vers le fichier généré (il peut sembler absurde, mais il est juste créé avec des données aléatoires). http://www.tempfiles.net/download/201208/256402/huge_png.html
Toute aide sera grandement appréciée.