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:

ingrese la descripción de la imagen aquí

img cuantificada:

ingrese la descripción de la imagen aquí

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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top