Question

J'essaie d'utiliser le quantizefilter dans

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

Réduire la profondeur de couleur d'un coup d'écran.

Voici mon code très très simple:

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

Cependant, ce qui me reste, c'est:

original img:

Entrez la description de l'image ici

img quantifié:

entrez la description de l'image ici

Une analyse ultérieure du problème montre que la matrice Inpixels est remplie de manière incorrecte; Il est rempli trois fois avec le tiers supérieur de l'image d'origine.

Tous les pointeurs comment je peux résoudre ce problème?

En outre, tous les liens de qualité + algorithme de quantification rapide en Java? Ce que je recherche est un algorithme qui prendra une image de type_int_bgr et de produire une nouvelle image type_int_bgr mais avec une différence de pixels moins réelle, elle pourrait donc être facilement dégonflée.

Par exemple, si nous avons deux pixels dans l'image d'origine, des valeurs telles que 255, 255, 234 et une autre avec une valeur de 255, 255, 236, elles doivent être converties à 255 255 25240. Acclamations

Était-ce utile?

La solution

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.

Autres conseils

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top