프로그래밍/델파이

[GR32] 다각형 영역만 클립보드로 복사하기

채윤아빠 2007. 12. 21. 23:29
728x90
반응형

공개 패키지 Graphics32 1.8 버전이 새로 나왔습니다.

이를 기존 프로젝트에 적용하였더니, 한군데서 오류가 발생하였습니다.

이미지의 Interpolate를 처리하기 위한 필터가 클래스 형태로 변경되었습니다.


기존 코드(1.7)

  FBuffer32.StretchFilter=sfLinear;


신규 코드(1.8)

  TLinearResampler.Create(FBuffer32);


이런식으로 적용하였더니, 바로 그대로 사용 가능하였습니다.

1.7 버전의 ImgView에 있던 레이어의 확대 버그가 1.8에서는 해결된것 같습니다.

다각형 영역만 클랩보드로 복사하는 것은 Examples의 Sprites 예제를 응용하면 됩니다.
다음 코드는 Sprites 예제의 생성자 코드의 일부입니다.
 

  procedure LoadImage(Dst: TBitmap32; const Filename, AlphaFilename: String);
  var
    TempBitmap: TBitmap32;
  begin
    TempBitmap := TBitmap32.Create;
    try
      Dst.LoadFromFile(Filename);
      TempBitmap.LoadFromFile(AlphaFilename);
      IntensityToAlpha(Dst, TempBitmap);
    finally
      TempBitmap.Free;
    end;
  end;


Alpha 이미지를 열어 보시면, 그레이 스케일의 이미지로 복사될 부분의 이미지 부분만 하얗게 표시되어 있습니다. Dst 이미지에서 TempBitmap 부분의 하얀색 부분만 남게 되는 것이죠.

그 역할을 해주는 함수가 IntensityToAlpha입니다.

이를 응용하면, 다음과 같이 Polygon을 그린 후에, IntensityToAlpha 함수로 다각형 영역부분만 추출한 후에, 클립보드로 잘라낸 이미지를 복사하면 됩니다.

 
    // 다각형 비트맵 그리기 : 배경 - 검은색, 다각형은 흰식으로 채움
    // 흰색으로 채워진 부분만 원래 이미지에서 남게 됨
    ABitmap.Canvas.Brush.Color:=clBlack;
    ABitmap.Canvas.FillRect(Rect(0,0,ABitmap.Width,ABitmap.Height));
    ABitmap.Canvas.Brush.Color:=clWhite;
    ABitmap.Canvas.Pen.Color:=clWhite;
    ABitmap.Canvas.Polygon(APoints);

    AMaskBitmap32:=TBitmap32.Create;
    AMaskBitmap32.Assign(ABitmap);

    IntensityToAlpha(ABitmap32,AMaskBitmap32); // 알파 채널 적용
    ABitmap32.DrawMode:=dmBlend; // 알파 채널을 이용한 이미지 그리기

    AMaskBitmap32.SetSize(ABitmap32.Width,ABitmap32.Height);
    AMaskBitmap32.Clear(clWhite32); // 배경을 흰색으로 만듬
    AMaskBitmap32.Draw(AMaskBitmap32.BoundsRect,ABitmap32.BoundsRect,ABitmap32); // 잘라낸 이미지를 복사함.

    Clipboard.Assign(AMaskBitmap32);


위 코드에서 IntensityToAlpha 프로시저를 호출하여 알파채널을 적용한 후에, 바로 클립보드로 복사하면 안됩니다.

클립보드는 알파채널을 인식하지 못하기 때문에, 원래 이미지가 그대로 나타나게 됩니다.

그래서 다시 AMaskBitmap32 에 알파채널이 적용된 잘라낸 이미지를 복사한 후에, 이를 클립보드로 복사하도록 한 것입니다.

Graphics32를 이용하시는 분들에게 도움이 되길빌며 이만 줄입니다.