ComponentColorModel — 컴포넌트 색 모델
ComponentColorModel — 컴포넌트 색 모델 (java.awt.image)
색과 알파 정보를 별도의 샘플로 나타내고 각 샘플을 별도의 데이터 요소에 저장하는 픽셀 값과 함께 동작하는 ColorModel 클래스예요. 임의의 ColorSpace와 함께 쓸 수 있어요.
본문
ComponentColorModel은 java.awt.image.ColorModel을 확장하고 Transparency를 구현해요.
픽셀 값의 색 샘플 수는 ColorSpace의 색 컴포넌트 수와 같아야 하고, 단일 알파 샘플이 있을 수 있어요. transferType의 원시 배열 픽셀 표현을 쓰는 메서드의 경우 배열 길이는 색·알파 샘플 수와 같아요. 색 샘플이 배열에 먼저 저장되고 그 다음 알파 샘플(있으면)이 저장돼요. 색 샘플의 순서는 ColorSpace가 지정해요(예: TYPE_RGB면 인덱스 0=빨강, 1=초록, 2=파랑).
샘플 값을 표시용 색/알파 컴포넌트로 번역하는 것은 샘플과 컴포넌트의 일대일 대응에 기반해요. transfer type에 따라 샘플 값은 signed/unsigned, 정수 또는 float/double일 수 있어요.
- float/double 샘플: 정규화 컴포넌트 값이 샘플 값과 같아요(항등 변환).
- 정수 샘플 (TYPE_BYTE, TYPE_USHORT, TYPE_INT): unsigned 정수 값으로 취급돼요. 샘플 값은 0에서 2ⁿ-1까지이며(n은 컴포넌트의 유효 비트 수), 0은
ColorSpace.getMinValue값, 2ⁿ-1은getMaxValue값에 매핑돼요. 알파 샘플은 항상 0→0.0, 2ⁿ-1→1.0에 매핑돼요. - signed 샘플 (TYPE_SHORT, TYPE_FLOAT, TYPE_DOUBLE): 비정규화 컴포넌트 표현을 지원하지 않아요. float 샘플은 float 데이터 타입 전체 범위, short 샘플은 대략 -maxVal에서 +maxVal까지의 정규화 범위를 가져요.
비정규화 표현은 샘플 값 0이 정규화 0.0에, 2ⁿ-1이 1.0에 매핑되고, ColorSpace의 모든 색 컴포넌트 범위가 0.0~1.0일 때만 지원돼요. 이 조건을 만족하지 않으면 비정규화 인자를 받는 메서드는 IllegalArgumentException을 던져요.
애플리케이션은 렌더링 전에 색 컴포넌트가 ColorSpace의 정규화 범위 안에, 알파가 0.0~1.0 사이에 들도록 픽셀 데이터를 적절히 스케일링해야 해요. 그 밖으로 벗어나면 렌더링 결과가 정의되지 않아요.
단일 int 픽셀 표현을 쓰는 메서드는, 컴포넌트 수가 하나이고 그 값이 unsigned일 때(예: 알파 없는 단일 색 컴포넌트, TYPE_BYTE/USHORT/INT)를 제외하면 IllegalArgumentException을 던져요.
ComponentColorModel은 ComponentSampleModel, BandedSampleModel, PixelInterleavedSampleModel과 함께 써서 BufferedImage를 구성할 수 있어요.
생성자
public ComponentColorModel(ColorSpace colorSpace, int[] bits, boolean hasAlpha,
boolean isAlphaPremultiplied, int transparency, int transferType)
지정된 파라미터로 ComponentColorModel을 구성해요. 지원 transfer type은 TYPE_BYTE, TYPE_USHORT, TYPE_INT, TYPE_SHORT, TYPE_FLOAT, TYPE_DOUBLE예요. bits 배열은 컴포넌트당 유효 비트 수를 지정하며, null이면 모든 비트가 유효해요. transferType이 TYPE_SHORT/TYPE_FLOAT/TYPE_DOUBLE이면 bits 배열은 무시돼요. transparency로 OPAQUE, BITMASK, TRANSLUCENT를 받아요.
예외: IllegalArgumentException — bits가 null이 아니고 길이가 컴포넌트 수보다 짧은데 transferType이 BYTE/USHORT/INT일 때, 또는 transferType이 지원 타입이 아닐 때
public ComponentColorModel(ColorSpace colorSpace, boolean hasAlpha,
boolean isAlphaPremultiplied, int transparency, int transferType)
지정된 파라미터로 구성해요. 컴포넌트당 유효 비트 수는 transferType에 따라 8, 16, 32, 16, 32, 64가 돼요. (1.4부터)
메서드 상세
getRed(int pixel) / getGreen / getBlue / getAlpha / getRGB(int)
public int getRed(int pixel)
public int getGreen(int pixel)
public int getBlue(int pixel)
public int getAlpha(int pixel)
public int getRGB(int pixel)
지정된 픽셀의 색/알파 컴포넌트를 기본 sRGB에서 0~255로 스케일링해 반환해요. 반환값은 프리멀티플라이되지 않아요(알파가 프리멀티플라이면 나누고, 알파가 0이면 0).
예외: IllegalArgumentException — 컴포넌트가 하나를 초과하거나, 컴포넌트 값이 signed일 때
getRed(Object inData) / getGreen/getBlue/getAlpha/getRGB(Object)
public int getRed(Object inData)
...
public int getRGB(Object inData)
transferType 타입 원시 데이터 배열로 지정된 픽셀의 컴포넌트를 반환해요.
예외: ClassCastException — inData가 transferType 원시 배열이 아닐 때 / ArrayIndexOutOfBoundsException — 픽셀을 담기에 부족할 때 / UnsupportedOperationException — transfer type이 지원되지 않을 때
getDataElements(int rgb, Object pixel)
public Object getDataElements(int rgb, Object pixel)
기본 RGB 색 모델의 정수 픽셀 표현에서 이 ColorModel의 픽셀 데이터 요소 배열을 반환해요. WritableRaster.setDataElements에 전달할 수 있어요. pixel이 null이면 새 배열을 할당해요.
getComponents(int/Object pixel, int[] components, int offset)
public int[] getComponents(int pixel, int[] components, int offset)
public int[] getComponents(Object pixel, int[] components, int offset)
픽셀의 비정규화 색/알파 컴포넌트 배열을 반환해요. components가 null이면 새 배열을 할당하고, offset부터 저장해요.
예외: IllegalArgumentException — 비정규화 형태를 지원하지 않거나 컴포넌트가 하나를 초과할 때
getUnnormalizedComponents / getNormalizedComponents
public int[] getUnnormalizedComponents(float[] normComponents, int normOffset, int[] components, int offset)
public float[] getNormalizedComponents(int[] components, int offset, float[] normComponents, int normOffset)
public float[] getNormalizedComponents(Object pixel, float[] normComponents, int normOffset)
정규화 ↔ 비정규화 컴포넌트 변환을 수행해요. 이 클래스가 구현하는 기본 번역과 다른 방식으로 샘플 값을 색 컴포넌트 값으로 번역하려면 getNormalizedComponents(Object, float[], int)를 오버라이드해야 해요.
getDataElement(int[]/float[] components, int offset) / getDataElements(...)
public int getDataElement(int[] components, int offset)
public int getDataElement(float[] normComponents, int normOffset)
public Object getDataElements(int[] components, int offset, Object obj)
public Object getDataElements(float[] normComponents, int normOffset, Object obj)
컴포넌트 배열에서 int 픽셀 값(또는 데이터 요소 배열)을 반환해요.
coerceData(WritableRaster raster, boolean isAlphaPremultiplied)
public ColorModel coerceData(WritableRaster raster, boolean isAlphaPremultiplied)
raster 데이터를 isAlphaPremultiplied 상태에 맞춰요. 색 raster 데이터를 알파로 곱하거나 나누며, 데이터를 강제로 바꿔야 하면 알맞은 플래그를 가진 이 ColorModel 인스턴스를 반환해요.
예외: NullPointerException — raster가 null이고 데이터 강제 변환이 필요할 때 / UnsupportedOperationException — transfer type이 지원되지 않을 때
isCompatibleRaster(Raster) / createCompatibleWritableRaster(w,h) / createCompatibleSampleModel(w,h) / isCompatibleSampleModel(SampleModel)
public boolean isCompatibleRaster(Raster raster)
public WritableRaster createCompatibleWritableRaster(int w, int h)
public SampleModel createCompatibleSampleModel(int w, int h)
public boolean isCompatibleSampleModel(SampleModel sm)
이 ColorModel과 호환되는지 검사하고 호환되는 새 객체를 만들어요.
getAlphaRaster(WritableRaster raster)
public WritableRaster getAlphaRaster(WritableRaster raster)
입력 Raster에서 추출한 이미지의 알파 채널을 나타내는 Raster를 반환해요. 이 ColorModel에 연결된 Raster는 알파 밴드(있으면)를 이미지 데이터의 마지막 밴드로 저장한다고 가정해요. 별도의 공간 알파 채널이 없으면 null을 반환해요. 새 Raster를 만들지만 데이터 배열은 공유해요.
equals(Object) / hashCode()
지정된 객체가 ComponentColorModel의 인스턴스이고 이 객체와 같은지 검사하고, ComponentColorModel의 해시 코드를 반환해요.