BufferedImage — 버퍼된 이미지

BufferedImage — 버퍼된 이미지 (java.awt.image)

접근 가능한 이미지 데이터 버퍼를 가진 Image를 나타내는 서브클래스예요. BufferedImageColorModel과 이미지 데이터의 Raster로 구성돼요.

출처: Java API Reference

본문

BufferedImagejava.awt.Image를 확장하고 WritableRenderedImage, Transparency 인터페이스를 구현해요.

Raster의 SampleModel에 있는 밴드의 수와 타입은 ColorModel이 색과 알파 컴포넌트를 나타내는 데 요구하는 수와 타입과 일치해야 해요. 모든 BufferedImage 객체는 왼쪽 위 모서리 좌표가 (0, 0)이에요. 따라서 BufferedImage를 구성하는 데 쓰는 모든 Raster는 minX=0이고 minY=0이어야 해요. 이 클래스는 Raster의 데이터 가져오기·설정 메서드와 ColorModel의 색 특성화 메서드에 의존해요.

이미지 타입 필드 (static final int)

이미지 타입은 다음처럼 미리 정의된 타입을 나타내요.

  • TYPE_CUSTOM — 인식되지 않는 사용자 정의 이미지 타입 (getType()의 반환값으로만 사용)
  • TYPE_INT_RGB — 8비트 RGB를 정수 픽셀로 패킹, 알파 없음 (DirectColorModel)
  • TYPE_INT_ARGB — 8비트 RGBA를 정수로 패킹, 알파와 프리멀티플라이(premultiply)되지 않음 (DirectColorModel)
  • TYPE_INT_ARGB_PRE — 8비트 RGBA를 정수로 패킹, 알파와 프리멀티플라이됨
  • TYPE_INT_BGR — Windows/Solaris 스타일 BGR, 알파 없음 (DirectColorModel)
  • TYPE_3BYTE_BGR — Windows 스타일 BGR을 3바이트에 저장, 알파 없음 (ComponentColorModel)
  • TYPE_4BYTE_ABGR — 8비트 RGBA, Blue·Green·Red 3바이트 + 알파 1바이트, 각 픽셀의 낮은 주소에서 A, B, G, R 순서로 인터리브
  • TYPE_4BYTE_ABGR_PRE — 위와 같지만 알파와 프리멀티플라이됨
  • TYPE_USHORT_565_RGB — 5-6-5 RGB (red 5비트, green 6비트, blue 5비트), 알파 없음 (DirectColorModel)
  • TYPE_USHORT_555_RGB — 5-5-5 RGB, 알파 없음 (DirectColorModel)
  • TYPE_BYTE_GRAY — unsigned byte 그레이스케일, 비인덱스 (CS_GRAY ColorSpace의 ComponentColorModel)
  • TYPE_USHORT_GRAY — unsigned short 그레이스케일, 비인덱스 (CS_GRAY)
  • TYPE_BYTE_BINARY — 불투명 byte-패킹 1·2·4비트 이미지. imageType 생성자로 만들면 두 색 {0,0,0}, {255,255,255}의 IndexColorModel로 1비트 이미지 생성
  • TYPE_BYTE_INDEXED — 인덱스 byte 이미지. 기본 sRGB에서 256색 6/6/6 컬러 큐브 팔레트(216-255는 그레이스케일)의 IndexColorModel 생성

알파가 불투명하지 않은 데이터를 TYPE_INT_RGB 같은 알파 없는 타입에 저장하면, AlphaComposite 문서에 설명된 대로 색 데이터를 비프리멀티플라이 형태로 조정하고 알파를 버려야 해요.

생성자

public BufferedImage(int width, int height, int imageType)

미리 정의된 타입 중 하나로 BufferedImage를 구성해요. 색 공간은 기본 sRGB예요.

public BufferedImage(int width, int height, int imageType, IndexColorModel cm)

