繁体   English   中英

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

[英]Convert/display byte array to bmp/jpeg image

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

我的问题是我想转换并显示jpg图像。 我没有原始图像,它在服务器上。 数据来自流(套接字),它以字节数组形式给出。 在该字节数组中,每4个字节代表一个像素的信息。 我设法得到RGB并将它们转换/保存为bmp图像,但是我找不到一个可行的解决方案来制作jpg。

另一方面,我有一个BMP :)我怎么能在JLabel或JPanel中显示它? 我也读过你的imageicon ImageIO等,但它对我不起作用。 我使用ScheduleExecutorSystem btw。 也许这就是问题?

这是编码器代码(版权所有(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);

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

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格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM