ColorModel — 색 모델 추상 클래스

ColorModel — 색 모델 추상 클래스 (java.awt.image)

픽셀 값을 색 컴포넌트(예: 빨강, 초록, 파랑)와 알파 컴포넌트로 번역하는 메서드를 캡슐화하는 추상 클래스예요.

출처: Java API Reference

본문

ColorModeljava.lang.Object를 확장하고 Transparency 인터페이스를 구현해요. 직접 알려진 서브클래스로 ComponentColorModel, IndexColorModel, PackedColorModel이 있어요.

이미지를 화면, 프린터, 다른 이미지로 렌더링하려면 픽셀 값을 색과 알파 컴포넌트로 변환해야 해요. 이 클래스의 메서드 인자·반환값으로 픽셀은 32비트 int나 원시 타입 배열로 표현돼요. ColorModel의 색 컴포넌트 수·순서·해석은 ColorSpace가 지정해요. 알파 정보를 포함하지 않는 픽셀 데이터와 함께 쓰는 ColorModel은 모든 픽셀을 불투명(알파 1.0)으로 취급해요.

픽셀 표현과 transfer type

ColorModel 클래스는 픽셀 값의 두 가지 표현을 지원해요: 단일 32비트 int, 또는 원시 타입 배열. Java 2 플랫폼은 이미지를 표현하는 추가 클래스를 도입했는데, RasterSampleModel을 기반으로 하는 BufferedImage/RenderedImage 객체의 픽셀 값은 단일 int로 편리하게 표현되지 않을 수 있어요. 따라서 ColorModel은 원시 타입 배열로 표현된 픽셀 값을 받는 메서드를 가져요. 특정 ColorModel 객체가 사용하는 원시 타입을 transfer type 이라고 해요.

픽셀 값이 단일 int로 편리하게 표현되지 않는 이미지와 함께 쓰는 ColorModel 객체는 단일 int 픽셀 인자를 받는 메서드가 호출될 때 IllegalArgumentException을 던져요. (DirectColorModel이나 IndexColorModel에는 해당하지 않아요.)

현재 Java 2D API가 지원하는 transfer type은 DataBuffer.TYPE_BYTE, TYPE_USHORT, TYPE_INT, TYPE_SHORT, TYPE_FLOAT, TYPE_DOUBLE예요. 대부분의 렌더링 연산은 처음 세 타입 기반의 ColorModel/이미지에서 훨씬 빠르게 수행되고, 마지막 세 타입 기반의 일부 이미지 필터링 연산은 지원되지 않아요.

BufferedImage의 경우 Raster와 SampleModel의 transfer type이 ColorModel의 것과 일치해야 하고, 픽셀을 나타내는 배열 요소 수도 일치해야 해요.

정규화·비정규화 형태

ColorModel 메서드는 색·알파 컴포넌트의 정규화(normalized)비정규화(unnormalized) 두 표현을 사용해요.

  • 정규화 형태: 각 컴포넌트는 최소최대 사이의 float 값이에요. 알파는 최소 0.0최대 1.0. 색 컴포넌트의 최소·최대는 ColorSpace 객체에서 얻을 수 있고, 보통 0.0과 1.0이에요(기본 sRGB는 0.0~1.0). 정규화된 색 컴포넌트 값은 프리멀티플라이되지 않아요. 모든 ColorModel은 정규화 형태를 지원해야 해요.
  • 비정규화 형태: 각 컴포넌트는 0과 2ⁿ-1 사이의 unsigned 정수 값이에요(n은 컴포넌트의 유효 비트 수). 픽셀 값이 알파로 프리멀티플라이된 색을 나타내면 비정규화 색 컴포넌트 값도 프리멀티플라이돼요. 비정규화 형태는 모든 컴포넌트의 최소·최대가 0.0·1.0인 ColorSpace를 가진 ColorModel에서만 사용돼요. 이에 해당하지 않으면 IllegalArgumentException이 던져질 수 있어요.

필드

  • pixel_bits — 픽셀의 총 비트 수
  • transferType — 픽셀 값을 나타내는 배열의 데이터 타입

생성자

public ColorModel(int bits)

지정된 비트 수의 픽셀을 색/알파 컴포넌트로 번역하는 ColorModel을 구성해요. 색 공간은 기본 sRGB예요. 픽셀 값이 알파 정보를 포함한다고 가정하고, transparency 타입은 TRANSLUCENT예요. transfer type은 단일 픽셀을 담을 수 있는 TYPE_BYTE, TYPE_USHORT, TYPE_INT 중 가장 작은 것이에요(bits가 32보다 크면 TYPE_UNDEFINED).

예외: IllegalArgumentException — bits가 1보다 작을 때

protected ColorModel(int pixel_bits, int[] bits, ColorSpace cspace, boolean hasAlpha,
                     boolean isAlphaPremultiplied, int transparency, int transferType)

픽셀 값을 색/알파 컴포넌트로 번역하는 ColorModel을 구성해요. bits 배열은 컴포넌트당 유효 비트 수를 지정하고, 길이는 알파가 없으면 ColorSpace의 컴포넌트 수, 있으면 그보다 하나 많아야 해요. isAlphaPremultiplied가 true면 색 샘플이 알파 샘플로 곱해진 것으로 가정해요.

예외: IllegalArgumentException — bit 배열 길이가 컴포넌트 수보다 작거나, transparency가 유효하지 않거나, bits의 합이 1보다 작거나, 어떤 요소가 0보다 작을 때

메서드 상세

getRGBdefault()

public static ColorModel getRGBdefault()

정수 RGB 값의 기본 형식을 설명하는 DirectColorModel을 반환해요. 형식은 알파·빨강·초록·파랑 각각 8비트를 최상위 바이트부터 0xAARRGGBB 순서로 가지는 정수예요. 색 컴포넌트는 알파로 프리멀티플라이되지 않아요.

