Java 在JFrame中显示图像时遇到问题
所以我试着用MemoryImageSource写一些像素,并在一帧中显示。代码如下:Java 在JFrame中显示图像时遇到问题,java,image,swing,jframe,pixel,Java,Image,Swing,Jframe,Pixel,所以我试着用MemoryImageSource写一些像素,并在一帧中显示。代码如下: public class ImageDraw extends JPanel { Image img; public void ImageDraw(){ //super(); int w=600; int h=400; int pixels[] = new int[w*h]; int i=0; for(i=0;i&l
public class ImageDraw extends JPanel {
Image img;
public void ImageDraw(){
//super();
int w=600;
int h=400;
int pixels[] = new int[w*h];
int i=0;
for(i=0;i<w*h;i++){
//pixels[i++]=0;
pixels[i]=255;
}
img = createImage(new MemoryImageSource(w,h,pixels,0,w));
}
public void paint(Graphics g){
g.drawImage(img, 0, 0, this);
}
}
它只显示一个空帧。为什么?我的目标是学习如何逐像素绘制,所以这只是我绘制的测试图像,以查看它是否有效
谢谢。您的代码有两个问题。首先
public void ImageDraw() { ... }
是一个方法,而不是构造函数。在代码中根本不调用该方法。把这行改成
public ImageDraw() { ... }
没有void
,使其成为默认构造函数
其次,需要设置像素数据的alpha值:
pixels[i] = 255 + 0xFF000000;
还有两点:
- 请不要重写
,而要重写paint(…)
李>paintComponent(…)
- 不要设置
的大小,而是覆盖组件的方法JFrame
并使用getPreferredSize()
frame.pack()
public void ImageDraw() { ... }
是一个方法,而不是构造函数。在代码中根本不调用该方法。把这行改成
public ImageDraw() { ... }
没有void
,使其成为默认构造函数
其次,需要设置像素数据的alpha值:
pixels[i] = 255 + 0xFF000000;
还有两点:
- 请不要重写
,而要重写paint(…)
李>paintComponent(…)
- 不要设置
的大小,而是覆盖组件的方法JFrame
并使用getPreferredSize()
frame.pack()
img
在paint
方法中应为空。@PauldrawImage
包含null
检查。噢,谢谢!像素数据的结构是什么?默认情况下是RGBA吗?我可以指定一个不同的模型吗?+1,@achit,您是否阅读了MemoryImageSource API以了解有效的构造函数和方法是什么?@achit您可以使用4参数构造函数创建一个DirectColorModel
,该构造函数指定24位和掩码,其中红色为0xff0000
,绿色为0x00ff00
,蓝色为0x0000ff
。这将把所有的像素都视为不透明的。对构造函数的理解很好,但是当他运行代码时,怎么会没有NPE呢img
在paint
方法中应为空。@PauldrawImage
包含null
检查。噢,谢谢!像素数据的结构是什么?默认情况下是RGBA吗?我可以指定一个不同的模型吗?+1,@achit,您是否阅读了MemoryImageSource API以了解有效的构造函数和方法是什么?@achit您可以使用4参数构造函数创建一个DirectColorModel
,该构造函数指定24位和掩码,其中红色为0xff0000
,绿色为0x00ff00
,蓝色为0x0000ff
。这会将所有像素视为不透明。