【发布时间】:2014-06-07 16:42:48
【问题描述】:
在网上搜索了几天后,我发现了一个似乎可以解决我的目标的问题。 (我正在尝试绘制/编辑图像中的单个像素,并对其进行渲染。)在上述问题中,提问者请求了 Black BufferedImage 的代码。最佳答案提供了该代码,并且看起来运行良好,直到您尝试将其更改为黑色以外的其他内容。这是代码:
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();
}
}
}
我为缩进错误道歉。我保证它在编辑器中看起来不错。
当设置为 BufferedImage 类型 ARGB 时,黑色背景消失,让我相信 start 函数根本没有绘制到 Image,或者绘制的图像没有绘制在屏幕上。不管怎样,有一些我不明白的地方。如果您有时间,我会很感激一些帮助确定出了什么问题,如果不是解释原因的话。谢谢你们, -导航。
【问题讨论】:
-
我“认为”问题是因为
JFrame上已经有“东西”,这会阻止绘制到BufferStrategy的任何内容可见。您能解释一下为什么需要使用BufferStrategy来执行此操作吗...另外,pixels数组不是像素数据的“实时”副本,这意味着修改不会更改底层图像...一些有关您实际尝试实现的目标的更多信息可能使我们能够为您提供其他解决方案 -
非常感谢。我根本不需要使用 Bufferstrategy,这只是示例中的内容。我对 java 比较陌生,我在 unity3d 中使用过 javascript,但我决定要提高一个水平。我目前的目标是编辑窗口中的像素。如果您有任何提示/技巧,任何方法都会很棒。