|
관심있게 답변해 주셔서 진심으로 감사드립니다.
그런데 말씀하신데로 해도 정상 출력이 안되네요.
RGBA RGBA RGBA 형태로 데이터가 들어가 있어야지만 정상 출력이 됩니다.
제가 사용하는 카메라에서 데이터가 8비트 * 3채널(24비트)로 얻어지기 때문에
데이터 옮기는 시간 좀 줄여보려고 어떻게 안되나 했는데 더 알아봐야겠네요.
감사합니다~
크레브 님이 쓰신 글 :
: 24비트에서 width가 4의 배수이면 괜찮다고 하셨죠?
:
: 만약 가로가 3픽셀이라면..32비트 이미지의 1라인 데이터는 이런식으로 배열될 겁니다.
: RGBA RGBA RGBA
: 12바이트가 되죠..
:
: 4의 배수라는 것은 1라인의 메모리 바이트수가 4의 배수여야 한다는 말입니다. ( 추측 )
:
: 따라서 같은 가로 길이가 3픽셀 인 이미지의 24비트 데이터는
:
: RGB RGB RGB
: 로 9바이트 밖에 안되기 때문에
: 보통 이미지 버퍼들은 다음과 같이 3바이트의 안쓰는 메모리를 더 할당할겁니다.
: RGB RGB RGB XXX
: 여기서 X는 메모리만 할당된 안쓰는 공간이죠.
: 왜냐면 CPU가 32비트로 4바이트 단위로 연산을 하기 때문이죠
:
: 따라서 이미지 버퍼도 정확한 사이즈로 만드는게 아니라 위와 같이
: 안쓰는 공간까지 포함해서 만들어야 할겁니다.
:
: 만약 픽셀수가 3 x 4 이고 펙셀당 24비트 데이터라면 다음과 같이 말이죠
: RGB RGB RGB XXX
: RGB RGB RGB XXX
: RGB RGB RGB XXX
: RGB RGB RGB XXX
:
: 총 메모리가 9 바이트 * 4 = 36이 아니라 .. 12바이트 * 4 = 48 이 되고
: image_buf 에 이미지를 넣을때는 위와 같이 위치를 맞추어서 넣어야 하겠죠
:
: 이해가 되셨는지 모르겠네요.
: 아무튼.. 직접 해본게 아니고 이미지 밀리는것을 보고 단지 추측하는것이니까
: 그냥 참고만 하세요 ^^
:
:
:
: 김정현 님이 쓰신 글 :
: : 답변 감사합니다.
: :
: : 8비트 4채널 이미지(즉 32비트)는 출력이 잘되네요.
: : 그렇다면 가지고 있는 이미지가 24비트 버퍼라면
: : 무조건 32비트 버퍼로 옮겨서 bmiHeader.biBitCount = 32 로 하여
: : StretchDIBits() 함수를 수행해야하는건가요?
: : 아니면 24비트 버퍼 이미지를 정상적으로 뿌려주는 다른 방법은 없는건가요?
: :
: : 다시 한번 답변 부탁 드립니다.
: : 감사합니다.
: :
: :
: :
: :
: : 크레브 님이 쓰신 글 :
: : : 직접 해보지는 않았지만...
: : : 이미지 프로세싱에서 윈도우즈 OS가 32 bit 이기 때문에
: : : 버퍼의 가로 크기를 4바이트 단위로 잡아야 하는게 아닌가 합니다.
: : : 예를들어 이미지 버퍼의 크기가 10 * 6 (pixels) 라면
: : : 그대로 버퍼를 할당하지 말구 4의 배수인 12 * 6 (pixels) 로
: : : 할당해서 사용하면 괜찮을것 같습니다.
: : :
: : :
: : : 김정현 님이 쓰신 글 :
: : : : TImage에 buffer에 있는 이미지 데이터를 뿌려주려고 합니다.
: : : :
: : : : 그런데 이상한 점은 buffer의 width가 4의 배수인 경우에만 정상 출력되고
: : : : 아닌 경우에는 틀어져서 나옵니다.
: : : :
: : : : 이유를 모르겠네요. 꼭 좀 가르쳐주세요.
: : : :
: : : :
: : : : m_bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
: : : : m_bmiHeader.biWidth = image_width;
: : : : m_bmiHeader.biHeight = image_height;
: : : : m_bmiHeader.biPlanes = 1;
: : : : m_bmiHeader.biBitCount = 24;
: : : : m_bmiHeader.biCompression = BI_RGB;
: : : : m_bmiHeader.biSizeImage = width * height * 3;
: : : : m_bmiHeader.biXPelsPerMeter = 0;
: : : : m_bmiHeader.biYPelsPerMeter = 0;
: : : : m_bmiHeader.biClrUsed = 0;
: : : : m_bmiHeader.biClrImportant = 0;
: : : :
: : : : Image->Width = image_width;
: : : : Image->Height = image_height;
: : : : Image->Picture->Bitmap->Width = image_width;
: : : : Image->Picture->Bitmap->Height = image_height;
: : : :
: : : : SetStretchBltMode(Image->Handle, COLORONCOLOR);
: : : : int nRtn = StretchDIBits( Image->Canvas->Handle,
: : : : 0, 0, Image->Width, Image->Height,
: : : : 0, 0, image_width, image_height,
: : : : image_buffer, (LPBITMAPINFO)&m_bmiHeader,
: : : : DIB_RGB_COLORS, SRCCOPY);
|