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
[52991] Re:BMP 파일에서 데이타 부분을 RGB에서 RGBA로 바꿔 사용하려는데.. 도와 주세요.
0 [] 2090 읽음    2008-04-02 21:05
그 아이 님이 쓰신 글 :
: CString Path;                   // 읽어 들일 비트맵 경로   
:     HANDLE hFile;                   // 읽어들일 비트맵 파일 핸들
:     DWORD fileSize, dwRead;         // 비트맵 정보   
:     BITMAPFILEHEADER* bmpFileHeader;// 비트맵 파일헤더 구조체
:     BITMAPINFOHEADER* bmpInfoHeader;// 비트맵 인포헤서 구조체
:     long bmpWidth, bmpHeight;       // 비트맵 너비 높이
:     long bmpRealWidth;              // 비트맵은 실제로 메모리
:     RGBTRIPLE* rgbValue;            // 비트맵 픽셀 값
:
:
:         Path = odia.GetPathName();   // 파일 경로
:
:         // 파일 열기
:         hFile = CreateFile(LPSTR(LPCTSTR(Path)), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
:
:         if(hFile == INVALID_HANDLE_VALUE) {
:             AfxMessageBox("파일을 읽을 수 없습니다.\n파일을 확인 해 주세요!");
:             return;
:         }
:
:         fileSize = GetFileSize(hFile, NULL);                    // 파일사이즈 구함
:         bmpFileHeader = (BITMAPFILEHEADER*)malloc(fileSize);    // 파일 크기만큼 할당
:         ReadFile(hFile, bmpFileHeader, fileSize, &dwRead, NULL);// 핸들을 이용해 파일을 메모리로 복사
:         CloseHandle(hFile);
:
:         // 비트맵 정보 구조체의 포인터로 전환해 정보구조체를 사용 가능하도록 함
:         bmpInfoHeader = (BITMAPINFOHEADER*)((PBYTE)bmpFileHeader+sizeof(BITMAPFILEHEADER));
:
:         // 비트맵 정보 구조체를 이용해 비트맵의 가로 세로를 구함
:         bmpWidth = bmpInfoHeader->biWidth;
:         bmpHeight = bmpInfoHeader->biHeight;
:         // 비트맵은 실제 메모리에 저장된 데이터는 32비트 단위로 저장되기 때문에 나머지 부분을 맞추기 위해 실제 너비를 구한다.
:         bmpRealWidth = HBYTES(bmpWidth, 24);
:
:         // 비트맵의 실제 픽셀 값의 포인터를 얻음
:         rgbValue = (RGBTRIPLE*)((PBYTE)bmpFileHeader + bmpFileHeader->bfOffBits);
:
:         // 비트맵 픽셀을 참조해서 프로그래밍 함
:         // 비트맵은 정보가 뒤집어 져 있기 때문에
:         // 뒤집어서 출력 해야함
:         unsigned int a, b;
:         unsigned int size = bmpWidth*bmpHeight;
:         BYTE *ARGB = new BYTE[size];
:
:         b = 0;
:         for(a=0; a<size; ++a) {
:             rgbValue = (RGBTRIPLE*)((PBYTE)bmpFileHeader + bmpFileHeader->bfOffBits + a);
:             ARGB[b] = rgbValue->rgbtBlue;
:             b++;
:             ARGB[b] = rgbValue->rgbtGreen;
:             b++;
:             ARGB[b] = rgbValue->rgbtRed;
:             b++;
:             if(rgbValue->rgbtBlue == 0xFF && rgbValue->rgbtGreen == 0x00 && rgbValue->rgbtRed == 0xFF){
:                 ARGB[b] = 0x00;
:                 b++;
:             }
:             else{
:                 ARGB[b] = 0xFF;
:                 b++;
:             }
:         }
:
: ///// ARGB로 모두 바꿔 사용하려는 데 잘 안돼네요. 도와 주세요.


BYTE* ConvertToRGBA2(AnsiString SourcePath)
{
HANDLE hSourceFile;       // 비트맵 파일 핸들
DWORD dwRead;  // 비트맵 정보
BITMAPFILEHEADER bmfh;           // 비트맵 파일헤더 구조체
BITMAPINFOHEADER bmih;          // 비트맵 인포헤서 구조체
long bmpWidth, bmpHeight, x, y;       // 비트맵 너비 높이
long bytes_per_scanline;        // 비트맵은 실제로 메모리
RGBTRIPLE* pRGBT;            // 비트맵 픽셀 값
RGBQUAD *pResultImageRGBQ, *pRGBA, *pLastRGBQLine;
BYTE *pSourceImageData;

// 파일 열기
hSourceFile = CreateFile(SourcePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(hSourceFile == INVALID_HANDLE_VALUE) {
   ShowMessage("파일을 읽을 수 없습니다.\n파일을 확인 해 주세요!");
   return NULL;
}

ReadFile(hSourceFile, &bmfh, sizeof(bmfh), &dwRead, NULL);// 핸들을 이용해 파일을 메모리로 복사
ReadFile(hSourceFile, &bmih, sizeof(bmih), &dwRead, NULL);

if(bmih.biBitCount!=24){
   CloseHandle(hSourceFile);
   ShowMessage("24 비트 비트맵 파일이 아님");
   return NULL;
}

// 비트맵 정보 구조체를 이용해 비트맵의 가로 세로를 구함
bmpWidth = bmih.biWidth;
bytes_per_scanline = HBYTES(bmpWidth, 24);
bmpHeight = bmih.biHeight;
if(bmpHeight<0) bmpHeight *= -1;

pSourceImageData = new BYTE[bytes_per_scanline*bmpHeight];
SetFilePointer(hSourceFile,bmfh.bfOffBits,NULL,FILE_BEGIN);
ReadFile(hSourceFile, pSourceImageData, bytes_per_scanline*bmpHeight, &dwRead, NULL);
CloseHandle(hSourceFile);

pResultImageRGBQ = new RGBQUAD[bmpWidth*bmpHeight];
pLastRGBQLine = pResultImageRGBQ + bmpWidth*(bmpHeight-1);

for(y=0; y<bmpHeight; y++) {
   pRGBT = (RGBTRIPLE*)(pSourceImageData+y*bytes_per_scanline);
   if(bmih.biHeight<0) pRGBA = pResultImageRGBQ + y*bmpWidth;
   else pRGBA =  pLastRGBQLine - y*bmpWidth;
   for(x=0; x<bmpWidth; x++) {
     pRGBA[x].rgbBlue = pRGBT[x].rgbtBlue;
     pRGBA[x].rgbGreen = pRGBT[x].rgbtGreen;
     pRGBA[x].rgbRed = pRGBT[x].rgbtRed;
     if(pRGBT[x].rgbtBlue == 0xFF && pRGBT[x].rgbtGreen == 0x00 && pRGBT[x].rgbtRed == 0xFF){
       pRGBA[x].rgbReserved = 0x00;
     }else{                                    
       pRGBA[x].rgbReserved = 0xFF;
     }
   }//for(x
}//for(y

delete[] pSourceImageData;

// 결과 비트맵 데이터는 top-down
return (BYTE*)pResultImageRGBQ;
}

+ -

관련 글 리스트
52983 BMP 파일에서 데이타 부분을 RGB에서 RGBA로 바꿔 사용하려는데.. 도와 주세요. 그 아이 2809 2008/04/01
52991     Re:BMP 파일에서 데이타 부분을 RGB에서 RGBA로 바꿔 사용하려는데.. 도와 주세요. 0 2090 2008/04/02
53002         감사합니다. 그 아이 1059 2008/04/03
52986         실제로 제가 필요한 부분은 BYTE array가 필요합니다. 이것을 다른 Function에 넘겨야 해서요. 그 아이 1172 2008/04/02
52990             Re:실제로 제가 필요한 부분은 BYTE array가 필요합니다. 이것을 다른 Function에 넘겨야 해서요. 보리 1687 2008/04/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.