Отключить дизеринг на TYPE_BYTE_INDEXED BufferedImage

У меня есть BufferedImage 256 цветов, на котором я хочу нарисовать еще один BufferedImage (> 256 цветов). Поведение Java по умолчанию состоит в том, чтобы смешивать цвета, которые не могут быть представлены в низкоцветной модели. Я хочу отключить это (таким образом выбирая следующий лучший цвет, доступный в низкоцветной модели), поэтому я попытался использовать RenderingHints, чтобы указать новое поведение рендеринга, но оно не работает:

public BufferedImage filter(BufferedImage src) {
    BufferedImage convertedImage = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
    Graphics2D g2d = (Graphics2D) convertedImage.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
    g2d.drawImage(src, 0, 0, null);
    return convertedImage;
}

Идеи?

ОБНОВИТЬ:

Я решил проблему, нарисовав новое изображение попиксельно, которое может быть не очень быстрым, но оно работает. Смотрите мой ответ для деталей.

1 ответ

Решение

Я решил проблему, нарисовав новое изображение попиксельно, которое может быть не очень быстрым, но оно работает:

public BufferedImage filter(BufferedImage src) {
    BufferedImage convertedImage = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
    for (int x = 0; x < src.getWidth(); x++) {
        for (int y = 0; y < src.getHeight(); y++) {
            convertedImage.setRGB(x, y, src.getRGB(x, y));
        }
    }
    return convertedImage;
}
Другие вопросы по тегам