Я пытаюсь отправить BufferedImage
поверх сокета, я делаю это, преобразовывая изображение в byte[]
, а затем отправляю его после кодирования в Base64. Я отправляю более 2 BufferedImages, один из них «полный», другой - прозрачный на 50%. Проблема, с которой я столкнулась, заключается в том, что когда они приходят, второе изображение все еще визуально прозрачно, но когда я получаю массив данных через Raster, он был изменен.ByteArrayOutput/InputStream на прозрачном изображении
Я сделал небольшой тестовый код, чтобы продемонстрировать проблему;
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));
Все, что я здесь делать, просто преобразование BufferedImage
в byte[]
, а затем обратно, и сравнить данные, которые я получаю от DataBufferByte
. Выход
УРОВЕНЬ: ложные
ПРЕДПОСЫЛКИ: истинная
Фон «полный» образ, и уровень является тот, с некоторыми прозрачными пикселями.
Если общая идея неправильная, я хотел бы услышать другую, все, что я хочу, - это точно воссоздать 2 bufferedImages.
Изображения визуально отличаются? Как вы говорите, изображения полупрозрачны. Возможно, что конвертирование PNG-кодирования/декодирования изменяет значения для некоторых прозрачных пикселей, не затрагивая визуальные изображения. См. Премультипликацию альфы против не-преувеличенной. – haraldK
Изображения визуально одинаковы. Проблема, которую я получаю, - это когда я начинаю редактировать данные уровня изображения (levelDataNew) до «-1» (чтобы установить прозрачный пиксель), вместо этого он становится черным, поэтому я не вижу фона позади него. В то время как редактирование уровняDataOriginal будет устанавливать пиксель прозрачным. – Limon
Что вы подразумеваете под "-1"? 0xFF? Полностью прозрачный пиксель равен 0x0, а полностью непрозрачный - 0xff. Кроме того, премультиплексовое состояние важно, если вы пытаетесь «угасать» то, что у вас уже «исчезло» (сделано прозрачным). – haraldK