|
부산.... 월천.... 박영목입니다. 반갑습니다.....
어제 회사 이사... 좀 어수선 하네요... 그래서 답변할 시간이 생겼습니다.... ㅋㅋㅋㅋ
파일로 어떤 포멧을 저장하려고 한다(뭐 공인된, 자기가 만든 간단한 파일DB나 환경파일은 그냥 그렇게 하셔도
됩니다. 자기가 아니까 ㅋㅋㅋ)
자기가 만들지 않은 포멧은 이런씩으로 하면 안되지요. sizeof(BITMAPFILEHEADER) 이런 표현 사용하지 마세요...
그냥 레퍼런서에 있는 구조체 보고 수작업으로 계산해서 넣어 주세요.
sizeof()로 자동 계산하게 되면 시스템의 속도 최적화를 위해 정확한 크기 또는 보다 더 큰 값을 리턴합니다.
(수정함, 집에 와서 읽어보니 위의 3줄이 좀 이상하게 표현되었네요... ㅋㅋㅋ sizeof는 정확하게 크기를 리턴한는데
구조체를 할당하게 되면 메모리를 정확한 크기 또는 보다 더 큰 값으로 할당합니다. 쓸 때, 읽을 때 주의가 필요함, 통신할 때도 주의.... 특희 다른 기종 또는 언어... 물러갑니다.... 아~~ 피곤하다.... )
이것을 그대로 사용하게 되면 포멧이 틀어져 버립니다. 그리고 이런 작업을 할 때는
HEXEDITOR를 꼭 사용하세요... 아주 쉽게 됩니다(그래도 몇시간 가겠지요).
원래의 BMP가 있어야겠지요.... 그림판에서 잘 읽혀지는...
그것을 읽어들여서 파일헤드, BMP헤드, 파레트, DATA 분해 해보고 헥사에티트로 비교해 보고...
그것을 역으로 파일로 씁니다. 쓴 것을 다시 헥사에디터로 읽어 들여서 원본과 비교합니다. 정말 똑같이 1 Byte도
다른 것 없이 동일하다면... 그림판에서 읽혀지겠지요... 그럼 끝입니다. 원리를 알면 간단합니다.
파일로 쓰는 작업을 할 때는 HEXEDITOR 꼭 제발 사용하세요(네트웍 프로그램 할 때는 스나퍼 같은 것 사용하는
것처럼)... 요즘 프로그래머들 안 사용해서 마음이 아픔...
그리고 여기서 필요한 것은 HEXEDITOR와 약간의 실험(코딩), 관찰입니다. 쉽게 될 수 있습니다.
계속 도전해 보십시오...
부산에서.... 월천.... 박영목 올렸습니다.
김재범 님이 쓰신 글 :
: 책의 11장에 있는 샘플 추출하는 프로그램인데요..
: VC++로 되어 있는것을 볼렌드로 고치는데 힘드네요.
: 디버그모드로 확인해 봤는데요..
: pszFileName 에는 지금 파일이랑 \0\0\0\0\0 .. 이 저장되네요..
: 그래고 아래에 WriteFile에서 쓰지를 못해요.
: 필요업는건 뺀다고 빼고 수정 햇는데 뭐가 잘못 된건지..첫번째 WriteFile 에서 return; 되어서
: 그 다음은 실행이 안되네요...
:
: #define DEFAULT_MEDIA_PATH TEXT("\\\0")
: #define DIB_HEADER_MARKER ((WORD)('M'<<8) | 'B')
:
: void __fastcall TForm1::SaveImage(BITMAPINFOHEADER& bmiHeader, BYTE* pDIB)
: {
: SaveDialog1->Execute();
: char pszFileName[MAX_PATH] = "";
: AnsiString cFileName = SaveDialog1->FileName;
: strcpy(pszFileName, cFileName.c_str());
:
:
: BITMAPFILEHEADER bmfHeader;
:
: bmfHeader.bfType = DIB_HEADER_MARKER;
: bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
: bmfHeader.bfSize = sizeof(bmfHeader) + sizeof(BITMAPINFOHEADER) + bmiHeader.biSizeImage;
: bmfHeader.bfReserved1 = 0;
: bmfHeader.bfReserved2 = 0;
:
: HANDLE fd = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL,
: CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
:
: DWORD dwLength;
:
: if(!WriteFile(fd, (LPSTR)&bmfHeader, sizeof(bmfHeader), &dwLength, NULL));
: return;
: if(!WriteFile(fd, (LPSTR)&bmiHeader, sizeof(BITMAPINFOHEADER), &dwLength, NULL));
: return;
: if(!WriteFile(fd, pDIB, bmiHeader.biSizeImage, &dwLength, NULL));
: return;
:
: CloseHandle(fd);
: }
|