小编典典

从字节数组创建8位图像

java

通过这种方式获得字节数组-

BufferedImage image = new Robot().createScreenCapture(new Rectangle(screenDimension));
byte[] array = ((DataBufferByte)getGraycaleImage(image).getRaster().getDataBuffer()).getData();
//  Method getGraycaleImage returns a grayscaled BufferedImage, it works fine

现在我如何从字节数组重建此灰度图像?

我对ARGB,RGB或灰度图像了解不多。我试过了-

private Image getGrayscaleImageFromArray(byte[] pixels, int width, int height)
{
    int[] pixels2=getIntArrayFromByteArray(pixels);
    MemoryImageSource mis = new MemoryImageSource(width, height, pixels2, 0, width);
    Toolkit tk = Toolkit.getDefaultToolkit();
    return tk.createImage(mis);
}

private int[] getIntArrayFromByteArray(byte[] pixelsByte)
{
    int[] pixelsInt=new int[pixelsByte.length];
    int i;
    for(i=0;i<pixelsByte.length;i++)
        pixelsInt[i]=pixelsByte[i]<<24 | pixelsByte[i]<<16
| pixelsByte[i]<<8 | pixelsByte[i];  // I think this line creates the problem
    return pixelsInt;
}

当我绘制此图像时,它不是黑白的,而是橙色和灰色的东西。


阅读 228

收藏
2020-11-26

共1个答案

小编典典

如果我向您解释如何从ARGB / RGB 2灰度转换,希望对您有所帮助,因为它有太多未知的函数和类:P

ARGB为32位/像素,因此每个通道为8位。Alpha通道是不透明度,因此与透明度相反,因此0是透明的。

RGB是24位/像素。要从ARGB转换为RGB,您必须关闭Alpha通道。

要从RGB转换为灰度,您必须使用以下公式:

0.2989 * R + 0.5870 * G + 0.1140 * B

所以你必须弄清楚哪个字节属于哪个通道;)

2020-11-26