0

QuantizeFilterをで使用しようとしています

http://www.jhlabs.com/ip/filters/index.html

スクリーンショットの色深度を減らすため。

これが私の非常に単純なコードです:

    Robot robo = new Robot();
    BufferedImage notQuantized = robo.createScreenCapture( new Rectangle ( 0, 0, 300, 300 ) );
    BufferedImage Quantized = new BufferedImage( 300, 300, BufferedImage.TYPE_INT_BGR);
    File nonquantized = new File ("C:\\nonquantized.png");
    File quantized = new File("C:\\quantized.png");
    nonquantized.createNewFile();
    quantized.createNewFile();
    QuantizeFilter bla = new QuantizeFilter();

    int [] outPixels = new int[300*300*3];
    int [] inPixels = new int[300*300*3];

    notQuantized.getRaster().getPixels( 0, 0, 300, 300, inPixels );
    bla.quantize( inPixels, outPixels, 300, 300,2, true, true );

    Quantized.getRaster().setPixels( 0, 0, 300, 300, outPixels );
    ImageIO.write( Quantized, "png", quantized );
    ImageIO.write( notQuantized, "png", nonquantized );

しかし、私に残されているのは次のとおりです。

元の画像:

ここに画像の説明を入力してください

量子化されたimg:

ここに画像の説明を入力してください

問題をさらに分析すると、inPixels配列が正しく入力されていないことがわかります。元の画像の上3分の1で3回塗りつぶされます。

どうすればそれを修正できるのでしょうか?

さらに、Javaのリンクグッド+高速量子化アルゴリズムはありますか?私が探しているのは、TYPE_INT_BGR画像を取得し、新しいTYPE_INT_BGR画像を生成するアルゴリズムですが、実際のピクセル差が少ないため、簡単に収縮する可能性があります。

たとえば、元の画像に255、255、234などの値を持つ2つのピクセルがあり、255、255、236などの値を持つ別のピクセルがある場合、両方を255,255,240に変換する必要があります。乾杯

4

2 に答える 2

2

次の例は、画像を正しく変換します。

QuantizeFilter q = new QuantizeFilter();
int [] inPixels = new int[image.getWidth()*image.getHeight()*3];
int [] outPixels = new int[image.getWidth()*image.getHeight()*3];
image.getRaster().getPixels( 0, 0, image.getWidth(), image.getHeight(), inPixels );
q.quantize(inPixels, outPixels, image.getWidth(), image.getHeight(), 64, false, false);
WritableRaster raster = (WritableRaster) image.getData();
raster.setPixels(0,0,width,height,outPixels);

また、ImageIO.writeがファイルを自動的に作成するため、ファイルを暗黙的に作成する理由はありません。

于 2012-01-19T18:08:19.767 に答える
1

私は同じ問題を抱えていましたが、あなたが投稿したコードQuantizeFilterではなく、すべてのピクセルを通過しないクラスが原因です。このコード部分を見つける必要があります

 if (!dither) {
        for (int i = 0; i < count; i++)
            outPixels[i] = table[quantizer.getIndexForColor(inPixels[i])];

カウントに3を掛けます。

これは、最後の2つのパラメーターがfalseに設定されている場合の修正にすぎないことに注意してください。

于 2012-05-13T00:54:17.987 に答える