'MFC'에 해당되는 글 2건

  1. 2008.04.19 [MFC] 비트맵 파일 저장 (3)
  2. 2007.02.23 [MFC] EXE->DLL 호출에서 CString 리턴받고 싶을 때 (2)


 BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfoHeader;

 // BMP 헤더
 bmFileHeader.bfSize  = sizeof(BITMAPFILEHEADER);
 bmFileHeader.bfType  = 0x4D42;
 bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 
 bmInfoHeader.biSize    = sizeof(BITMAPINFOHEADER);
 bmInfoHeader.biWidth   = 320; // 너비
 bmInfoHeader.biHeight   = 240; // 높이
 bmInfoHeader.biPlanes   = 1;
 bmInfoHeader.biBitCount   = 24; // 색상 비트
 bmInfoHeader.biCompression = 0;
 bmInfoHeader.biSizeImage = bmInfoHeader.biWidth * bmInfoHeader.biHeight * (bmInfoHeader.biBitCount/8);

 bmInfoHeader.biXPelsPerMeter = 0;
 bmInfoHeader.biYPelsPerMeter = 0;
 bmInfoHeader.biClrUsed = 0;
 bmInfoHeader.biClrImportant = 0;

 // BMP는 아래에서 위로 저장되는 형식이기 때문에 순서대로 저장하면 뒤집히므로 파일로 저장할 데이터를 뒤집기
 SPixel* rgbTemp = new SPixel[BUFSIZE]; // 파일저장할 데이터를 보관할 임시공간
 for(int i=0; i<BUFSIZE; i++) {
  rgbTemp[i].r = g_rgb[BUFSIZE-1-i].r;
  rgbTemp[i].g = g_rgb[BUFSIZE-1-i].g;
  rgbTemp[i].b = g_rgb[BUFSIZE-1-i].b;
 }

 // 파일로 저장
 CFile file;
 file.Open(_T("파일명"), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite );
 file.Write(&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write(&bmInfoHeader, sizeof(BITMAPINFOHEADER));
 file.Write(rgbTemp, bmInfoHeader.biSizeImage);
 file.Close();
 
 delete rgbTemp;

 AfxMessageBox(strFilename + _T("\nwas saved"));

Posted by freezn
TAG MFC, 비트맵

댓글을 달아 주세요

  1. ㅇㅇ

    해당내용은 24비트 색상 bmp파일 저장이긴한데 BITMAPFILEHEADER에서 bfReserved1,2를 0으로 설정안해도 되나요? Default값이 52428이나오네요 bfSize또한 헤더의 크기가 아니라 파일 전체 사이즈를 적어야 하지 않나 싶어서 적어봅니다

    2018.05.10 11:19 [ ADDR : EDIT/ DEL : REPLY ]
    • 아이고, 창피하네요.
      10년전에 어리버리 끄적였던 기록이라 더듬어보니 말씀하신게 맞습니다.

      말씀하신대로 biSize 는 헤더크기가 아니라 파일크기가 들어가야 하고
      bfReserved1,2 는 0으로 초기화 되어야 합니다.

      2018.05.21 00:14 신고 [ ADDR : EDIT/ DEL ]
  2. Pixel* rgbTemp = new SPixel[BUFSIZE];

    에스픽셀은 상속해서 쓰는건지
    버퍼사이즈는 값이 어디에 선언되었는지 궁금합니다

    이 부분에대해서 설명 들을 수 있을까요??
    c++개발자는아닌데 급하게 고쳐야하는데 이부분을 모르겠어요 ㅠㅠ

    2019.08.20 09:59 신고 [ ADDR : EDIT/ DEL : REPLY ]

상황은 AFX DLL 을 사용하는 EXE에서 문자열을 리턴받고 싶을 때 이다.

Want :
// EXE에서 이런 형태로 사용하고 싶었다.
CString str = myDllClass.ToString();
//or... 좀 번거롭지만 이렇게라도 굳이 쓰고 싶었다.
CString str;
myDllClass.ToString(str);

So I Was : (Wrong)
CString ToString()
{
    return _T("merong~");
}
// and
void ToString(CString& str)
{
    str = _T("merong~");
}


이렇게도 해봤는데

릴리즈모드로 빌드한 EXE를 실행시 에러가 나지 않지만 디버그모드로 빌드한 EXE에서는
 
Error on Excute :
dbgheap.c
Line: 1044
Expression : _CrtlsValidHeapPointer(pUserData)
...

뭐 이런 에러가 나더라

찾아보니까 빌드시 DLL 의 CString 과 EXE의 CString 이 다르기 때문(자세한건 에러로 구글링해보면 나온다.) 이라는 결론이 나왔다.

곧 죽어도 CString 을 LPSTR로 변환시켜서 쓰고 싶진 않았던 터라 (그러기 싫어서 굳이 CString 따위를 사용했다)
const 도 여기저기 붙여보는 뻘짓을 했다.

CString 은 묵시적으로 LPCTSTR 로 변환이 가능하지?

그럼 굳이 const 인 LPCTSTR 을 LPSTR로 변환하지 않고도 사용할 수 있는건데...

결국 결론은 간단했다.

Right :
// AFX DLL 에서의 선언:
LPCTSTR ToString() {
    return _T("merong~");
}

// EXE 에서의 사용
CString str = myDllClass.ToString();



만세.

이걸 해결 못해서 하루 종일 낑낑댄 나는.... OTL

오늘의 교훈.
절대로 CString 을 써야만 하는 상황이 아니면 이따위것 쓰지 말자.
Posted by freezn
TAG CString, dll, MFC

댓글을 달아 주세요

  1. 푸른비

    훗.... 여전하군 ㅋㅋ

    성훈군의 에러스러운 코딩 스토리 인가?

    껄껄껄 난 휴가나와서 잠깐 둘러보러 왔삼 ㅋㅋㅋ

    2007.03.24 23:34 [ ADDR : EDIT/ DEL : REPLY ]