2010-11-07 2 views
3

Я пытаюсь записать 16-битные изображения в оттенках серого в png, используя BufferedImage.TYPE_USHORT_GRAY. Обычно я пишу к изображению, например, так:Запись в 16 бит 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)?

+4

Попробуйте использовать Растр напрямую? – 2010-11-07 07:51:26

+0

Хм, почему я не подумал об этом ... кажется, работает нормально, спасибо! (можете ли вы ответить как ответ, чтобы я мог его принять?) – FinalArt2005

ответ

1

Как пст уже комментировал ниже моей вопрос, который мне нужно было сделать, - это напрямую обратиться к Раструю. Задача решена!

0

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

общественного статического конечного ИНТ TYPE_USHORT_GRAY

Представляет беззнаковое короткое черно-белое изображение, не индексируется). Это изображение имеет ComponentColorModel с CS_GRAY ColorSpace.

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

+1

Не это просто преобразует данные sRGB в градацию серого? У меня уже есть данные в градациях серого, мне просто нужно сохранить пиксель за пикселем в BufferedImage с TYPE_USHORT_GRAY, чтобы я мог сохранить 16-битные данные. На данный момент мне нравится идея setRGB(), так как вы можете указать координату, которую хотите сохранить, но нет эквивалента saveGray(). Я могу просто установить 16-битные целые числа, используя setRGB(), но, оказывается, цветовая модель не интерпретирует это правильно. Есть ли способ преобразования 16-битного целого числа в значение, которое можно использовать с setRGB, который работает с цветовым пространством CS_GRAY? – FinalArt2005

0

Вы, вероятно, нужно расширить подписанные 16bit шорты Интс и удалить знак:

int ushort = (int)(shortData[x][y]) & 0xFFFF; 
+0

У меня уже есть неподписанные 16-битные int, я просто использую BufferedImage.TYPE_USHORT_GRAY как удобный способ сохранить материал в 16-битном оттенке серого png – FinalArt2005

Смежные вопросы