|
걍 RGB 만 뽑으면 되는건가요???
제가 질문을 잘못 이해한건지 모르겠습니다만, 이렇게 해보면 어떨까요??
TBitmap *bitmap = 거시기 있다 치고...
TColor color;
int i, j, pos = 0;
BYTE *ARGB = new BYTE[bitmap->Height * bitmap->Width];
for (i = 0; i < bitmap->Height; i++)
for (j = 0; j < bitmap->Width; j++) {
color = bitmap->Canvas->Pixels[i][j];
ARGB[pos++] = ((color >> 24) & 0xFF); //A
ARGB[pos++] = (color & 0xFF); //R
ARGB[pos++] = ((color >> 8) & 0xFF); //G
ARGB[pos++] = ((color >> 16) & 0xFF); //B
}
게시판에서 직접 코딩한거라 될지는 모르겠네요... ;;;
이것보다 빠른 방법을 여기 게시판에서 본 듯 한데 기억이 안나네요...
근데, SRGB아닌가요???
그 아이 님이 쓰신 글 :
: 즉 BMP의 데이타 부분을 그대로 RGBA로 바꿔 이를 인자로 넘겨야 하는데
: for loop를 돌려 바꾸는 부분을 잘 이해하지 못했습니다.
: 급하게 하는 바람에 여기에 도움을 청하는 것이니 도와 주십시요.
:
:
: Lyn 님이 쓰신 글 :
: : TImage 하나 올려놓고 형식을 32비트로 설정하면 자동으로 바뀝니다 =_=a
: :
: : 그 아이 님이 쓰신 글 :
: : : 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로 모두 바꿔 사용하려는 데 잘 안돼네요. 도와 주세요.
|