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
[18613] Re:Re:Re:Re:Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우
유영인 [Chris] [cuperido] 1156 읽음    2002-05-17 13:02
아.. 그 사각형 영역을 잡아서 넣고 싶으신 거군요.. 일반적인 부분 복사 처럼요..

주의하셔야 할 점이 몇가지 있습니다.


1. 점선 처리
어떤 방법이 제일 좋을지는 모르겠지만, 제 소견으로는 Shape 컴포넌트가 그나마 제일 낫던것 같습니다. (Shape는 몇몇 프로퍼티 조작만으로도 네모 박스를 꾸밀 수 있고, 역방향 Width, Height도 지원합니다) 직접 그려주는 방식이나 (물론 방법에 차이가 있겠지만) 아니면 Image를 이용하는 방법은, 속도와 깜빡거림에서 문제가 될 수 있습니다.

2. 깜빡거림 처리
깜빡거림 현상이 Shape를 써도 나타나는 경우가 있습니다. (특정 이미지가 그런데요... 아마도 Shape 테두리 컬러와 겹쳐서 그렇지 않은가도 싶습니다. 이 의견은 확실하지 않으니 신경쓰지 마시구요) 깜빡임 현상을 최소화 하는 방법은 상훈님께서 한번 연구해 보세요. 저는 이미지처리 쪽은 별로 안좋아해서.. 히히..

3. 마이너스 좌표 처리
사각형을 긁는 방법도 여러가지 겠죠. 왼쪽에서 오른쪽.. 오른쪽에서 왼쪽.. 아래쪽에서 위쪽.. 등등 마이너스 좌표가 나오는 부분이 있는데, 이럴때는 연산을 통해서 계산을 해주어야 합니다.


아래는 Image1에서 드래깅하여 선택된 영역을 오른쪽 Image2에 복사하는 예제입니다.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit_Clip.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
// 범위 지정 라인을 위한 동적 생성 (이하. 클립)
TShape *CLIP = new TShape(Form1);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{

// 아무 그림이나 불러오시면 됩니다
Image1->Picture->Bitmap->LoadFromFile("C:\\Work\\ttl.bmp");

// 클립 초기화
CLIP->Visible         = false;
CLIP->Parent          = Panel1;

// 점선 효과
CLIP->Pen->Style      = psDot;
CLIP->Pen->Color      = clWhite;
CLIP->Brush->Style    = bsClear;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{

delete CLIP;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

// 마우스를 누르면 클립을 나타낸다
if(!CLIP->Visible) {
   CLIP->Left    = X;
   CLIP->Top     = Y;
   CLIP->Width   = 0;
   CLIP->Height  = 0;

   CLIP->Visible = true;
}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{

// 마우스가 움직이면 클립의 크기를 조절한다
if(CLIP->Visible) {
   CLIP->Width  = X - CLIP->Left;
   CLIP->Height = Y - CLIP->Top;
}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

// 역방향으로 긁어 좌표가 마이너스가 나올때 처리
int               itLeft   = CLIP->Width  >= 0 ? CLIP->Left : CLIP->Left + CLIP->Width,
                   itRight  = CLIP->Width  >= 0 ? CLIP->Width + CLIP->Left : itLeft - CLIP->Width,
                   itTop    = CLIP->Height >= 0 ? CLIP->Top : CLIP->Top + CLIP->Height,
                   itBottom = CLIP->Height >= 0 ? CLIP->Height + CLIP->Top : itTop - CLIP->Height;


Image2->Picture->Bitmap = NULL;
Image2->Canvas->CopyRect(Rect(itLeft, itTop, itRight, itBottom), Image1->Canvas, Rect(itLeft, itTop, itRight, itBottom));

CLIP->Visible = false;

}

//---------------------------------------------------------------------------




이상훈 님이 쓰신 글 :
: 감사합니다. 근데 실행시키면 에러가 나네요...(쩝!)
:
: 암튼 제가 원하는것은 어떤 이미지에서 페인트 샵에서 처럼 마우스로 긁어서 사각형영역을 다시 다른 폼에 붙이고 싶
:
: 습니다. 페인트샵하고 똑같은 기능을 할 수 있었으면 합니다.
:
:
: 유영인 [Chris] 님이 쓰신 글 :
: : 어떤 루틴을 원하시나요~?
: :
: : 안에 EXE 파일도 있거든요.. 만약 해당 프로그램에서 원하는 부분이 있으시면.. C++ Builder 로 포팅시켜 드릴수두 있는데..
: :
: : 꾸벅..
: :
: :
: : 이상훈 님이 쓰신 글 :
: : :
: : : 유영인님...  감사합니다...
: : :
: : : 그런데 델파이을 실행시킬수가 없어서리...
: : :
: : : 소스가 길어서 보기가 넘 힘드네요.. 혹시 빌더용은 없나요???
: : :
: : : 아님 방법만이라도 알려주시면 감사하겠습니다.
: : :
: : : 유영인 [Chris] 님이 쓰신 글 :
: : : : 안녕하세요..
: : : :
: : : : 요즘에 이미지 처리에 관해서 아주 많이 나오네요.. 이건.. 이미지 처리는 아니지만.. 동적 객체 처리로 만들어 진 자료입니다..
: : : :
: : : : 근데.. 델파이예요.. --; 예전에 짠거래서.. 너무너무 허접하구요..
: : : :
: : : : 혹시라도 이 부분에서 비슷하게 처리할 수 있으시면 소스코드 참고하시구요.. 만약 애로사항이 생기시면 말씀해 주세요..
: : : :
: : : :
: : : : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=del_res&no=13
: : : :
: : : :
: : : : 이상훈 님이 쓰신 글 :
: : : : :
: : : : : 페인트 샵과 같은 이미지 프로그램에서 그림의 일부를 마우스로 잡으면
: : : : :
: : : : : 점선으로 나오게 하고 싶습니다.. 그리고 이부분만 특정이미지 처리(예: 밝기)
: : : : :
: : : : : 를 하고 싶습니다.. 또 새로운 폼으로 복사 /붙이기를 하고 싶습니다.
: : : : :
: : : : : 알려주시면 감사하겠습니다.

+ -

관련 글 리스트
18572 [HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우려면? 이상훈 787 2002/05/16
18573     Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우려면? 유영인 [Chris] 876 2002/05/16
18576         Re:Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우려면? 이상훈 845 2002/05/16
18577             Re:Re:Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우려면? 유영인 [Chris] 885 2002/05/16
18608                 Re:Re:Re:Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우려면 이상훈 918 2002/05/17
18613                     Re:Re:Re:Re:Re:[HELP]이미지의 일부(사각형)를 마우스로 잡아서 다른 폼에 새로운 이미지로 띄우 유영인 [Chris] 1156 2002/05/17
18614                         Re:Re:Re:Re:Re:Re:정말 감사합니다..(꾸벅^^)냉무 이상훈 754 2002/05/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.