Запись в 16-битный BufferedImage TYPE_USHORT_GRAY - PullRequest
3 голосов
/ 07 ноября 2010

Я пытаюсь записать 16-битные изображения в градациях серого в png, используя BufferedImage.TYPE_USHORT_GRAY. Обычно я пишу в изображение так:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

тогда:

image.setRGB(x,y,Color.getRGB);

, чтобы установить пиксели, и наконец:

ImageIO.write(image, "png", new File(path + ".png"));

для записи в изображение PNG.

Но теперь у меня есть это изображение:

BufferedImage imageGray = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY);

Как мне сохранить пиксели в этом формате? Использование setRGB () с 16-битным целым числом не работает, когда я открываю сохраненный файл png, я вижу, что происходит много полос.

Я попытался сохранить простой градиент от 0 до 65535, а затем с помощью setRGB () на изображении в градациях серого и проверил результаты в Photoshop. Я вижу, что изображение состоит из меньших градиентов каждые 256 строк. Я предполагаю, что setRGB () или imageIO не работают так, как мне бы хотелось.

Есть ли обходные пути для этого? Поддерживает ли imageIO формат BufferedImage.TYPE_USHORT_GRAY? Или он может сохранить только 8-битные данные? И если он может сохранить 16-битные данные, как бы я сохранил пиксельные данные, предпочтительно таким образом, как работает setRGB () (так для определенной координаты x, y)?

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Как pst уже прокомментировал ниже, мой вопрос:

Попробовать использовать растр напрямую?

Доступ к растру напрямую решил проблему.

0 голосов
/ 07 ноября 2010

Возможно, вам нужно расширить подписанные 16-битные шорты до целых и убрать знак:

int ushort = (int)(shortData[x][y]) & 0xFFFF;
0 голосов
/ 07 ноября 2010

С BufferedImage вы можете прочитать

public static final int TYPE_USHORT_GRAY

Представляет неподписанное короткое изображение в градациях серого, не проиндексированное). Это изображение имеет ComponentColorModel с CS_GRAY ColorSpace.

Так что попробуйте создать свой собственный ColorSpace с типом CS_GRAY (я думаю, ColorSpace.getInstance(ColorSpace.CS_GRAY) должен сделать это). Этот объект имеет метод с именем fromRGB, который вы должны использовать ...

...