TYPE_BYTE_BINARYTYPE_BYTE_INDEXED 타입으로 구성해요. TYPE_BYTE_BINARY면 컬러 모델의 항목 수로 픽셀당 비트 수를 결정해요(12개 항목은 1비트, 34개는 2비트, 5~16개는 4비트, 그 외에는 IllegalArgumentException).

예외: IllegalArgumentException — imageType이 두 타입이 아니거나, TYPE_BYTE_BINARY인데 컬러 맵이 16개를 초과할 때

public BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?,?> properties)

지정된 ColorModelRaster로 새 BufferedImage를 구성해요. Raster의 SampleModel 밴드 수·타입이 ColorModel 요구와 일치하지 않으면 RasterFormatException이 던져져요. 이 메서드는 알파 프리멀티플라이 상태에 맞춰 색 Raster 데이터를 알파로 곱하거나 나눌 수 있어요. 프로퍼티는 String/Object 쌍의 Hashtable로 설정할 수 있어요.

예외: RasterFormatException — 밴드 수·타입 불일치 / IllegalArgumentExceptionrastercm과 호환되지 않을 때

메서드 상세

getType() / getColorModel() / getRaster() / getSampleModel()

public int getType()
public ColorModel getColorModel()
public WritableRaster getRaster()
public SampleModel getSampleModel()

이미지 타입, ColorModel, WritableRaster, SampleModel을 각각 반환해요. getType()은 알려진 타입이 아니면 TYPE_CUSTOM을 반환해요.

getAlphaRaster()

public WritableRaster getAlphaRaster()

ComponentColorModel, DirectColorModel처럼 별도의 공간 알파 채널을 지원하는 ColorModel을 가진 BufferedImage의 알파 채널을 나타내는 WritableRaster를 반환해요. 알파 채널이 없으면 null을 반환해요. IndexColorModel은 알파를 룩업 테이블에 가지므로 공간적으로 분리된 알파 채널이 없어 null을 반환해요. 이 메서드는 새 WritableRaster를 만들지만 데이터 배열은 공유해요.

getRGB(int x, int y) / getRGB(startX, startY, w, h, rgbArray, offset, scansize)

public int getRGB(int x, int y)
public int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)

기본 RGB 컬러 모델(TYPE_INT_ARGB)과 기본 sRGB 색 공간의 정수 픽셀을 반환해요. 기본 모델이 이미지 ColorModel과 일치하지 않으면 색 변환이 일어나요. 반환 데이터의 각 색 컴포넌트는 8비트 정밀도만 있어요. 좌표가 범위 밖이면 ArrayOutOfBoundsException이 던져질 수 있지만 명시적 경계 검사는 보장되지 않아요.

setRGB(int x, int y, int rgb) / setRGB(startX, startY, w, h, rgbArray, offset, scansize)

public void setRGB(int x, int y, int rgb)
public void setRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)

기본 RGB 모델(TYPE_INT_ARGB)과 sRGB 색 공간으로 픽셀(또는 픽셀 배열)을 설정해요. IndexColorModel 이미지는 가장 가까운 색의 인덱스가 선택돼요. 디더링은 일어나지 않아요(WARNING). 좌표가 범위 밖이면 ArrayOutOfBoundsException이 던져질 수 있어요.

getWidth() / getHeight() / getWidth(observer) / getHeight(observer)

public int getWidth()
public int getHeight()
public int getWidth(ImageObserver observer)
public int getHeight(ImageObserver observer)

BufferedImage의 너비·높이를 반환해요. observer 버전에서 observer는 무시돼요.

getSource() / getGraphics() / createGraphics()

public ImageProducer getSource()
public Graphics getGraphics()
public Graphics2D createGraphics()

getSource()는 이미지 픽셀을 생성하는 ImageProducer를 반환해요. getGraphics()Graphics2D를 반환하지만 역호환성을 위해 존재해요. createGraphics()Graphics2D를 선언하기에 더 편리해요.

getProperty(String name) / getProperty(String name, ImageObserver observer)

public Object getProperty(String name)
public Object getProperty(String name, ImageObserver observer)

