将字节数组转换/显示为BMP/JPEG图像

3
首先,我询问这个具体问题,是因为我已经阅读了许多有关此主题的示例,但没有一个真正帮助我解决问题。
我的问题是,我想转换和显示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,我在其中添加了一个默认的ImageIcon到JLabel中(一个jpg图像),它可以正常工作。 保存图像后,我尝试:

ImageIcon icon = new ImageIcon("path to file");
pictureLabel.setIcon(icon);

它只是让默认值消失了。我是否忘记设置某些内容?这是最快的方法吗?


为什么不分享你能够将其转换为bmp的代码片段,以便更清楚地了解你错过了什么?另外,你想用JLabel或JPanel和BMP图像做什么? - Sandiip Patil
如果ImageIO无法正常工作,则您可能实际上没有有效的位图(BMP)图像。数据来自哪里?它是通过HTTP传输的吗?如果是这样,头文件可能会告诉您实际格式。 - DaoWen
不,这是TCP协议,高度和宽度信息可以从那里读取,我正在得到一个不错的BMP图像。 - bajla
@Peter Rader 对不起 Peter,我不明白.. 你是什么意思? - bajla
1个回答

1

ImageIcon 仅直接支持读取 PNG、GIF 和 JPEG 格式。您需要使用 ImageIO 将位图读入通用的 Image 对象(这是 ImageIcon 支持的对象),然后将其传递给 ImageIcon。以下是我修改您的代码的方式:

File imgFile = new File("path to file");
Image image = javax.imageio.ImageIO.read(imgFile);
ImageIcon icon = new ImageIcon(image);
pictureLabel.setIcon(icon);

请注意,您也可以使用ImageIO将位图转换为JPEG格式。

是的,我在相关主题中看到了这个答案,结果发现我的代码跳过了这一步,因为ScheduleExecutorService的原因,但现在没问题了 :) 谢谢 - bajla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接