Q&A

  • [wlfans]두개의 이미지합성에 관하여?급합니다.
이미지가 두개 있습니다.

이미지1은 배경

이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정)

두이미지를 합성하고 싶은데 쉽지가 않네요.

배경이미지에 이미지2를(인물부분만)합성해서

새이미지를 만들어 저장해야하거든요.

부탁합니다.

질문만 올려서 죄송....^^;

1  COMMENTS
  • Profile
    이정욱 1999.04.04 04:55
    하이텔서 퍼왔습니다.



    번 호 : 2827

    게시자 : 민성기 (오랑캐꽃)

    등록일 : 1999-02-27 23:55

    제 목 : [응모] 델파이 퀴즈...



    안녕하세요... 민성기 입니다.



    항상 퀴즈를 내 주시는 지훈님께 감사 드리며... ^^;



    음... 예전엔 복잡하고 희안하게 했다가... 요즘엔 RX의 소스를

    고대로 배껴서 쓰고 있습니다. 빠르고 좋길래... 흐흐흐...



    퀴즈 응모 입니당...



    procedure StretchBltTransparent(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;

    SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; Palette: HPalette;

    TransparentColor: TColorRef);

    const

    PaletteMask = $02000000;

    var

    Color: TColorRef;

    bmAndBack, bmAndObject, bmAndMem, bmSave:HBitmap;

    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap;

    MemDC, BackDC, ObjectDC, SaveDC: HDC;

    palDst, palMem, palSave, palObj: HPalette;



    function PaletteColor(Color: TColor): Longint;

    begin

    Result := ColorToRGB(Color) or PaletteMask;

    end;



    begin

    { Create some DCs to hold temporary data }

    BackDC := CreateCompatibleDC(DstDC);

    ObjectDC := CreateCompatibleDC(DstDC);

    MemDC := CreateCompatibleDC(DstDC);

    SaveDC := CreateCompatibleDC(DstDC);

    { Create a bitmap for each DC }

    bmAndObject := CreateBitmap(SrcW, SrcH, 1, 1, nil);

    bmAndBack := CreateBitmap(SrcW, SrcH, 1, 1, nil);

    bmAndMem := CreateCompatibleBitmap(DstDC, DstW, DstH);

    bmSave := CreateCompatibleBitmap(DstDC, SrcW, SrcH);

    { Each DC must select a bitmap object to store pixel data }

    bmBackOld := SelectObject(BackDC, bmAndBack);

    bmObjectOld := SelectObject(ObjectDC, bmAndObject);

    bmMemOld := SelectObject(MemDC, bmAndMem);

    bmSaveOld := SelectObject(SaveDC, bmSave);

    { Select palette }

    palDst := 0; palMem := 0; palSave := 0; palObj := 0;

    if Palette <> 0 then begin

    palDst := SelectPalette(DstDC, Palette, True);

    RealizePalette(DstDC);

    palSave := SelectPalette(SaveDC, Palette, False);

    RealizePalette(SaveDC);

    palObj := SelectPalette(ObjectDC, Palette, False);

    RealizePalette(ObjectDC);

    palMem := SelectPalette(MemDC, Palette, True);

    RealizePalette(MemDC);

    end;

    { Set proper mapping mode }

    SetMapMode(SrcDC, GetMapMode(DstDC));

    SetMapMode(SaveDC, GetMapMode(DstDC));

    { Save the bitmap sent here }

    BitBlt(SaveDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SRCCOPY);

    { Set the background color of the source DC to the color, }

    { contained in the parts of the bitmap that should be transparent }

    Color := SetBkColor(SaveDC, PaletteColor(TransparentColor));

    { Create the object mask for the bitmap by performing a BitBlt() }

    { from the source bitmap to a monochrome bitmap }

    BitBlt(ObjectDC, 0, 0,SrcW, SrcH, SaveDC, 0, 0, SRCCOPY);

    { Set the background color of the source DC back to the original }

    SetBkColor(SaveDC, Color);

    { Create the inverse of the object mask }

    BitBlt(BackDC, 0, 0, SrcW, SrcH, ObjectDC, 0, 0, NOTSRCCOPY);

    { Copy the background of the main DC to the destination }

    BitBlt(MemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, SRCCOPY);

    { Mask out the places where the bitmap will be placed }

    StretchBlt(MemDC, 0, 0, DstW, DstH, ObjectDC, 0, 0, SrcW, SrcH, SRCAND);

    { Mask out the transparent colored pixels on the bitmap }

    BitBlt(SaveDC, 0, 0, SrcW, SrcH, BackDC, 0, 0, SRCAND);

    { XOR the bitmap with the background on the destination DC }

    StretchBlt(MemDC, 0, 0, DstW, DstH, SaveDC, 0, 0, SrcW, SrcH, SRCPAINT);

    { Copy the destination to the screen }

    BitBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0,

    SRCCOPY);

    { Restore palette }

    if Palette <> 0 then begin

    SelectPalette(MemDC, palMem, False);

    SelectPalette(ObjectDC, palObj, False);

    SelectPalette(SaveDC, palSave, False);

    SelectPalette(DstDC, palDst, True);

    end;

    { Delete the memory bitmaps }

    DeleteObject(SelectObject(BackDC, bmBackOld));

    DeleteObject(SelectObject(ObjectDC, bmObjectOld));

    DeleteObject(SelectObject(MemDC, bmMemOld));

    DeleteObject(SelectObject(SaveDC, bmSaveOld));

    { Delete the memory DCs }

    DeleteDC(MemDC);

    DeleteDC(BackDC);

    DeleteDC(ObjectDC);

    DeleteDC(SaveDC);

    end;



    헥헥~



    쓸 때는 다음과 같이 ... ^^;



    procedure TForm1.Button1Click(Sender: TObject);

    var

    DestBitmap : TBitmap;

    SrcBitmap : TBitmap;

    begin

    DestBitmap := TBitmap.Create;

    SrcBitmap := TBitmap.Create;

    try

    DestBitmap.Width := Image2.Picture.Bitmap.Width;

    DestBitmap.Height := Image2.Picture.Bitmap.Height;

    DestBitmap.Canvas.Draw(0, 0, Image2.Picture.Bitmap);

    SrcBitmap.Assign(Image1.Picture.Bitmap);



    StretchBltTransparent(

    DestBitmap.Canvas.Handle,

    0, 0, DestBitmap.Width, DestBitmap.height,

    SrcBitmap.Canvas.Handle,

    0, 0, SrcBitmap.Width, SrcBitmap.Height,

    SrcBitmap.Palette,

    clBlack

    );



    Image3.Picture.Bitmap.Assign(DestBitmap);

    finally

    DestBitmap.Free;

    SrcBitmap.Free;

    end;

    end;



    음... Image2의 이미지 중 검은 부분을 Image1에 '투명'하게

    올려서리... Image3에 보여주는 놈 입니다.



    이번 기회에 성능 죽여주는 투명 비트맵 예제를 건질 수 있으면

    좋겠네요~







    이상돈 wrote:

    > 이미지가 두개 있습니다.

    > 이미지1은 배경

    > 이미지2는 사진(인물은외에는 일정한 색(파랑이나 검정)

    > 두이미지를 합성하고 싶은데 쉽지가 않네요.

    > 배경이미지에 이미지2를(인물부분만)합성해서

    > 새이미지를 만들어 저장해야하거든요.

    > 부탁합니다.

    > 질문만 올려서 죄송....^^;