首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字节数组创建8位图像

从字节数组创建8位图像
EN

Stack Overflow用户
提问于 2012-08-28 14:47:50
回答 3查看 6.1K关注 0票数 2

字节数组是这样获得的-

代码语言:javascript
复制
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或灰度图像了解不多。我试过了-

代码语言:javascript
复制
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;
}

当我画这张图片时,它不是黑白的,而是橙色和灰色的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-28 15:06:18

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

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

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

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

代码语言:javascript
复制
0.2989 * R + 0.5870 * G + 0.1140 * B

因此,您必须找出哪个字节属于哪个通道;)

票数 3
EN

Stack Overflow用户

发布于 2012-08-28 14:57:16

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

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

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2012-08-28 14:57:22

这将会起作用。只需确保以所需的方式调整图像类型:

代码语言:javascript
复制
Image img = new ImageIcon(array).getImage();
BufferedImage image = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
image.createGraphics().drawImage(img, 0, 0, null);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12154090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档