빌더(TWx) 님이 쓰신 글 :
: 앱돌이 님이 쓰신 글 :
: : Observer 님이 쓰신 글 :
: : : 앱돌이 님이 쓰신 글 :
: : : : TIMAGE에 bitmap파일을 불러와 원을 그렸습니다.
: : : :
: : : : 그리고 밖의 이미지는 버리고 안의 이미지만 저장하고 싶은대
: : : :
: : : : 조언 부탁드립니다.
: : : :
: : : :
: : :
: : : 아마도 마스크 크롭핑을 말씀하시는거 같은데,
: : : graphics32 컴포넌트 쓰시면 코드 단 몇줄이면 끝납니다.
: :
: : 아 그렇군요 사용을 안해봐서 한번 사용해봐야 할거 같아요!!
:
:
:
:
: 답변:
:
:
: 컴포넌트에 의존하지 말고, Windows OS가 제공하는 Region API 사용하면 간단하게 처리할 수 있습니다.
:
:
: 변환전
:
:
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TBitmap *pBmp = new TBitmap;
: pBmp->LoadFromFile("bg.bmp");
:
: HRGN rgnRect = CreateRectRgn(0, 0, pBmp->Width - 1, pBmp->Height - 1);
: HRGN rgnCircle = CreateEllipticRgn(pBmp->Width / 4, 10, pBmp->Width - (pBmp->Width /4), pBmp->Height - 10);
: HRGN rgnExcluded = CreateRectRgn(0,0,0,0);
:
: CombineRgn(rgnExcluded, rgnRect, rgnCircle, RGN_XOR);
: assert(rgnRect && rgnCircle && rgnExcluded);
:
: pBmp->Canvas->Brush->Color = clWhite;
: PaintRgn(pBmp->Canvas->Handle, rgnExcluded);
:
: DeleteObject(rgnRect);
: DeleteObject(rgnCircle);
: DeleteObject(rgnExcluded);
:
: pBmp->SaveToFile("bg2.bmp");
: delete pBmp;
: }
:
:
:
: 변환후
:
:
: 이미지를 투명하게 처리하는 것도 Windows OS가 제공하는 Region API를 이용해서
: 영역을 특정한 후에 알파채널을 라이트 해주면 간단하게 처리 할 수 있지요.
: 컴포넌트에 의존하면 발전이 없어요.
:
:
:
정말 도움많이 됬습니다. 감사합니다.
HRGN rgnRect = CreateRectRgn(0, 0, ImgSetup->Width - 1, ImgSetup->Height - 1); //사각 영역 생성(x1,y1,x2,y2)
HRGN rgnCircle = CreateEllipticRgn(newx1[1],newy1[1],newx2[1],newy2[1]); //원형 영역 생성(x1,y1,x2,y2)
HRGN rgnExcluded = CreateRectRgn(0,0,0,0); //저장영역?
//1 //2
CombineRgn(rgnExcluded, rgnRect, rgnCircle, RGN_XOR); /// 합집합(1||2) - 교집합(1&&2)
assert(rgnRect && rgnCircle && rgnExcluded);
ImgSetup->Canvas->Brush->Color = clWhite;
PaintRgn(ImgSetup->Canvas->Handle, rgnExcluded);
DeleteObject(rgnRect);
DeleteObject(rgnCircle);
DeleteObject(rgnExcluded);