2010-05-06 4 views
0

RGB에서 YCbCr (루미넌스 및 2 채널 크로 미 넌스) 및 프로세스 후 과정에서 BufferedImage로로드 된 비트 맵의 ​​색상을 변환해야합니다.BufferedImage 및 YCbCr 색상 공간을 사용하는 방법은 무엇입니까?

주요 방법으로 각 픽셀에 rgb2ycbcr()과 같은 함수를 사용하여 만들었지 만 그렇게 똑똑한 해결책은 아닙니다. ColorSpace 및 ColorModel 클래스를 사용하여 올바른 색상 공간으로 BufferedImage를 가져와야합니다. 좀 더 유연한 방법이지만, 어떻게 해야할지 모르겠습니다.

나는 길을 잃었으며 팁이 필요합니다. 누군가 나를 도울 수 있습니까?

답변

2

내가 질문을 알 수있는 바와 같이, 당신은 다음을 수행 할 :

로드 RGB 이미지 ->과정의 YCbCr 이미지 ->를 사용하여 RGB 이미지를 다시

는 그리고 당신은 우리를 원하는 이 프로세스를 가능한 한 매끄럽게 만드는 데 도움을줍니다. 무엇보다도 먼저 -> (변환) 부품을 피할 수있는 간단한 방법을 제공하기를 바랍니다.

그럼 내가 BufferedImage documentation을 들여다 보았습니다. 마치 한 번에 ColorSpace을 변경하는 방법이없는 것처럼 보입니다. BufferedImage.

미리 정의 된 ICC_ColorSpace을 사용할 수있는 YCbCr 색 공간으로 새 BufferedImage을 만들 수 있습니다. 그런 다음 이전 이미지의 데이터를 ColorSpace.fromRGB을 통해 YCbCr 색 공간으로 복사 한 다음 이미지 처리를 수행 한 다음 ColorSpace.toRGB을 통해 다시 변환합니다. 이 방법을 사용하려면 기존 방법으로 처리하기 전과 후에 이미지를 완전히 변환해야합니다. 또한 ICC_ColorSpace이 YCbCr 색상 공간으로 이미지를 변환하는 방법을 알아야합니다. 그렇지 않으면 동일한 픽셀에 해당하는 배열 인덱스를 알 수 없습니다.

YCbCr 이미지 인 것처럼이 이미지를 조작 할 수있는 RGB-BufferedImage 주위에 래퍼를 만들고 싶다면 BufferedImage으로는 불가능합니다.

편집 : BufferedImage의 색 공간을 변환하려면 ColorConvertOp을 사용하십시오. 코드는 다음과 같을 것이다 : 이것은 자신의 ColorSpace 클래스를 작성하거나 당신을 필요로하거나 다운로드하고 클래스 here을 언급 사용할 수

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

. JPEG 이미지를로드하려는 경우 predefined classes을 사용해야합니다.

+0

하지만 여전히 어떻게 해야할지 모르겠습니다. 나는 길을 잃었고 수업의 문서 위에는 무엇이든 찾을 수 있습니다. 이것은 정적 함수와 매우 다릅니다. 어떤예요? JPEG 알고리즘 구현을 작성 중이고 조각화 전에 YCbCr 및 별도 채널로 변환해야합니다. 이제 저는 많은 배열과 함수로 작업하고 있습니다. 이것은 내가 원하는만큼 유연하지 않습니다. – Szopinski

+0

아마도'BufferedImage' 클래스는 당신이 찾고있는 것이 아닙니다. 절차 적 Jpeg (de-) 인코더가 더 많은 OOP- 같은 것을 시도해보고 싶다면 다른 것을 시도해보십시오. 하나의 가능성은 Jpeg (디) 인코딩 파이프 라인의 모든 단계에 대한 클래스를 만드는 것입니다. – ablaeul

+0

확인. 처음부터 :) 압축을하기 전에 이미지를 열고 Y, Cb, Cr 채널을 분리하고 각 채널을 조각화해야합니다. 그래서 getY(), getCb, getCr() 메소드 또는 각각에 대해 하나의 채널이있는 BufferedImage가 필요합니다. 그렇게하는 방법? – Szopinski

관련 문제