将字节数组转换/显示为 bmp/jpeg 图像

Posted

技术标签:

【中文标题】将字节数组转换/显示为 bmp/jpeg 图像【英文标题】:Convert/display byte array to bmp/jpeg image 【发布时间】:2013-07-17 07:28:46 【问题描述】:

首先,我问这个具体的问题,因为我已经阅读了很多关于这个主题的例子,但没有一个真正有帮助。

我的问题是我想转换并显示 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);

它只会使默认值消失。我忘了设置什么吗? 这是最快的方法吗?

【问题讨论】:

为什么不分享可以将其转换为 bmp 的代码,以便更清楚地了解您遗漏的地方?还有你想用 JLabel 或 JPanel 和那个 BMP 图像做什么。 如果ImageIO 对您不起作用,那么您实际上一定没有有效的位图 (BMP) 图像。数据从何而来?它是通过 HTTP 来的吗?如果是这样,标题可能会告诉您实际格式。 不,它是 TCP,可以从那里读取高宽信息,我在 BMP 中得到了不错的图像 @Peter Rader 对不起,彼得,我不关注 .. 你是什么意思? 【参考方案1】:

The ImageIcon class 只支持直接读取 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,但现在没关系了 :) 谢谢

以上是关于将字节数组转换/显示为 bmp/jpeg 图像的主要内容,如果未能解决你的问题,请参考以下文章

将base64字节数组转换为图像

如何将base64位的字节数组转换成图片并显示

在 WPF 中以高刷新率显示字节数组图像

将 PIL 图像转换为字节数组?

将图像控件转换为字节数组 Asp.Net

PIL:将字节数组转换为图像