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
[41506] Re:[질문]TImage 배경에 투명처리 하는 것점 봐주세여...
유영인 Cuperido [cuperido] 2111 읽음    2005-08-18 16:57
어떻게 안되는지 올려주셨으면 좋았었을텐데요..
제가 아래 코드를 테스트 해보니, 잘 동작 하는 것 같던데요..

혹시 아래 그림을 그대로 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 2111 2005/08/18
41525         Re:Re:[질문]TImage 배경에 투명처리 하는 것점 봐주세여... 초보달려 1191 2005/08/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.