Поддерживает ли Java BufferedImage с глубиной> 8 бит? (Глубокий цвет) - PullRequest
0 голосов
/ 02 ноября 2018

Я усредняю ​​несколько сотен изображений, и ошибки округления превращают их в сероватую путаницу. Если бы я мог использовать BufferedImages, которые имели> 8 бит на канал, я уверен, что округление не повредит мне так сильно.

Есть ли способ использовать код BufferedImage на базовом изображении, которое является изображением большой битовой глубины? Я имею в виду> 16 м цветов,> 24 бита, что, как я считаю, называется "Deep Color" .

1 Ответ

0 голосов
/ 02 ноября 2018

Да, это так. : -)

Для глубокого цвета нет BufferedImage.TYPE_*, поэтому вы должны создать его более многословно, чем "обычный". Кроме того, поскольку результирующий тип будет TYPE_CUSTOM, он, вероятно, будет значительно медленнее рисовать и отображать. Но если вы используете его только как временное «рабочее» изображение, это, вероятно, не является серьезной проблемой.

Пример:

private BufferedImage create48BitRGBImage(int width, int height) {
    int precision = 16; // You could in theory use less than the full 16 bits/component (ie. 12 bits/component)
    ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    ColorModel colorModel = new ComponentColorModel(colorSpace, new int[] {precision, precision, precision}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT);
    return new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(width, height), colorModel.isAlphaPremultiplied(), null);
}

Если вы хотите 64-битный ARGB, измените colorModel следующим образом:

new ComponentColorModel(colorSpace, new int[] {precision, precision, precision, precision}, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_USHORT);
...