2012-01-22 3 views
2

이미지 처리에 Graphics32을 사용하고 있습니다. 그 기능을 살펴보면 클리핑 마스크가 제대로 구현되었는지 아직 보지 못했습니다. 나는 여기 저기에서 "클리핑 (clipping)"이라는 용어를 보지만, 다른 것을 언급하는 것으로 보인다.Graphics32를 사용하여 클리핑 마스크 만들기

간단히 말해서, 나는 하나의 레이어가 다른 레이어의 "엿보기 홀"로 기능 할 필요가 있습니다. 레이어 A는 레이어 B에 투영되어야하지만 레이어 B 만 보입니다. (더 이상 클리핑 마스크가 무엇인지 다시 정의 할 필요가 없습니다.)

만약 제가 제시하고 싶은 다른 레이어의 비트 맵이라면 그렇게하기가 어렵지 않을 것입니다. this trick을 사용하십시오. 그러나 무엇이 복잡합니까? 레이어의 비트 맵은 레이어가 표시 할 내용을 많이 알려주지 않습니다. 층이 될 수

  • 이동/임의로 + 리샘플링 뻗어 (뷰 아웃 때) 투명

    • (부분적)
    • 는 비트 맵에 아무런 효과

    회전.

    이렇게 실제로 구현할 준비가되지 않았습니까? 이것에 대한 제안은 나 자신?

    진행

    나는 Graphics32의 소스에 몇 가지 유용한 요소를 발견했다. 예를 들어,이 선언을 사용하여 :

    type 
        TLayerAccess = class(TBitmapLayer); 
    

    보호 방법에 접근하기 위해, 나는 정확히 화면에 마찬가지로, 비트 맵으로 그린 ​​단지이 층을 가지고 TLayerAccess(ABitmapLayer).Paint(ABitmap32)를 호출 할 수 있습니다.

  • +0

    graphics32는 32 비트 비트 맵을 단독으로 사용하며 블렌딩에 사용되는 비트 맵의 ​​알파 채널입니다. 내가 사용할 수있는 다른 알파 필드 (예 : 클리핑 영역 등)를 알지 못합니다. 다른 "마스터 알파"만 있습니다. 나는 할 것이다. 1. 알파 비트 맵 (모두 흰색, 알파 채널은 비트 맵 좌표의 클리핑 패스)을 결정하고 원래 비트 맵을이 비트 맵에 곱한 다음 비트 맵을 대상으로 렌더링합니다. –

    +0

    레이어 B의 어떤 부분이 표시되는지 어떻게 정의합니까? – iamjoosy

    +0

    @iamjoosy 용기 (TImage32)에 그려진 부분을 볼 수 있습니다. –

    답변

    0

    나는 1 년 전에 이것을 보았고 투명 부분이있는 검은 색 층을 사용했다. 그것은 내 요구에 적합합니다. 하지만 원하는 것은 가능합니다.

    하나의 TBitmapLayer를 다른 마스크에 연결하고 마스크로 간주하고 싶습니다. 그러나 나는이 참고 문헌 (그리고 그것의 잠재적 인 문제와 Graphics32 재 작업)을 피하고 최후의 수단으로 만 이것을보고 싶다.

    전용 픽셀 결합기를 사용하여 전용 TBitmapLayer없이 수행 할 수있는 방법이 있습니다. 그러나 TBitmapLayers 및 XY 픽셀에 대해서는 알지 못합니다. 적절한 흡장

    (또는 생략)을 TBitmapLayer의 일부 화면에 그리는 동안, 당신은 type TPixelCombineEvent의 방법을 만들어 사용하고 OnPixelCombine로 이것을 할당하고 dmCustomTBitmapLayer.DrawMode을 설정 할 수있다.

    그 안에는 M 마스터 알파가 주어진 경우 어떤 픽셀 결과가 배경 B이고 전경이 F 인 지 결정합니다. 여기

    procedure TMyObj.MyPixCombine(F: TColor32; var B: TColor32; M: TColor32); 
    begin 
        if not PseudoThisPixelShouldBeMasked then B := F; // ugly and aliased 
    end; 
    

    문제는이 (의사 코드) PseudoThisPixelShouldBeMasked 정말 어떤 픽셀이 문제를 알고는 마스크의 안쪽에 있을지 어떨지를하지 않는 것입니다.따라서 알파 값과 같은 F의 구성 요소에서 해당 값을 추출해야합니다.

    그때 나는 F가 검은 색 또는 흰색 인 매우 빠른 B := ColorMin(F,B);을 선택했다. 이 레이어는 항상 투명한 마스크 대신 검정색으로 표시됩니다. TBitmapLayer에 대한 렌더링은 마스크 데이터를 파괴하므로 다시 적용해야합니다. 그러나 iamjoosy에 의해 아래에 제안 된대로 (누가 그것을 줄였습니까?) TByteMap을 사용하면 재미있을 수도 있습니다. 아마도 성능 저하는 무시할 수있는 것으로 보입니다.