|
앗 감사합니다. TImage에 Transparent를 true로 하니까 되는군요...
^^;;
유영인 Cuperido 님이 쓰신 글 :
: 어떻게 안되는지 올려주셨으면 좋았었을텐데요..
: 제가 아래 코드를 테스트 해보니, 잘 동작 하는 것 같던데요..
:
: 혹시 아래 그림을 그대로 Image1에 Assign시키셨다든지..
: 이렇게만 하지 않으셨으면 잘 동작 할 겁니다.
: (Image에 바로 하실거면, Image1->Transparent = true 이런식으로 켜 주셔서
: Image가 사용하는 Bitmap을 이용하셔야 합니다)
:
: 그리고 MS에서 TransparentBitmap 에 대한 버그가 있어서
: MSDN을 통해서 재 배포한 적이 있었습니다.
: 이 것은 그것에 맞게 빌더로 수정한 예제고요.
: (Main->BITMAP_BUFFER는 속도 향상을 위해서 밖으로 뺀 Bitmap 객체입니다)
:
: /**********************************************************************/
: // DrawTransparentBitmap
: // MSDN용 버그 패치 Transparent Bitmap Drawing 루틴, 하지만 느리다
: /**********************************************************************/
: void __fastcall DrawTransparentBitmap(TCanvas *canvas, Graphics::TBitmap *bmp, int xStart, int yStart, int cTransparentColor)
: {
:
: Windows::TBitmap bm;
: TColorRef cColor;
: HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave, oldBmp, bmBackOld, bmObjectOld, bmMemOld, bmSaveOld, hBmp;
: HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave, dc;
: TPoint ptSize;
:
:
: Main->BITMAP_BUFFER->Assign(bmp);
:
: try {
:
: dc = canvas->Handle;
: hBmp = Main->BITMAP_BUFFER->Handle;
: hdcTemp = CreateCompatibleDC(dc);
: oldBmp = SelectObject(hdcTemp, hBmp);
:
: GetObject(hBmp, sizeof(bm), &bm);
: ptSize.x = bm.bmWidth;
: ptSize.y = bm.bmHeight;
:
: hdcBack = CreateCompatibleDC(dc);
: hdcObject = CreateCompatibleDC(dc);
: hdcMem = CreateCompatibleDC(dc);
: hdcSave = CreateCompatibleDC(dc);
:
: bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
: bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
: bmAndMem = CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);
: bmSave = CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);
:
: bmBackOld = SelectObject(hdcBack, bmAndBack);
: bmObjectOld = SelectObject(hdcObject, bmAndObject);
: bmMemOld = SelectObject(hdcMem, bmAndMem);
: bmSaveOld = SelectObject(hdcSave, bmSave);
:
: SetMapMode(hdcTemp, GetMapMode(dc));
:
: BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
:
: cColor = SetBkColor(hdcTemp, cTransparentColor);
:
: BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);
:
: SetBkColor(hdcTemp, cColor);
:
: BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
: BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, dc, xStart, yStart, SRCCOPY);
: BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
: BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
: BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
: BitBlt(dc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
: BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);
:
: DeleteObject(SelectObject(hdcBack, bmBackOld));
: DeleteObject(SelectObject(hdcObject, bmObjectOld));
: DeleteObject(SelectObject(hdcMem, bmMemOld));
: DeleteObject(SelectObject(hdcSave, bmSaveOld));
:
: SelectObject(hdcTemp, oldBmp);
:
: DeleteDC(hdcMem);
: DeleteDC(hdcBack);
: DeleteDC(hdcObject);
: DeleteDC(hdcSave);
: DeleteDC(hdcTemp);
:
: } catch (...) {}
:
: }
:
: 그리고 이것은 님의 소스를 테스트해서 간단히 동작을 하는 것을 본
: 예제입니다.
:
:
: cuperido
:
: //---------------------------------------------------------------------------
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit1.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:
: Graphics::TBitmap *img = new Graphics::TBitmap;
:
: Clearness("C:\\Download\\WRG.BMP", img);
:
: Form1->Canvas->Draw(0,0,img);
:
: }
:
: bool __fastcall TForm1::Clearness(AnsiString bName,Graphics::TBitmap *ClearnessBmp)
:
: {
:
: Graphics::TBitmap *imgClear;
: imgClear = new Graphics::TBitmap();
:
: try
: {
: imgClear->LoadFromFile(bName);
: }catch(Exception *e)
: {
: Application->MessageBox(e->Message.c_str(),"bmp Open Error",MB_OK+MB_ICONWARNING);
: delete imgClear;
: imgClear = NULL;
: return false;
: }
:
: // TbmpClearImage->Width = imgClear->Width;
: // TbmpClearImage->Height = imgClear->Height;
: ClearnessBmp->Width = imgClear->Width;
: ClearnessBmp->Height = imgClear->Height;
:
: ClearnessBmp->Canvas->Draw(0,0,imgClear);
: ClearnessBmp->Transparent = True;
: ClearnessBmp->TransparentColor = ClearnessBmp->Canvas->Pixels[0][0];
: ClearnessBmp->TransparentMode = tmAuto;
:
: delete imgClear;
: imgClear = NULL;
: return true;
: }
: //---------------------------------------------------------------------------
:
:
:
: 초보달려 님이 쓰신 글 :
: : 제가 TImage 에다 bmp 파일을 불러 와서 그림을 보여주고 그 배경을 투명 처리 할려고 하는데요.
: : 일단 함수가..밑에 누가 올리신걸 보고 만들었느데..안되서여..
: :
: : bool __fastcall TfrmMain::Clearness(AnsiString bName,Graphics::TBitmap *ClearnessBmp)
: : {
: : Graphics::TBitmap *imgClear;
: : imgClear = new Graphics::TBitmap();
: :
: : try
: : {
: : imgClear->LoadFromFile(bName);
: : }catch(Exception *e)
: : {
: : Application->MessageBox(e->Message.c_str(),"bmp Open Error",MB_OK+MB_ICONWARNING);
: : delete imgClear;
: : imgClear = NULL;
: : return false;
: : }
: :
: : TbmpClearImage->Width = imgClear->Width;
: : TbmpClearImage->Height = imgClear->Height;
: : ClearnessBmp->Width = imgClear->Width;
: : ClearnessBmp->Height = imgClear->Height;
: :
: : ClearnessBmp->Canvas->Draw(0,0,imgClear);
: : ClearnessBmp->Transparent = True;
: : ClearnessBmp->TransparentColor = ClearnessBmp->Canvas->Pixels[0][0];
: : //ClearnessBmp->TransparentColorValue = ClearnessBmp->Canvas->
: : ClearnessBmp->TransparentMode = tmAuto;
: :
: : delete imgClear;
: : imgClear = NULL;
: : return true;
: :
: : }
: :
: : 어느 부분이 문제 인지 잘 모르겠습니다..도와 주세염.~
: : 제가 원하는건 그냥 bmp 파일을 불러와서 배경만 투명으로 만들어 주면 되거든여..TT
|