我一直在使用Java中的nonogram求解器,我的所有算法都运行正常,但我一直在努力处理可视化。
在执行算法期间,我可以访问两个"解决方案阵列"。一个属于int[][]
类型,其中包含值-1
用于"当然为白色",0
用于"不确定"并且1
为"肯定是黑色"。另一个数组类型为float[][]
,其中包含0
和1
之间的值,此处0
用于肯定为白色,1
用于肯定为黑色且值为.2
表示细胞更可能是白色而不是黑色。
由于我最近从PHP切换到Java编程(没有正确的介绍),我对于正确地可视化这个数组并不了解。当然,我首先尝试使用X
,.
和?
之类的字符将第一种类型的数组打印到控制台,但这远非不错。然后我找到了关于BufferedImage
的内容,并创建了以下函数(对于float[][]
,int[][]
类似):
public void toImage(int w, int h, float[][] solution) throws IOException {
int[] data = toImage1(w, h, solution);
BufferedImage img = toImage2(data, w, h);
toImage3(img);
}
public int[] toImage1(int w, int h, float[][] solution) throws IOException {
int[] data = new int[w * h];
int i = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int a = y / 100;
int b = x / 100;
int z = (int) (255 * Math.sqrt(1 - solution[a][b]));
if (solution[a][b] == 1 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 100;
} else if (solution[a][b] == 0 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 230;
}
data[i++] = z << 16 | z << 8 | z;
}
}
return data;
}
public BufferedImage toImage2(int[] data, int w, int h) {
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
img.setRGB(0, 0, w, h, data, 0, w);
return img;
}
public void toImage3(BufferedImage img) throws IOException {
File f = new File("Nonogram.png");
ImageIO.write(img, "PNG", f);
}
此处,w
和h
应该是每列中的单元格数量。行乘以100(我希望每个单元格由100x100像素的块表示)。
然后,我还希望在单元格中有一个额外的灰色框,这是if
和else if
的用途。
然而,我遇到两个问题:
答案 0 :(得分:2)
好吧,看起来写入文件实际上并不是你最大的问题,看起来你最大的问题就是你要单独转储像素。以下是我可能会做的一些事情:
int[]
步骤,直接写入BufferedImage
。
bufferedImage.setRGB(startX, startY, w, h, rgbArray, offset, scansize)
,但仅限于您正在批量绘制的图像部分。a
和b
(而不是w
和h
的价值执行所有操作,包括尤其是循环,请参阅第4点。drawSingleBox
。请记住,更多具有良好名称的方法可以更轻松地跟踪正在发生的事情。 writeImageToFile
比toImage3
更受欢迎。 convertArrayToImage
优先于toImage2
。
另外,您询问了如何将图像作为JFrame
的背景;获得完全绘制的BufferedImage
对象后,您可以使用JFrame background image中的信息来完成该部分。