Java Greycale缓冲图像

时间:2015-08-20 04:11:33

标签: java image bufferedimage grayscale

所以我有一个表示像素数据的字节数组(8位灰度)。没有头。没什么。只是数据。我想从这些数据创建一个缓冲的图像。我做了

image = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
image.getRaster().setDataElements(0, 0, w, h, data);
this.x = w;
this.y = h;
scalemode=false;
exactmode=true;

其中w只是像素宽度,h是像素高度,数据是字节数组,图像是BufferedImage

这是我的绘画方法

 protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        int rx = (this.getWidth() - x) / 2;
        int ry = (this.getHeight() - y) / 2;

        g2d.drawImage(image, rx, ry,x,y, null);
    }
然而,我得到这个图像(真实图像是指纹,主要是白色像素)

messed up image

出了什么问题?我尝试按原样保存数据,然后在Photoshop中查看。数据很好。

[编辑] 别介意这个问题。我搞砸了代码的其他部分并且不知道。感谢您提供的所有输入

3 个答案:

答案 0 :(得分:1)

由于您没有发布足够的信息,因此很难确切地知道出了什么问题。我们不知道wh或您data中的信息。我们不知道应该的图像。

但是,这里有一些代码可以完全正确地执行您所做的事情,并且它适用于我:

// Set up h/w and backing data
int w = 300;
int h = 200;
byte[] data = new byte[w * h];

// Create a smooth gradient
for (int y = 0; y < h; y++) {
    int off = y * w;

    for (int x = 0; x < w; x++) {
        data[off + x] = (byte) (Math.round((x / (double) w) * 127) 
                              + Math.round((y / (double) h) * 127));
    }
}

// Create BufferedImage from data
final BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
image.getRaster().setDataElements(0, 0, w, h, data);

// Show it all in a window
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        JFrame frame = new JFrame(getClass().getSimpleName());
        frame.add(new JLabel(new ImageIcon(image)));

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
});

结果如下:

Image of JFrame from above code

答案 1 :(得分:0)

绘制每个像素的每个字节......

BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
for (int dy = 0; dy < h; dy ++){
    for(int dx = 0; dx < w; dx ++){
        int index = dy*w + dx;
        int rgb = data[index];
        rgb = rgb << 24 & 0xFFFF; //BufferedImage.TYPE_BYTE_GRAY consideres only the red-channel;
        //rgb = 00 data[index] FF FF
        image.setRGB(dx,dy,rgb);
        }
    }
}

答案 2 :(得分:-1)

你没有正确设置缓冲区......

byte[] data = ... 
DataBufferByte db = new DataBufferByte(data, w*h);
image.getRaster().setDataElements(0, 0, w, h, db );

请参阅http://docs.oracle.com/javase/7/docs/api/java/awt/image/WritableRaster.html#setDataElements%28int,%20int,%20java.lang.Object%29