se-2018 / se-2018.github.io

GridWorld: See https://se-2018.github.io
2 stars 1 forks source link

关于Image转byte[]的问题 #24

Closed Azuki-Azusa closed 6 years ago

Azuki-Azusa commented 6 years ago

请问如何将Image的object转换成byte数组呢 曾尝试过以下的方法:

ImageIO.write(BufferedImage, format , ByteArrayOutputStream);

ImageIO.write的第二个参数format如果是"bmp"的话似乎无法生效,这个问题在生成文件的时候也遇到过。 如果换成其他文件格式的话,似乎得到的stream是有损的,转化出来的byte数组的长度也短了很多。 如果能解答的话十分感谢。

owtotwo commented 6 years ago

这位同学提Issue记得把能复现的所有信息提供上来噢。 首先是代码片段,用的哪张图,在什么系统环境下版本环境下运行的,报错信息,都说说吧,不然别人也帮不了你。 (正确的提issue方法)

owtotwo commented 6 years ago

我直接脑补型debug就是,你的bitmap图(BufferedImage)非RGB/BGR型的,也就是很可能是带透明度的ARGB型的BufferedImage.TYPE_INT_ARGB或许BufferedImage.TYPE_INT_ARGB_PRE,所以炸了(应该是ImageIO的bug,不确定,有人报了,暂时没人回复)。 所以你的解决方法是,选一张类型为RGB的图,或者Graphics2D重绘成可行类型的图再进行下一步操作。


或者 https://bugs.openjdk.java.net/browse/JDK-8147448?focusedCommentId=13916755&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13916755 直接看这个…人家没写32bit的(A-8 R-8 G-8 B-8)


你直接命令行 > file your.bmp 看看是不是 width x height x 32 ?

Azuki-Azusa commented 6 years ago
/**
 * Converts a given Image into a BufferedImage
 *
 * @param img The Image to be converted
 * @return The converted BufferedImage
 */
public static BufferedImage toBufferedImage(Image img)
{
    if (img instanceof BufferedImage)
    {
        return (BufferedImage) img;
    }

    // Create a buffered image with transparency
    BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);

    // Draw the image on to the buffered image
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();

    // Return the buffered image
    return bimage;
}

是这一句原因吗:

BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
LinJinghua commented 6 years ago

@c980129 BufferedImage.TYPE_INT_ARGB改为BufferedImage.TYPE_INT_RGB