質問

で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:

画像の入力ここで

量子化Img:

画像の説明がここにあります

問題のさらなる分析は、Inpixelsアレイが正しく満たされていないことを示しています。元の画像の上位1分の1で3回充填されています。

どのようにしてそれを修正できるか?

さらに、Javaでの任意のリンク+高速量子化アルゴリズムは? Iを検索するのは、type_int_bgrイメージを取り、新しいtype_int_bgrイメージを作成しますが、ピクセルの実際の違いが発生しますので、簡単に収縮させることができます。

例えば、元の画像に2つのピクセルがある場合は、255,255,234のような値と255,255,236のような値を持つ値がある場合、それらは両方とも255,255,240に変換されます。歓声

役に立ちましたか?

解決

The following example will convert your image correctly:

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);

Also there is no reason to create the files implicitly, as ImageIO.write creates them automatically.

他のヒント

I have had the same problem and its not the code you posted that's at fault it's the QuantizeFilter class which doesn't go through all the pixels. You need to find this code part

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

and multiply count by 3.

Please note that this is only a a fix if the last 2 parameters are set to false.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top