JH Labs Quantize Usan для уменьшения глубины цвета изображения - PullRequest
0 голосов
/ 18 февраля 2011

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

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

Оригинал img:

enter image description here

Quantized img:

enter image description here

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

Есть какие-нибудь указатели, как я могу это исправить?

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

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

Ответы [ 2 ]

2 голосов
/ 19 января 2012

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

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 создает их автоматически.

0 голосов
/ 13 мая 2012

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

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

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

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

...