Java 如何在显示BuffereImage后编辑它?

Java 如何在显示BuffereImage后编辑它?,java,awt,bufferedimage,Java,Awt,Bufferedimage,我正在处理16位灰度图像: BufferedImage bufferedImage = new BufferedImage(320, 240, BufferedImage.TYPE_USHORT_GRAY); 我可以通过抓取对其底层存储的引用来编辑该图像。数据存储在线性阵列中,按行的主要顺序: short[] data = ((DataBufferUShort)bufferedImage.getRaster().getDataBuffer()).getData(); 但是,如果buffere

我正在处理16位灰度图像:

BufferedImage bufferedImage = new BufferedImage(320, 240, BufferedImage.TYPE_USHORT_GRAY);
我可以通过抓取对其底层存储的引用来编辑该图像。数据存储在线性阵列中,按行的主要顺序:

short[] data = ((DataBufferUShort)bufferedImage.getRaster().getDataBuffer()).getData();
但是,如果
bufferedImage
已呈现到任何屏幕,则编辑
数据
不再有任何效果。;我可以在数据显示在屏幕上之前对其进行编辑,但在显示数据之后,我无法再对其进行更改


我当然尝试过重新绘制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);
        }
    }
}
公共类测试{
公共静态void main(字符串[]args)抛出InterruptedException、InvocationTargetException{
JFrame=新JFrame(“图像测试”);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
BuffereImage=新的BuffereImage(100100,BuffereImage.TYPE_-USHORT_-GRAY);
ImageComponent组件=新的ImageComponent(图像);
框架。添加(组件);
frame.pack();
frame.setVisible(true);
短灰色=0;
short[]data=((DataBufferUShort)image.getRaster().getDataBuffer()).getData();
while(true){
对于(int i=0;i
A将非常有用。您是否用新的像素数据更新了BuffereImage?(即,您是否在BuffereImage上调用了
setData(data)
)@Campbell
getRaster().getDataBuffer())。getData()不返回数据的副本;不必打电话给史密斯先生
setData
,值得一试,不是吗。您确实应该调用
super.paintComponent
,因为组件可能比它的首选大小更大;2.您应该覆盖
getPreferredSize
而不是
setPreferredSize
,因为它可以防止其他元素更改它;3.
Graphics#drawImage
ImageObserver
应该是
this
;4.虽然只是一个例子,但是修改两个线程之间共享的
buffereImage
是一个坏主意,值得一试noting@MadProgrammer:根据说明,在渲染
缓冲图像时不需要图像观察者。这是事实,但使用它是一个好习惯,因为您并不总是知道;)