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
[41525] Re:Re:[질문]TImage 배경에 투명처리 하는 것점 봐주세여...
초보달려 [sinzi] 1191 읽음    2005-08-18 19:43
앗 감사합니다. 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

+ -

관련 글 리스트
41503 [질문]TImage 배경에 투명처리 하는 것점 봐주세여... 초보달려 978 2005/08/18
41506     Re:[질문]TImage 배경에 투명처리 하는 것점 봐주세여... 유영인 Cuperido 2112 2005/08/18
41525         Re:Re:[질문]TImage 배경에 투명처리 하는 것점 봐주세여... 초보달려 1191 2005/08/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.