|
이미지의 픽셀 포맷이 8비트나 24비트, 32비트일 경우라면 TBitmap 클래스의 ScanLine 프로퍼티를 이용해서 데이터 단위로 직접 처리하는 방법도 있습니다(16비트일 경우는 조금 비추). 이 프로퍼티는 void* 형태로 리턴되는데, 이것을 원하는 형태로 캐스팅해서 사용하면 됩니다.
예를 들어 이미지가 24비트일 경우,
Graphics::TBitmap* Bmp = new Graphics::TBitmap;
....
unsigned char* CurrentLine = (unsigned char *)(Bmp->ScanLine[0]); //해당 이미지의 첫번째 행을 구성하는 메모리를 가리키는 포인터.
unsigned char BValue = CurrentLine[0]; //블루
unsigned char GValue = CurrentLine[1]; //그린
unsigned char RValue = CurrentLine[2]; //레드
....
이런 식으로 구성됩니다.
만약 (0,0) 좌표의 색을 RGB(128, 72, 111)로 변경하고 싶을 경우,
...
CurrentLine = (unsigned char *)(Bmp->ScanLine[0]);
CurrentLine[0] = 111;
CurrentLine[1] = 72;
CurrentLine[2] = 128;
...을 입력하면 됩니다.
좌표가 (10, 25)이라면
CurrentLine = (unsigned char *)(Bmp->ScanLine[25]);
CurrentLine[10 + 0] = 111;
CurrentLine[10 + 1] = 72;
CurrentLine[10 + 2] = 128;
...라는 형식이 됩니다.
이용태 님이 쓰신 글 :
: Pixels[][] 함수..
:
: 즉.. 이미지상에 원하는 지점의 픽셀에 원하는 색을 칠하는 함수입니다.
:
: 데이터 파일에서 데이터를 계산하여 나온 값을 컬러변환(0~255)하여 각 픽셀마다 찍어주는 작업을 하고 있는데요...
:
: 픽셀마다 데이터파일의 데이터가 다르므로 이 작업은 픽셀마다 매번 반복됩니다.
:
: 그런데 계산을 한 후, 픽셀에 색을 찍는 속도가 느린거 같습니다.
:
: 혹 Pixels[][]보다.. 더 빠르게 픽셀에 값을 찍어주는 함수가 있는지 궁금합니다.
:
: 간단한 예제도 첨부해주신다면 더욱 좋겠습니다..;;;
:
: 답변 부탁드립니다.
|