(爪哇)是否可以生成 2 个不同的图形窗口?如果是这样,如何使用此代码执行此操作



下面的代码被编程为在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);
            } 
        }
    }
}

您的帮助将不胜感激。

首先,您需要定义什么是边界,如果只是颜色的变化或相同颜色的细微差别被视为相同的边界,如果您考虑细微差别,您应该定义颜色之间的距离(例如 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);
    }
}

在此之前,您只需要使用上面的代码构建第一行和第一列,然后将上面的代码用于其他像素

如果"黑白"是指灰度,则需要确定使用哪种渐变。有三种主要方法。假设数组中的每个坐标都有 [R, G, B]。我假设您使用的是AWT颜色。在这种情况下,您可以通过应用亮度方法开发灰度坐标:

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 之间。如果为真,则有边缘,如果为假,则为较小的污点,可以忽略。

最新更新