Напишите на 16 бит bufferedimage type_ushort_gray
-
29-09-2019 - |
Вопрос
Я пытаюсь написать 16 -битную серого имагедата в PNG с использованием BufferedImage.type_ushort_gray. Обычно я пишу на изображение как SO:
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)?
Решение
Как PST уже прокомментировал ниже мой вопрос:
Попробуйте использовать растровый напрямую?
Доступ к расту непосредственно решил проблему.
Другие советы
От BufferedImage
ты можешь читать
Public Static Final int type_ushort_gray
Представляет собой неподписанное короткое изображение серого, неиндексированное). Это изображение имеет ComponentColormodel с CS_GRAY Colorspace.
Так что попробуйте создать свое собственное ColorSpace
с CS_GRAY
тип (ColorSpace.getInstance(ColorSpace.CS_GRAY)
Должен сделать это, я полагаю). Этот объект имеет метод под названием fromRGB
который вы должны быть в состоянии использовать ...
Вам, вероятно, нужно расширить подписанные 16 -битные шорты до INT и удалить знак:
int ushort = (int)(shortData[x][y]) & 0xFFFF;