|
여러가지 방법이 있는데요...
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;
:
: 위에처럼 사용하였는데요.
:
: 소스이미지의 일부분만을 복사하려고 하는데 방법을 잘 모르겠내요.
: 답변 부탁드립니다.
|