Как работать с цветовым пространством BufferedImage и YCbCr? - PullRequest
0 голосов
/ 06 мая 2010

Мне нужно перевести цвета в битовой карте, загруженной в BufferedImage, из RGB в YCbCr (яркость и цветность двух каналов) и обратно после обработки.

Я сделал это с помощью функций, таких как rgb2ycbcr () в методе main для каждого пикселя, но это не очень разумное решение. Я должен использовать классы ColorSpace и ColorModel, чтобы получить BufferedImage с правильным цветовым пространством. Это был бы более гибкий метод, но я не знаю, как это сделать.

Я заблудился, и мне нужны советы. Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 06 мая 2010

Как я понял ваш вопрос, вы хотите сделать следующее:

Загрузка изображения RGB -> обработка изображения YCbCr -> Повторное использование изображения RGB

И вы хотите, чтобы мы помогли вам сделать этот процесс максимально бесшовным. Прежде всего, вы хотите, чтобы мы предоставили вам простой способ избежать -> (конвертирования) деталей.

Ну, я заглянул в BufferedImage документацию . Кажется, будто не существует способа изменить ColorSpace некогда созданного BufferedImage.

Вы можете создать новый BufferedImage с цветовым пространством YCbCr, для которого вы можете использовать предопределенный ICC_ColorSpace. Затем вы копируете данные из старого изображения, возможно, через ColorSpace.fromRGB в цветовое пространство YCbCr, выполняете обработку изображения и затем снова конвертируете через ColorSpace.toRGB. Этот метод требует от вас полностью преобразовать изображение до и после обработки с помощью существующих методов. Кроме того, вы должны знать, как ICC_ColorSpace преобразует ваше изображение в цветовое пространство YCbCr. В противном случае вы не можете знать, какие индексы массива соответствуют одному и тому же пикселю.

Если вы просто хотите создать оболочку вокруг RGB- BufferedImage, которая позволяет вам манипулировать этим изображением, как если бы это было изображение YCbCr, это невозможно с BufferedImage.

EDIT: Для преобразования цветового пространства в BufferedImage используйте ColorConvertOp. Код будет выглядеть примерно так:

ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null);
BufferedImage ycbcrImage = cco.filter( oldRGBImage, null );

Для этого вам нужно либо написать свой собственный класс ColorSpace, либо вы можете скачать и использовать упомянутые классы здесь . Если вы просто хотите загрузить изображение JPEG, вам следует использовать предопределенные классы .

...