如何编辑BufferedImage中的像素?

Nav*_*ron 4 java render pixel

在搜寻了数天的互联网之后,我发现了一个似乎可以解决我的目标的问题。(我正在尝试绘制/编辑图像中的单个像素,然后进行渲染。)在上述问题中,提问者要求提供Black BufferedImage的代码。顶部的Answer提供了该代码,并且看起来很漂亮,直到您尝试将其更改为黑色以外的其他颜色为止。这是代码:

package myProjectPackage;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.*;

public class Copypasta {

public static JFrame frame;
BufferedImage img;
public static int WIDTH = 500;
public static int HEIGHT = 500;

public Copypasta() {
}

public static void main(String[] a){

    Copypasta t=new Copypasta();

    frame = new JFrame("WINDOW");
    frame.setVisible(true);

    t.start();
    frame.add(new JLabel(new ImageIcon(t.getImage())));

    frame.pack();
    // Better to DISPOSE than EXIT
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

public Image getImage() {
    return img;
}

public void start(){

    img = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    boolean running=true;
    while(running){
        BufferStrategy bs=frame.getBufferStrategy();
        if(bs==null){
            frame.createBufferStrategy(4);
            return;
        }
        for (int i = 0; i < WIDTH * HEIGHT; i++)
            pixels[i] = 0; //This is what i've been trying to change.

        Graphics g= bs.getDrawGraphics();
        g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
        g.dispose();
        bs.show();

    }
}
}
Run Code Online (Sandbox Code Playgroud)

抱歉缩进错误。我保证它在编辑器中看起来正确。

当设置为BufferedImage类型ARGB时,黑色背景消失,使我相信启动功能根本没有在Image上绘制,或者绘制的图像没有在屏幕上绘制。无论哪种方式,都有我不了解的地方。如果有时间,我将不胜感激,这将有助于您找出问题所在,甚至无法解释原因。谢谢大家,-Navi

链接到原始问题:在框架上绘制自己的缓冲图像

Mad*_*mer 6

有几件事情跳出来了,使用BufferStrategy可能是过大了。除非您绝对必须控制喷漆过程,否则您真的不需要它。使用a BufferStrategy还排除了使用基于Swing的组件的可能,也可能不是问题。

尝试直接操作像素数据也可能有点过大,相反,您可以使用BufferedImage.setRGB(int, int, int),它允许您将像素的颜色设置在指定的x / y位置,例如...

img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < img.getWidth(); x++) {
    for (int y = 0; y < img.getHeight(); y++) {
        img.setRGB(x, y, Color.RED.getRGB());
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,即使这有点矫kill过正,也可以通过使用提供的2D图形API实现相同的目的...

Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.RED);
g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
g2d.dispose();
Run Code Online (Sandbox Code Playgroud)

您可能会发现它更快(不仅仅是从编码的角度来看)。

看一眼:

更多细节...

工作示例...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestImage1 {

    public static void main(String[] args) {
        new TestImage1();
    }

    public TestImage1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage img;

        public TestPane() {
            img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
            //for (int x = 0; x < img.getWidth(); x++) {
            //    for (int y = 0; y < img.getHeight(); y++) {
            //        img.setRGB(x, y, Color.RED.getRGB());
            //    }
            //}

            Graphics2D g2d = img.createGraphics();
            g2d.setColor(Color.RED);
            g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
            g2d.dispose();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.drawImage(img, 0, 0, this);
            g2d.dispose();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)