我打算在窗口内显示一个28x28像素的图像。像素的值为“0”,所以我希望它显示一个黑色方块为28x28的窗口。但是没有显示图像。也许数组的数据(我不确定像素值是否必须是0到255范围内的int)必须是其他数据才能显示图像。谢谢!
公共类ASD {
public static Image getImageFromArray(int[] pixels, int width, int height) {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = (WritableRaster) image.getData();
System.out.println(pixels.length + " " + width + " " + height);
raster.setPixels(0,0,width,height,pixels);
return image;
}
public static void main(String[] args) throws IOException {
JFrame jf = new JFrame();
JLabel jl = new JLabel();
int[] arrayimage = new int[784];
for (int i = 0; i < 28; i++)
{ for (int j = 0; j < 28; j++)
arrayimage[i*28+j] = 0;
}
ImageIcon ii = new ImageIcon(getImageFromArray(arrayimage,28,28));
jl.setIcon(ii);
jf.add(jl);
jf.pack();
jf.setVisible(true);
}
答案 0 :(得分:3)
image.getData()
会返回栅格的副本。
也许如果您在修改栅格后调用image.setData(raster)
,您将看到结果。
此外,setPixels应该有一个足够大的数组来填充栅格的所有波段(A,R,G,B)。我已经得到一个数组索引超出范围的异常,直到我将像素的大小增加到28 * 28 * 4.
对于TYPE_INT_RGB,以下内容应生成白色图像:
public class ASD
{
public static Image getImageFromArray(int[] pixels, int width, int height)
{
BufferedImage image =
new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
WritableRaster raster = (WritableRaster) image.getData();
raster.setPixels(0, 0, width, height, pixels);
image.setData(raster);
return image;
}
public static void main(String[] args) throws IOException
{
JFrame jf = new JFrame();
JLabel jl = new JLabel();
//3 bands in TYPE_INT_RGB
int NUM_BANDS = 3;
int[] arrayimage = new int[28 * 28 * NUM_BANDS];
for (int i = 0; i < 28; i++)
{
for (int j = 0; j < 28; j++) {
for (int band = 0; band < NUM_BANDS; band++)
arrayimage[((i * 28) + j)*NUM_BANDS + band] = 255;
}
}
ImageIcon ii = new ImageIcon(getImageFromArray(arrayimage, 28, 28));
jl.setIcon(ii);
jf.add(jl);
jf.pack();
jf.setVisible(true);
}
}
答案 1 :(得分:1)
我不知道这是问题,但你正在使用 TYPE_INT_ARGB。这包括打包整数中的Alpha通道(opacy),值0表示完全透明。
另一个(阅读docs!):
BufferedImage.getData() : The Raster returned is a copy of the image data is not updated if the image is changed.
我认为你必须调用setData()将新像素放在图像中。