Java 灰度缓冲图像
Java Greyscale buffered image
所以我有一个表示像素数据(8 位灰度)的字节数组。没有header。没什么。只是数据。我想从这些数据创建一个缓冲图像。我做到了
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);
}
然而,我得到了这个图像(真实图像是指纹,大部分是白色像素)
出了什么问题?我尝试按原样保存数据,然后在 Photoshop 中查看。数据没问题。
[编辑]
不要管这个问题。我搞砸了代码的其他部分并且没有意识到。感谢您的所有投入
在每个像素上绘制每个字节...
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);
}
}
}
您没有正确设置缓冲区...
byte[] data = ...
DataBufferByte db = new DataBufferByte(data, w*h);
image.getRaster().setDataElements(0, 0, w, h, db );
很难确切知道哪里出了问题,因为您没有发布足够的信息。我们不知道 w
、h
或您的 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);
}
});
结果如下:
所以我有一个表示像素数据(8 位灰度)的字节数组。没有header。没什么。只是数据。我想从这些数据创建一个缓冲图像。我做到了
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);
}
然而,我得到了这个图像(真实图像是指纹,大部分是白色像素)
出了什么问题?我尝试按原样保存数据,然后在 Photoshop 中查看。数据没问题。
[编辑] 不要管这个问题。我搞砸了代码的其他部分并且没有意识到。感谢您的所有投入
在每个像素上绘制每个字节...
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);
}
}
}
您没有正确设置缓冲区...
byte[] data = ...
DataBufferByte db = new DataBufferByte(data, w*h);
image.getRaster().setDataElements(0, 0, w, h, db );
很难确切知道哪里出了问题,因为您没有发布足够的信息。我们不知道 w
、h
或您的 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);
}
});
结果如下: