Использование JH Labs Quantize для уменьшения глубины цвета изображения

Я пытаюсь использовать 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 );

Однако то, что у меня осталось, это:

Исходное изображение:

введите здесь описание изображения

Квантованные изображения:

введите здесь описание изображения

Дальнейший анализ проблемы показывает, что массив inPixels заполнен некорректно; он трижды заполняется верхней третью исходного изображения.

Любые указатели, как я могу это исправить?

Кроме того, какие-либо ссылки на хороший + быстрый алгоритм квантования в Java? Я ищу алгоритм, который возьмет изображение TYPE_INT_BGR и создаст новое изображение TYPE_INT_BGR, но с меньшей фактической разницей в пикселях, чтобы его можно было легко сдуть.

Например, если у нас есть два пикселя в исходном изображении со значениями, такими как 255, 255, 234, и еще один со значениями, такими как 255, 255, 236, они оба должны быть преобразованы в 255 255 240. Ваше здоровье


person Nikola Yovchev    schedule 18.02.2011    source источник


Ответы (2)


Следующий пример правильно преобразует ваше изображение:

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

Также нет причин создавать файлы неявно, так как ImageIO.write создает их автоматически.

person JR Lomas    schedule 19.01.2012

У меня была та же проблема, и виноват не код, который вы опубликовали, а класс QuantizeFilter, который не проходит через все пиксели. Вам нужно найти эту часть кода

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

и умножьте количество на 3.

Обратите внимание, что это исправление только в том случае, если для последних 2 параметров установлено значение false.

person Victor    schedule 13.05.2012