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
[39340] Re:TImage 사용하여 이미지 그리기..
[] 1699 읽음    2005-03-02 19:44
장동훈 님이 쓰신 글 :
: 안녕하세요 지난번에 폼에 그림그리기 질문 "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도 있습니다.

+ -

관련 글 리스트
39337 TImage 사용하여 이미지 그리기.. 장동훈 1443 2005/03/02
39340     Re:TImage 사용하여 이미지 그리기.. 1699 2005/03/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.