이름으로 이미지 프로퍼티를 가져와요. 정의되지 않으면 UndefinedProperty를, 아직 알려지지 않으면 null과 통지를 반환해요.

예외: NullPointerException — 프로퍼티 이름이 null일 때

getSubimage(int x, int y, int w, int h)

public BufferedImage getSubimage(int x, int y, int w, int h)

지정된 사각형 영역으로 정의되는 부분 이미지를 반환해요. 반환된 BufferedImage는 원본 이미지와 같은 데이터 배열을 공유해요.

예외: RasterFormatException — 지정된 영역이 이 BufferedImage에 포함되지 않을 때

isAlphaPremultiplied() / coerceData(boolean)

public boolean isAlphaPremultiplied()
public void coerceData(boolean isAlphaPremultiplied)

알파가 프리멀티플라이되었는지 반환해요(알파가 없으면 false). coerceData는 데이터가 isAlphaPremultiplied 상태와 일치하도록 강제해요. 색 raster 데이터를 알파로 곱하거나 나누며, 이미 맞는 상태면 아무것도 하지 않아요.

toString()

public String toString()

BufferedImage 객체와 값의 문자열 표현을 반환해요.

getSources() / getPropertyNames()

public Vector<RenderedImage> getSources()
public String[] getPropertyNames()

getSources()는 이 이미지의 직접 소스(직접 소스의 소스는 아님)인 RenderedImage 객체의 Vector를 반환해요. 정보가 없으면 null, 직접 소스가 없으면 빈 Vector를 반환해요. getPropertyNames()getProperty(String)이 인식하는 이름 배열 또는 null을 반환해요.

타일 관련 메서드

public int getMinX()       // 항상 0
public int getMinY()       // 항상 0
public int getNumXTiles()  // 항상 1
public int getNumYTiles()  // 항상 1
public int getMinTileX()   // 항상 0
public int getMinTileY()   // 항상 0
public int getTileWidth()
public int getTileHeight()
public int getTileGridXOffset() // 항상 0
public int getTileGridYOffset() // 항상 0
public Raster getTile(int tileX, int tileY)
public Raster getData()
public Raster getData(Rectangle rect)
public WritableRaster copyData(WritableRaster outRaster)
public void setData(Raster r)

getTile(tileX, tileY)은 tile 배열의 인덱스로 타일을 반환하며, 반환된 Raster는 라이브(live)라서 이미지가 바뀌면 갱신돼요. getData()getData(rect)는 이미지 데이터의 복사본을 반환해 이미지가 바뀌어도 갱신되지 않아요. copyData(outRaster)는 지정된 WritableRaster의 경계로 정해진 영역을 계산해 복사하며, outRasternull이면 적절한 WritableRaster를 만들어요. setData(r)는 이미지의 사각형 영역을 지정된 Raster 내용으로 설정하고 BufferedImage 경계로 클리핑돼요.

TileObserver 관련

public void addTileObserver(TileObserver to)
public void removeTileObserver(TileObserver to)
public boolean isTileWritable(int tileX, int tileY)
public Point[] getWritableTileIndices()
public boolean hasTileWriters()
public WritableRaster getWritableTile(int tileX, int tileY)
public void releaseWritableTile(int tileX, int tileY)

BufferedImage의 유일한 타일은 (0,0)이고 항상 쓰기로 체크아웃되어 있으므로, addTileObserver/removeTileObserver는 파라미터를 무시하고 아무것도 하지 않아요(이벤트를 디스패치할 수 없으므로). isTileWritable(0,0)은 항상 true, 다른 좌표는 IllegalArgumentException이에요. getWritableTileIndices()는 한 점 배열을 반환해요. getWritableTile/releaseWritableTile은 값 검사 없이 즉시 반환해요.

getTransparency()

public int getTransparency()

투명도를 반환해요. OPAQUE, BITMASK, TRANSLUCENT 중 하나예요. (1.5부터)

더 알아보기