(Java)是否有可能生成2个不同的图形窗口?如果是这样,如何使用此代码?

时间:2014-11-17 23:52:38

标签: java

以下代码可编程为在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);
            } 
        }
    }
}

真诚地感谢您的帮助。

2 个答案:

答案 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之间。如果是真的,那就有一个边缘,如果是假的,那就是一个更小的污点,可以忽略不计。