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
[39337] TImage 사용하여 이미지 그리기..
장동훈 [] 1443 읽음    2005-03-02 17:07
안녕하세요 지난번에 폼에 그림그리기 질문 "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;

-----------------

이렇게 합니다. 처음에 초기화를 다시켜주고 만약 에러가 나면 메모리는다 리셋됩니다...

+ -

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