|
void __fastcall setMask(TBitmap32 *bmp, TBitmap32 *mask){
DWORD *T;
DWORD *S;
for(int y = 0; y < bmp->Height; y++){
T = (DWORD *)bmp->ScanLine[y];
S = (DWORD *)mask->ScanLine[y];
for(int x = 0; x < bmp->Width; x++){
*T |= ~*S << 24;
T++;
S++;
}
}
}
원본 이미지(bmp) 에 첨부하신 마스크 (mask) 의 투명값을 입히는 함수를 작성해 보았습니다.
ScanLine 을 이용한 방법이구요.
보통 알파값(0~255)에서는 255가 불투명색이고, 1~254가 반투명, 0 이 투명이지만,
그려주신 마스크에서는 검은색이 불투명색이더군요 그래서,
~*S << 24;
여기에 Bitwise Not(~) 이 추가 되었죠. (흰색이 불투명색이라면, *S << 24; 이면 족합니다)
마스크 이미지가 Grayscale일 것이므로 젤 하위 바이트 값을 끌어올려 썼습니다.
올려주신 예제에 다음 부분에 이 함수를 호출하시면 될겁니다.
: TFloatRect rect;
:
: TBitmap32 *image = new TBitmap32;
: TBitmap32 *mskImg1 = new TBitmap32;
: TBitmapLayer *layer = new TBitmapLayer(ImgView32 -> Layers);
:
: image -> LoadFromFile("back.bmp");
: mskImg1 -> LoadFromFile("mask1.bmp");
:
: layer -> Bitmap = new TBitmap32();
: layer -> Bitmap -> DrawMode = dmBlend;
: layer -> Bitmap -> SetSize(37,43);
: layer -> Bitmap -> Canvas -> CopyRect(
: Rect(0,0,37,43),
: image -> Canvas,
: Rect(0,0,37,43)
: );
setMask(layer->Bitmap, mskImg1); // 간단하죠?
: rect.Top = 0;
: rect.Left = 0;
: rect.Right = rect.Left + layer -> Bitmap -> Width;
: rect.Bottom = rect.Top + layer -> Bitmap -> Height;
:
: layer -> Location = rect;
:
: image -> Free();
: mskImg1 -> Free();
어짜피 성능차이가 별 의미 없는 부분이므로, layer->Bitmap->Canvas->CopyRect 하시는 것 보다는
Graphics::TBitmap *image = new Graphics::TBitmap(); 으로 생성하셔서 로딩하시고,
layer->Bitmap->Canvas->Draw(-건너띌 가로픽셀, -건너띌 세로픽셀, image); 하시는게
더 간편해 보이네요. ㅋㅋㅋ
위의 setMask함수를 보시면 특정색을 대치하고자 하시는 부분도 손 쉽게 구현되겠지요?
두번째 for loop 안에 if 문 하나가 들어가면 해결 되는 부분이지요.
|