J'essaye d'envoyer un BufferedImage
sur le socket, je le fais en convertissant l'image en byte[]
et ensuite je l'envoie après l'avoir encodé en Base64. J'envoie plus de 2 BufferedImages, l'un d'eux est "full", l'autre est transparent à environ 50%. Le problème que j'ai, c'est que quand ils arrivent, la deuxième image est toujours visuellement transparente, mais quand j'obtiens le tableau de données via Raster, il a été changé. J'ai fait un petit code de test pour démontrer le problème;ByteArrayOutput/InputStream sur l'image transparente
BufferedImage levelBufferedOriginal = ...
BufferedImage backgroundBufferedOriginal = ...
byte[] levelDataOriginal = ((DataBufferByte) levelBufferedOriginal.getRaster().getDataBuffer()).getData();
byte[] backgroundDataOriginal = ((DataBufferByte) backgroundBufferedOriginal.getRaster().getDataBuffer()).getData();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] temp = null, temp2=null;
try {
ImageIO.write(levelBufferedOriginal, "png", baos);
baos.flush();
temp = baos.toByteArray();
baos.close();
baos=new ByteArrayOutputStream();
ImageIO.write(backgroundBufferedOriginal, "png", baos);
baos.flush();
temp2 = baos.toByteArray();
baos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
BufferedImage levelBufferedNew = null;
BufferedImage backgroundBufferedNew = null;
try {
levelBufferedNew = ImageIO.read(new ByteArrayInputStream(temp));
backgroundBufferedNew = ImageIO.read(new ByteArrayInputStream(temp2));
} catch (IOException e) {
e.printStackTrace();
}
byte[] levelDataNew = ((DataBufferByte) levelBufferedNew.getRaster().getDataBuffer()).getData();
byte[] backgroundDataNew = ((DataBufferByte) backgroundBufferedNew.getRaster().getDataBuffer()).getData();
System.out.println("LEVEL: " + Arrays.equals(levelDataOriginal, levelDataNew));
System.out.println("BACKGROUND: " + Arrays.equals(backgroundDataOriginal, backgroundDataNew));
Tout ce que je fais ici, est simplement le transformer BufferedImage
à byte[]
, puis de nouveau, et de comparer les données que je reçois de DataBufferByte
. La sortie est
NIVEAU: false
CONTEXTE: true
arrière-plan est l'image "complète", et le niveau est celui avec quelques pixels transparents.
Si l'idée générale est fausse, j'aimerais en entendre une autre, tout ce que je veux, c'est pouvoir recréer exactement 2 images tamponnées.
Les images sont-elles visuellement différentes? Comme vous le mentionnez, les images sont translucides. Il se peut que l'encodage/décodage PNG inverse les valeurs pour certains pixels transparents, sans affecter les visuels de l'image. Voir alpha prémultiplié vs non prémultiplié. – haraldK
Les images sont visuellement les mêmes. Le problème que je reçois, c'est quand je commence à éditer les données d'image de niveau (levelDataNew) à "-1" (pour définir un pixel transparent), il devient noir à la place, donc je ne vois pas l'arrière-plan. Alors qu'une modification de levelDataOriginal va définir le pixel transparent. – Limon
Que voulez-vous dire par "-1"? 0xFF? Un pixel complètement transparent est 0x0, tandis qu'un pixel complètement opaque devrait être 0xff. En outre, l'état prémultiplié est important, si vous essayez de "fondre" ce que vous avez déjà "disparu" (rendu transparent). – haraldK