C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[56042] Re:Re:Re:TImage에 이미지 뿌리는 문제 해결 좀 해주세요
크레브 [kkol] 1501 읽음    2009-02-06 20:07
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);

+ -

관련 글 리스트
56016 TImage에 이미지 뿌리는 문제 해결 좀 해주세요 김정현 1393 2009/02/05
56026     Re:TImage에 이미지 뿌리는 문제 해결 좀 해주세요 크레브 1306 2009/02/06
56036         Re:Re:TImage에 이미지 뿌리는 문제 해결 좀 해주세요 김정현 1304 2009/02/06
56042             Re:Re:Re:TImage에 이미지 뿌리는 문제 해결 좀 해주세요 크레브 1501 2009/02/06
56079                 Re:Re:Re:Re:TImage에 이미지 뿌리는 문제 해결 좀 해주세요 김정현 1873 2009/02/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.