以下代码可编程为在200x200显示屏中生成彩色图像。但是,我想知道,让我说我想生成另一个窗口,但是这个窗口将是一个200x200草图,大部分是白色,但原始图片的颜色边界是黑色的,我该如何实现呢?
简而言之,第一个窗口是彩色的。第二个窗口是第一个窗口的黑白草图。两个窗口都是彼此相邻的。你知道如何产生这样的结果吗?如果是的话,你能帮我吗?
//Setting the size of the graphics window
final int WINDOW_DIMENSION = 200;
EasyGraphics generate = new EasyGraphics(WINDOW_DIMENSION,WINDOW_DIMENSION);
//Constructing the arrays
char[][] firstArray = new char[WINDOW_DIMENSION][WINDOW_DIMENSION];
char[] secondArray = scan.toCharArray();
//Using "for" loop to generate 2D array
int line = WINDOW_DIMENSION;
int column = -1;
for (int i = 0; i < WINDOW_DIMENSION*WINDOW_DIMENSION; i++) {
column++;
if (i%WINDOW_DIMENSION == 0) {
line--;
column = 0;
}
firstArray[column][line]=secondArray[i];
}
//Plotting the colours for respective range of numbers
for (int a = 0; a < WINDOW_DIMENSION; a++) {
for (int b = 0; b < WINDOW_DIMENSION; b++) {
if (firstArray[a][b]=='0' || firstArray[a][b]=='1' || firstArray[a][b]=='2' || firstArray[a][b]=='3') {
generate.setColor(66,167,243);
generate.plot(a,b);
}
else if (firstArray[a][b]=='4' || firstArray[a][b]=='5') {
generate.setColor(0,255,77);
generate.plot(a,b);
}
else if (firstArray[a][b]=='6' || firstArray[a][b]=='7') {
generate.setColor(51,183,91);
generate.plot(a,b);
}
else if (firstArray[a][b]=='8' || firstArray[a][b]=='9') {
generate.setColor(102,51,0);
generate.plot(a,b);
}
}
}
}
真诚地感谢您的帮助。
答案 0 :(得分:0)
首先你需要定义什么是边界如果它是juste颜色的变化或相同颜色的细微差别被计算为相同的,如果你考虑细微差别你应该定义颜色之间的距离(例如RedDiff + GreenDeff + BlueDiff)如果它小于某个值,你将该位用黑色着色。 然后你可以做那样的事情:
for (int a = 1; a < WINDOW_DIMENSION; a++) {
for (int b = 1; b < WINDOW_DIMENSION; b++) {
generate.setColor(255,255,255);
if(array[a,b]!=array[a-1,b] || array[a,b]!=array[a,b-1])
generate.setColor(0,0,0);
generate.plot(a,b);
}
}
在此之前你需要使用类似上面代码的东西来构造第一行和第一列,然后使用上面的代码来获取其他像素
答案 1 :(得分:0)
如果“黑白”表示灰度,则需要确定要使用的渐变。有三种主要方法。假设您的数组中的每个坐标都有[R,G,B]。我假设你正在使用AWT Color。在这种情况下,您可以通过应用亮度方法来开发灰度坐标:
int intensity =
(max((double)color.getRed(), (double)color.getGreen(), (double)color.getBlue()}) +
min((double)color.getRed(), (double)color.getGreen(), (double)color.getBlue()})
/ 2) * 255
Color newColor = new Color(intensity, intensity, intensity)
或平均方法:
int intensity = (((double)color.getRed() + (double)color.getGreen() +
(double)color.getBlue())/3)*255;
或发光度方法:
int intensity = ((double)color.getRed() * 0.21 +
(double)color.getGreen() * 0.72 +
(double)color.getBlue() * 0.07) * 255;
只要您在相邻颜色之间的亮度方面有令人满意的滑动,或其他任何其他颜色。
如果你真的只是指黑白,那么user1928596的建议肯定会这样做;但如果这是一个课程,您可能需要稍后调整对色差的敏感度。稍微扩展一下这个定义,像Photoshop和Gimp这样的程序通常会对两个相邻颜色之间的差异使用误差函数,以及它们需要被视为边缘的边界。错误函数可以在Apache Commons中找到,位于org.apache.commons.math3.special.Erf。我可能会建议这样的事情:
boolean edge = Math.abs(Erf.erf(Intensity2 - Intensity1)) > σ;
其中σ是边界的阈值,介于0和1之间。如果是真的,那就有一个边缘,如果是假的,那就是一个更小的污点,可以忽略不计。