하시려고 하는 작업이 그림에서 점을 읽어 내는것인가요??
Canvas는 TColor의 배열 이기 때문에 Canvas에서 바로 읽으면 되요.
union urgb {
TColor color;
struct {
BYTE r, g, b, s;
};
} rgb;
for (int x = 0; x < 100; x++) {
for (int y = 0; y < 100; y++) {
rgb.color = this->Canvas->Pixels[x][y];
}
}
제가 제대로 이해한것이라면 좋겠습니다... ^^
박찬신 님이 쓰신 글 :
: 안녕하세요.
: 소스상에 문제가 있는데 ..확인좀 부탁드려도 될까요?
:
: HDC hdc = CreateCompatibleDC(ImageViewer->Canvas->Handle);
: for(int dX = 0 ; dX < ImageViewer->Width ; dX++)
: {
: for(int dY = 0 ; dY < ImageViewer->Height ; dY++)
: {
: unsigned int nRGB[4] = {0,};
: TColor color1 = GetPixel(hdc,dX,dY);
: nRGB[1] = GetRValue(color1);
: nRGB[2] = GetGValue(color1);
: nRGB[3] = GetBValue(color1);
: }
: }
:
: 위와같이 GetPixel로 하나씩 이미지갖고오는걸
: 미리 저장해놓고 받아오면 빠르다고 하여
: 아래와 같이 변경해보았는데..
:
: HDC hdc = CreateCompatibleDC(ImageViewer->Canvas->Handle);
: //
: HBITMAP bitmap;
: BITMAP bm;
: bitmap = CreateCompatibleBitmap(hdc, ImageViewer->Width, ImageViewer->Height);
: GetObjectA(bitmap,sizeof(BITMAP), (LPSTR)&bm);
: BYTE *pData = NULL;
: pData = (BYTE*)malloc(bm.bmWidthBytes * bm.bmHeight);
: memset(pData, 0x00, bm.bmWidthBytes * bm.bmHeight);
: GetBitmapBits(bitmap, bm.bmWidthBytes * bm.bmHeight, pData);
: RGBQUAD *pRgb = (RGBQUAD*)pData;
: //
: int nPos = 0;
: for (int y = 0; y < bm.bmHeight; y++)
: {
: for (int x = 0; x < bm.bmWidth; x++)
: {
: nPos = x + (y * bm.bmWidth); //<-이런식으로 위치만 찾아서
:
: BYTE r = pRgb[nPos].rgbRed; //값을불러온다....
: BYTE g = pRgb[nPos].rgbGreen;
: BYTE b = pRgb[nPos].rgbBlue;
: }
: }
:
: 문제점은.
: 1. 값이 제대로 나오지 않습니다. (BYTE r,g,b 다 그냥 0으로만..ㅠㅠ)
:
: 2.반복돌다가 뻑이납니다.
: 예를들어 가로세로 100*100 이미지를 불러오게되면 돌려보면
: y가 91쯤 되면 죽어버립니다.
:
: 문제점이 뭔지 ..조언좀 부탁드립니다.
:
:
|