|
장동훈 님이 쓰신 글 :
: 안녕하세요 지난번에 폼에 그림그리기 질문 "39207 - 답변" 정말 감사드립니다..
:
: 결국 스크롤 박스와 TImage를 사용하여 스크롤 이 되게 하였습니다..
:
: 근데 여기서 약간의 문제가 생기는군여
: 화면에 그리고 스크롤은 되는데 가끔 11M짜리 bmp를 읽어드리는데 가끔 이것이 읽어지지 않을때가 있습니다..
:
: 몇번 반복해서 읽으면 처음은 되나 3번째 정도 부터 이미지가 나오지 않고 화면이 흰색으로 변하더군
:
: 그리고 메모리가 계속 증가하는것을 느낄수 있었습니다.. 약 0.1메가정도씩 분명 파일을 닫을때 메모리는 다 풀어주는
: 이상하더군여 그리고 vs에서는 f4누르면 에러난부분으로 점프가 되는데 빌더에서는 이런단축키가없는지여 찾아봐도 없고 검색해도 도통 안나오더군여 아시는분좀 가르쳐 주세요
:
: 지난번이랑 바뀐부분은
:
: ---화면에 bmp그리기 ---
: HDC hdc;
:
: //이미지 내용지우기
: SMain->Image1->Canvas->FillRect(SMain->Image1->Canvas->ClipRect); <-결국 무식하게 지우고 있습니다.
: //SMain->Image1->Picture->Assign(NULL);
:
: hdc = SMain->Image1->Picture->Bitmap->Canvas->Handle;
: SMain->bmp.DrawBitmapDC(hdc,0,0);
: ------
:
: 이고 bmp로딩 부분은
:
: ----bmp 선언부
: public: *filename;
: BITMAPFILEHEADER *bmpfh; //비트맵 파일 해더
: BITMAPINFOHEADER *bmpih; //비트맵 해더 정보
: RGBQUAD *rgbq;
: BYTE *img;
:
: ----bmp 읽어오기
: //KMsg msg;
:
: byte *buffer;
: FILE *fp;
: unsigned short bitcount= 0;
: DWORD size;
:
: ResetBmp();
:
: if(!(fp=fopen(filename,"rb")))
: {
: //msg->Message(NULL,"%s 읽기 실패",filename);
: return 1;
: }
:
: if(!(bmpfh = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER))))
: {
: fclose(fp);
: return 2;
: }
:
: if(!(fread(bmpfh,sizeof(BITMAPFILEHEADER),1,fp)))
: {
: //ResetBmp();
: fclose(fp);
: return 3;
: }
:
: if(bmpfh->bfType != 0x4D42)
: {
: //ResetBmp();
: fclose(fp);
: return 4;
: }
:
: //BITMAPINFORHEADER의 메모리만 확보
: size = bmpfh->bfOffBits-sizeof(BITMAPFILEHEADER);
: if(!(bmpih = (BITMAPINFOHEADER *)malloc(size)))
: {
: //ResetBmp();
: fclose(fp);
: return 5;
: }
:
: if(!fread(bmpih,size,1,fp))
: {
: //ResetBmp();
: fclose(fp);
: return 6;
: }
:
: if(bmpih->biCompression) //압축되지 않은 파일만
: {
: //ResetBmp();
: fclose(fp);
: return 7;
: }
:
: if(bmpih->biSize != sizeof(BITMAPINFOHEADER))
: {
: //ResetBmp();
: fclose(fp);
: return 8;
: }
:
: //압축 타입 판별
: switch(bmpih->biBitCount)
: {
: case 1:
: bitcount = 2;
: break;
: case 4:
: bitcount = 16;
: break;
: case 8:
: bitcount = 256;
: break;
: case 24:
: case 32:
: bitcount = 0;
: break;
: default:
: //ResetBmp();
: fclose(fp);
: return 9;
: }
:
: //RGBQUAD 얻어오기
: if(bitcount)
: {
: buffer = (byte *)bmpih;
: rgbq = (RGBQUAD *)(buffer+sizeof(BITMAPINFOHEADER));
: }
:
: size = bmpih->biSizeImage;
: if(size ==0)
: {
: size = ((DWORD)bmpih->biWidth*bmpih->biBitCount+31)/32*4;
: size = size *bmpih->biHeight; //압축안됨
: }
:
: if(!(img = (BYTE *)malloc(size)))
: {
: //ResetBmp();
: fclose(fp);
: return 10;
: }
:
: fread(img,size,1,fp);
:
: fclose(fp);
:
: if(!(filename = (char *)malloc(strlen(filename)+1)))
: {
: //ResetBmp();
: return 11;
: }
: strcpy(filename,filename);
:
: return 0;
:
: -----------------
:
: 이렇게 합니다. 처음에 초기화를 다시켜주고 만약 에러가 나면 메모리는다 리셋됩니다...
할당된 메모리를 ResetBmp();에서 제대로 해제한다는 가정하에,
메모리 문제에 대해 아래 사항 외에는 특별히 이상한 점은 발결한 수 없군요.
기존에 filename이 있는 경우 해제하지도 않고 다시 메모리를 할당하고 있습니다.
기존에 filename이 없는 경우 strlen에서 잘못된 길이가 반환 될 것이구요.
그리고, strcpy(filename,filename);로는 무엇을 하시겠다는 것인지....
한편, 비트맵의 biBitCount에는 16bit도 있습니다.
|