Вопрос

Я пытаюсь написать 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top