0

Floyd-Steinberg アルゴリズムを Java で実装しようとしていますが、まだエラーがありますか?! 私のコードでは解決できません。これを解決する方法についてアドバイスがあるかもしれません。

ここに方法があります

 public DitheringGUI dith(String fileName) {
DitheringGUI g = new DitheringGUI(fileName);

for(int y = 0 ; y<g.img.getHeight();y++){
    for(int x = 0 ; x < g.img.getWidth();x++){

    Color oldColor = g.img.getColor(x, y);
    Color newColor = palette(oldColor);

    g.img.set(x, y, newColor);



    int quant_Error = oldColor.getRed() - newColor.getRed();


    if(x+1 < g.img.getWidth()) {
        g.img.set(x+1,y,new Color(  g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
            g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
            g.img.getColor(x+1, y).getRed()+quant_Error*(7/16)));
    }


    if(x-1 >=0 && y+1 <g.img.getHeight()){
        g.img.set(x-1,y+1,new Color(    g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
            g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
            g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16)));
    }

    if(y+1 < g.img.getHeight()){
        g.img.set(x,y+1,new Color(  g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
            g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
            g.img.getColor(x, y+1).getRed()+quant_Error*(5/16)));

    }



    if(x+1 < g.img.getWidth() && y+1 < g.img.getHeight()){
        g.img.set(x+1,y+1,new Color(    g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
            g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
            g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16)));
    }

    }
}
return g;
}

実際の問題は、それが白黒であり、ディザリングされていないことです。つまり、グレースケールはありません。

私の入力はこれです:http://www.directupload.net/file/d/3985/spd2k9wq.png

私の出力は次のとおりです。http://www.directupload.net/file/d/3985/s24rq7qo.png

「ディザリングされた」画像は過度にディザリングされており、ほとんど黒くなっていることに注意してください。

4

2 に答える 2

0

整数除算を行っています: 7/16, 3/16, 5/16, 1/16...

これらの除算の結果は0、一部ではなく、一部です。

代わりに浮動小数点数を使用してください。たとえば7.0 / 163.0 / 16などです。

于 2015-05-12T14:46:54.887 に答える
0

エラーが表示されたと思いますが、おそらくカットアンドペーストの種類です。

各コードのifブロックでは、これまでに呼び出したgetRed()ことがなくgetGreen90、またはgetBlue(). 以下のブロックでこれを参照してください: (問題を見つけやすくするために再フォーマットされています。

if(x+1 < g.img.getWidth()) {
    g.img.set(x+1,y,new Color(  
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16)));
}                              /\/\/\/\
                                 here   

これとあなたの他のブロックは次のように見えるべきではありません:

if(x+1 < g.img.getWidth()) {
    g.img.set(x+1,y,new Color(  
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getGreen()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getBlue()+quant_Error*(7/16)));
} 

私はあなたが非常に近いと推測しており、結果の画像がそのように見える理由は、RGB スペクトルの赤い部分のみが評価されているためです。

于 2015-05-12T15:50:11.927 に答える