首先,我问了这个具体的问题,因为我已经阅读了很多关于这个主题的例子,但没有一个真正有帮助。
我的问题是我想转换并显示 jpg 图像。我没有原始图像,它在服务器上。数据来自流(套接字),并以字节数组的形式给出。在这个字节数组中,每 4 个字节代表一个像素的信息。我设法获得了 RGB 并将它们转换/保存为 bmp 图像,但是我找不到制作 jpg 的有效解决方案。
另一方面,我有一个 BMP :) 我如何在 JLabel 或 JPanel 中显示它?我还阅读了关于 imageicon ImageIO 等,但它对我不起作用。我使用 ScheduleExecutorSystem 顺便说一句。也许这就是问题所在?
这是编码器代码(版权所有(C)2013 Philipp C. Heckel):
public static void encodeToBitmap(byte[] srcBytes, OutputStream destStream)
throws IOException {
int imageWidth = 1024;
int imageHeight = 1080;
int imageBytes = imageWidth * imageHeight * 3;
int filesizeBytes = imageBytes + BMP_SIZE_HEADER;
byte[] header = BMP_HEADER.clone(); // Clone bitmap header template, and
// overwrite with fields
header = writeIntLE(header, BMP_OFFSET_FILESIZE_BYTES, filesizeBytes);
header = writeIntLE(header, BMP_OFFSET_IMAGE_WIDTH, imageWidth);
header = writeIntLE(header, BMP_OFFSET_IMAGE_HEIGHT, imageHeight);
header = writeIntLE(header, BMP_OFFSET_IMAGE_DATA_BYTES, 0);
header = writeIntLE(header, BMP_OFFSET_PAYLOAD_LENGTH,
(int) srcBytes.length);
// WRITE TO STREAM
// Add payload
destStream.write(header, 0, header.length);
for (int offset = imageBytes - imageWidth * 3; offset >= 0; offset -= imageWidth * 3) {
for (int i = 0; i < (imageWidth) * 3; i++) {
destStream.write(srcBytes[offset + i]);
}
}
destStream.close();
}
还有代码,我如何使用它:
BitmapEncoder.encodeToBitmap(RGBvalues, new FileOutputStream("path to file"));
RGBvalues - bytes of 3, with the RGB values (i don't say!! :P )
图像宽度和高度已修复用于调试目的
我有一个 JPanel 和一个 JLabel,我在 JLabel(一个 jpg 图像)中添加了一个默认的 ImageIcon,它工作正常。保存图像后,我尝试:
ImageIcon icon = new ImageIcon("path to file");
pictureLabel.setIcon(icon);
它只会使默认值消失。我忘了设置什么吗?这是最快的方法吗?