|
어떻게 안되는지 올려주셨으면 좋았었을텐데요..
제가 아래 코드를 테스트 해보니, 잘 동작 하는 것 같던데요..
혹시 아래 그림을 그대로 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
|