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
[49707] Re:TImage를 복사할때...
장성호 [nasilso] 1732 읽음    2007-06-25 11:23
여러가지 방법이 있는데요...

1. Canvas에 있는 함수를 이용하는 방법이 가장 일반적입니다.

CopyRect    ==> 가장 쉽고 직관적

    Image2->Picture->Bitmap->Width=200;
    Image2->Picture->Bitmap->Height=200;
    TRect t_rc=Rect(0,0,200,200);                   //복사할 영역
    TRect s_rc=Rect(100,0,300,200);              //원본    영역
    Image2->Picture->Bitmap->Canvas->CopyRect(t_rc,Image1->Picture->Bitmap->Canvas,s_rc);


기타
   Draw함수를 이용해도 되고
   BrushCopy 도 Image가 복사되더군요

    Image2->Picture->Bitmap->Width=200;
    Image2->Picture->Bitmap->Height=200;
    TRect rc=Rect(0,0,200,200);
//    Image2->Picture->Bitmap->Canvas->BrushCopy(rc,Image1->Picture->Bitmap,rc,clRed);
//    Image2->Picture->Bitmap->Canvas->Draw(0,0,Image1->Picture->Bitmap);

2. 그리고 Canvas의 Pixcel을 직접 하나씩 대입해도 되죠
 
    for(int i=0;i<200;i++)
    {
        for(int j=0;j<200;j++)
        {
            Image2->Canvas->Pixels[i][j]=Image1->Canvas->Pixels[i][j];
        }
    }
   근데 이건 속도가 많이 느려요

3. 그리고  직접 memory를 복사해도 됩니다.
     Picture->Bitmap->ScanLine을 이용해서
     이는 이용하는 방법을 좀 익혀야 하지만
     잘만이용하면 아주 유용하게 쓸수 있는 ...

    int *pt1;
    int *pt2;
    for(int i=0;i<200;i++)
    {
        pt1=(int *)Image1-> Picture->Bitmap->ScanLine[i];
        pt2=(int *)Image2->Picture->Bitmap->ScanLine[i];
        memcpy( pt2,pt1,800);   // 왜  800이냐 하면 PixcelFormat을 pf32bit 로 볼때  200 * 4Byte  = 800 Byte
                                             // PixcelFormat 이 다르면  size도 달라지겠죠
    }       
    이방법은   빠른편... 
  
   3-1. ScanLine 한번만 사용해서
          
         Image2->Picture->Bitmap->Width=200;
         Image2->Picture->Bitmap->Height=200;
         int iWid=Image1->Picture->Bitmap->Width;
         int *pt1=(int *)Image1-> Picture->Bitmap->ScanLine[199];
         int *pt2=(int *)Image2->Picture->Bitmap->ScanLine[199];
         for(int i=0;i<200;i++)
         {
             memcpy( pt2,pt1,800);
             pt2+=200;
             pt1+=iWid ;
         }

        //이방식도  PixcelFormat아 듈더 pf32bit 라고 설정하고 코딩된것입니다.
       //위 소스 0,0에서 200,200까지 복사하는데
       // 소스의 포인터인 pt1 을 잘 조작하면  내가 원하는 위치에 imag를 복사할수 있겠죠
     


4. 기타....
   


c++초보 님이 쓰신 글 :
: 같은 크기의 이미지를 복사할때...
:
: Timage1->Picture->Assign(Timage2->Picture);
: Timage1->AutoSize = true;
:
: 위에처럼 사용하였는데요.
:
: 소스이미지의 일부분만을 복사하려고 하는데 방법을 잘 모르겠내요.
: 답변 부탁드립니다.

+ -

관련 글 리스트
49704 TImage를 복사할때... c++초보 1026 2007/06/25
49707     Re:TImage를 복사할때... 장성호 1732 2007/06/25
49708         Re:Re:답변 감사드립니다...^^ c++초보 1223 2007/06/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.