hasAlpha() / isAlphaPremultiplied()

public final boolean hasAlpha()
public final boolean isAlphaPremultiplied()

ColorModel이 알파를 지원하는지, 픽셀 값에서 알파가 프리멀티플라이됐는지 반환해요.

getTransferType() / getPixelSize() / getTransparency()

public final int getTransferType()
public int getPixelSize()
public int getTransparency()

각각 transfer type, 픽셀당 비트 수, 투명도(OPAQUE/BITMASK/TRANSLUCENT)를 반환해요.

getComponentSize(int componentIdx) / getComponentSize()

public int getComponentSize(int componentIdx)
public int[] getComponentSize()

지정된 인덱스(또는 모든) 색/알파 컴포넌트의 비트 수를 반환해요. 색 컴포넌트는 ColorSpace가 지정한 순서대로, 그 뒤에 알파가 있어요(예: TYPE_RGB면 인덱스 0=빨강, 1=초록, 2=파랑).

getNumComponents() / getNumColorComponents()

public int getNumComponents()
public int getNumColorComponents()

알파를 포함한 컴포넌트 수와 색 컴포넌트 수를 반환해요.

getRed(int pixel) / getGreen / getBlue / getAlpha / getRGB(int)

public abstract int getRed(int pixel)
public abstract int getGreen(int pixel)
public abstract int getBlue(int pixel)
public abstract int getAlpha(int pixel)
public int getRGB(int pixel)

지정된 픽셀의 색/알파 컴포넌트를 기본 sRGB에서 0~255로 스케일링해 반환해요. 필요하면 색 변환을 수행해요. 반환값은 프리멀티플라이되지 않아요(알파가 프리멀티플라이면 나누고, 알파가 0이면 색 값 0). 픽셀 값이 단일 int로 표현하기 불편하면 IllegalArgumentException이 던져져요.

getRed(Object inData) / getGreen/getBlue/getAlpha/getRGB(Object)

public int getRed(Object inData)
...
public int getRGB(Object inData)

transferType 타입의 원시 데이터 배열로 지정된 픽셀의 컴포넌트를 반환해요. inData가 transferType 원시 배열이 아니면 ClassCastException, 픽셀을 담기에 부족하면 ArrayIndexOutOfBoundsException, transferType이 지원되지 않으면 UnsupportedOperationException이 던져져요.

getDataElements(int rgb, Object pixel)

public Object getDataElements(int rgb, Object pixel)

기본 RGB 색 모델의 정수 픽셀 표현이 주어지면 이 ColorModel의 픽셀 데이터 요소 배열을 반환해요. 이 배열은 WritableRaster.setDataElements에 전달할 수 있어요. pixelnull이면 새 배열을 할당하고, 그렇지 않으면 transferType 원시 배열이어야 해요.

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)

ColorModel의 픽셀에 대한 비정규화 색/알파 컴포넌트 배열을 반환해요. 컴포넌트는 offset부터 저장돼요. componentsnull이면 새 배열을 할당해요.

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)

정규화 ↔ 비정규화 간 컴포넌트 배열을 변환해요. 색 컴포넌트 값이 비정규화 형태로 편리하게 표현되지 않으면 IllegalArgumentException이 던져져요.

getDataElement(int[]/float[] components, int offset)

public int getDataElement(int[] components, int offset)
public int getDataElement(float[] normComponents, int normOffset)

비정규화(또는 정규화) 컴포넌트 배열이 주어지면 int 픽셀 값을 반환해요.

getDataElements(int[]/float[] components, int offset, Object obj)

public Object getDataElements(int[] components, int offset, Object obj)
public Object getDataElements(float[] normComponents, int normOffset, Object obj)

컴포넌트 배열로부터 이 ColorModel의 픽셀 데이터 요소 배열을 반환해요. objnull이 아니면 transferType 원시 배열이어야 해요.

equals(Object) / hashCode()

이 클래스의 기본 구현은 Object의 기본 구현에 위임해요(서브클래스 분기 간 동등성 문제를 강제할 수 없으므로 == 테스트와 동일). 서브클래스는 알파 지원, 알파 프리멀티플라이 여부, 픽셀당 비트 수, 투명도 타입, 컴포넌트 수, ColorSpace 타입, 배열 타입, 컴포넌트당 유효 비트 수 등 공통 기본 속성을 오버라이드하도록 권장돼요.

getColorSpace() / coerceData(WritableRaster, boolean) / isCompatibleRaster(Raster) / createCompatibleWritableRaster(w,h) / createCompatibleSampleModel(w,h) / isCompatibleSampleModel(SampleModel)

public final ColorSpace getColorSpace()
public ColorModel coerceData(WritableRaster raster, boolean isAlphaPremultiplied)
public boolean isCompatibleRaster(Raster raster)
public WritableRaster createCompatibleWritableRaster(int w, int h)
public SampleModel createCompatibleSampleModel(int w, int h)
public boolean isCompatibleSampleModel(SampleModel sm)

getColorSpace()는 연결된 ColorSpace를 반환해요. coerceData는 raster 데이터를 isAlphaPremultiplied 상태에 맞추고, 데이터를 강제로 바꿔야 하면 알맞은 플래그를 가진 이 ColorModel의 인스턴스를 반환해요. isCompatibleRaster/isCompatibleSampleModel은 호환성 검사, createCompatibleWritableRaster/createCompatibleSampleModel은 호환되는 레이아웃의 새 객체를 만들어요. (이 추상 클래스의 구현은 UnsupportedOperationException을 던지므로 서브클래스가 오버라이드해야 해요.)

더 알아보기