java - 从字节数组创建 8 位图像

标签 java image-processing rgb grayscale argb

字节数组是这样获取的-

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;
}

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

最佳答案

您必须指定与灰度图像对应的正确ColorSpace

这是一个示例,可以在 http://technojeeves.com/joomla/index.php/free/89-create-grayscale-image-on-the-fly-in-java 上找到:

public static BufferedImage getGrayscale(int width, byte[] buffer) {
    int height = buffer.length / width;
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
    int[] nBits = { 8 };
    ColorModel cm = new ComponentColorModel(cs, nBits, false, true,
            Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    SampleModel sm = cm.createCompatibleSampleModel(width, height);
    DataBufferByte db = new DataBufferByte(buffer, width * height);
    WritableRaster raster = Raster.createWritableRaster(sm, db, null);
    BufferedImage result = new BufferedImage(cm, raster, false, null);

    return result;
}

关于java - 从字节数组创建 8 位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12154090/

相关文章:

java - 无法连接到远程 cassandra

Java - 转换为未知类型

php - setImageCompressionQuality 与 setCompressionQuality 之间有什么区别 - Imagick

image - 8 位彩色图像矩阵表示

php - 如何将 RGB(A) 值保存在数组中?

java - Android 应用程序中的 SimpleExpandableListAdapter 问题

python - 从一点开始就保持多条线

c++ - FindContours 如何循环遍历图像? OpenCV 2.3

java - 用于基于内容的图像检索系统的算法

java - 使图像适合打印区域