|
감사 합니다.
그런데 한가지 문제가 있습니다.
알파값이 처음엔 0xFF라서 인지..
for (x = 0; x < bmp -> Width; x++) {
*T = *T << 8;
*T = *T >> 8;
*T |= *S << 24;
T++;
S++;
}
저렇게 해서 알파값을 0x00으로 바꿔 준 후 입혀야 하더군요 ;;
특정 비트를 원하는 값으로 바꿔주는 일종의 꽁수나 방법이 있을지 궁금합니다 @_@;;
비트 토글을 이용하려면 변수 하나 더 추가 되어야 할듯하고 ;; 바로 하는법 있을까요?
열씸! 님이 쓰신 글 :
: 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 문 하나가 들어가면 해결 되는 부분이지요.
|