显示后如何编辑 BufferedImage?
How can I edit a BufferedImage after it has been displayed?
我正在处理 16 位灰度图像:
BufferedImage bufferedImage = new BufferedImage(320, 240, BufferedImage.TYPE_USHORT_GRAY);
我可以通过获取对其底层存储的引用来编辑该图像。数据存储在线性数组中,按行主序排列:
short[] data = ((DataBufferUShort)bufferedImage.getRaster().getDataBuffer()).getData();
但是,如果 bufferedImage
已呈现到任何屏幕,编辑 data
将不再有任何效果。我可以在数据显示在屏幕上之前对其进行编辑,但是在显示之后我就不能再更改它了。
我当然尝试过重新绘制 AWT 控件——它没有使用新的像素数据进行更新。我什至尝试过 getDataElements 和 setDataElements。显示图像后似乎没有任何效果。
我怀疑您在屏幕上绘制图像的方式有问题。
下面是一些演示您正在做的事情应该起作用的最小代码:
public class Test {
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
JFrame frame = new JFrame("Image Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_USHORT_GRAY);
ImageComponent component = new ImageComponent(image);
frame.add(component);
frame.pack();
frame.setVisible(true);
short gray = 0;
short[] data = ((DataBufferUShort) image.getRaster().getDataBuffer()).getData();
while (true) {
for (int i = 0; i < data.length; i++) {
data[i] = gray;
}
Thread.sleep(20);
gray += 1000;
component.repaint();
}
}
static class ImageComponent extends JComponent {
private BufferedImage image;
public ImageComponent(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
}
}
}
我正在处理 16 位灰度图像:
BufferedImage bufferedImage = new BufferedImage(320, 240, BufferedImage.TYPE_USHORT_GRAY);
我可以通过获取对其底层存储的引用来编辑该图像。数据存储在线性数组中,按行主序排列:
short[] data = ((DataBufferUShort)bufferedImage.getRaster().getDataBuffer()).getData();
但是,如果 bufferedImage
已呈现到任何屏幕,编辑 data
将不再有任何效果。我可以在数据显示在屏幕上之前对其进行编辑,但是在显示之后我就不能再更改它了。
我当然尝试过重新绘制 AWT 控件——它没有使用新的像素数据进行更新。我什至尝试过 getDataElements 和 setDataElements。显示图像后似乎没有任何效果。
我怀疑您在屏幕上绘制图像的方式有问题。
下面是一些演示您正在做的事情应该起作用的最小代码:
public class Test {
public static void main(String[] args) throws InterruptedException, InvocationTargetException {
JFrame frame = new JFrame("Image Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_USHORT_GRAY);
ImageComponent component = new ImageComponent(image);
frame.add(component);
frame.pack();
frame.setVisible(true);
short gray = 0;
short[] data = ((DataBufferUShort) image.getRaster().getDataBuffer()).getData();
while (true) {
for (int i = 0; i < data.length; i++) {
data[i] = gray;
}
Thread.sleep(20);
gray += 1000;
component.repaint();
}
}
static class ImageComponent extends JComponent {
private BufferedImage image;
public ImageComponent(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
}
}
}