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
[40651] Re:Graphics32의 투명처리에 관한 질문 입니다 ;;
열씸! [cappuccino] 2538 읽음    2005-06-20 20:49
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 문 하나가 들어가면 해결 되는 부분이지요.

+ -

관련 글 리스트
40630 Graphics32의 투명처리에 관한 질문 입니다 ;; ☆~ 1996 2005/06/19
40651     Re:Graphics32의 투명처리에 관한 질문 입니다 ;; 열씸! 2538 2005/06/20
40664         Re:Re:Graphics32의 투명처리에 관한 질문 입니다 ;; ☆~ 1706 2005/06/21
40687             Re:Re:Re:Graphics32의 투명처리에 관한 질문 입니다 ;; 열씸! 1223 2005/06/22
40768                 감사 합니다 ^^ ☆~ 903 2005/06/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.