JH Labs cuantizan el uso para reducir la profundidad del color de la imagen
-
15-11-2019 - |
Pregunta
Estoy tratando de usar el semáfilo en
http://www.jhlabs.com/ip/filters/index.html
para reducir la profundidad de color de una captura de pantalla.
Aquí está mi código muy 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 );
Sin embargo, con lo que me queda es:
original IMG:
img cuantificada:
Un análisis adicional del problema muestra que la matriz INPIXELS se llena incorrectamente; Se llena tres veces con el tercio superior de la imagen original.
¿Cualquier puntero cómo puedo arreglar eso?
¡Además, cualquier enlace bueno + algoritmo de cuantificación rápida en Java? Lo que busco es un algoritmo que tomará una imagen type_int_bgr y producirá una nueva imagen Type_Int_Bgr, pero con menos diferencia real en los píxeles, por lo que podría desinflarse fácilmente.
Por ejemplo, si tenemos dos píxeles en la imagen original, con valores como 255, 255, 234 y otra con valor como 255, 255, 236, deben convertirse en 255.255.240. Saludos
Solución
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.
Otros consejos
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.