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
[40664] Re:Re:Graphics32의 투명처리에 관한 질문 입니다 ;;
☆~ [best3286] 1705 읽음    2005-06-21 09:19
감사 합니다.
그런데 한가지 문제가 있습니다.

알파값이 처음엔 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 문 하나가 들어가면 해결 되는 부분이지요.

+ -

관련 글 리스트
40630 Graphics32의 투명처리에 관한 질문 입니다 ;; ☆~ 1995 2005/06/19
40651     Re:Graphics32의 투명처리에 관한 질문 입니다 ;; 열씸! 2538 2005/06/20
40664         Re:Re:Graphics32의 투명처리에 관한 질문 입니다 ;; ☆~ 1705 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.