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
[52983] BMP 파일에서 데이타 부분을 RGB에서 RGBA로 바꿔 사용하려는데.. 도와 주세요.
그 아이 [tsirorret] 2808 읽음    2008-04-01 18:59
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로 모두 바꿔 사용하려는 데 잘 안돼네요. 도와 주세요.

+ -

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