JH Labs Quanize Utilisation Pour réduire la profondeur de la couleur de l'image
-
15-11-2019 - |
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:
img quantifié:
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
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.