2011-09-09 15 views
1

두 개의 이미지가 서로 겹쳐서 겹쳐져 있고 최상위 이미지의 섹션을 지울 수 있기를 원합니다. 일반적으로 나는 이미지의 한 부분을 취소하고 싶다면 그냥C# 그래픽이 영역 위에 투명 사각형을 그립니다.

g.FillRectangle(Brushes.White,x,y,width,height); 

를 수행하여 그것을 배경 색상을 칠 것입니다하지만 상단 이미지를 그렇게 할 경우 하단 이미지의 영역이 흰색 사각형으로 적용됩니다. 나는 시도했다

그러나 그것은 이전의 모든 내용의 영역을 지우는 것처럼 보이지 않는다. 해당 영역의 픽셀을 투명하게 만들 수있는 방법이 있습니까?

답변

2

이것은 불가능합니다.

GDI + 및 Graphics 클래스는 계층화 된 그리기를 지원하지 않습니다. 이전 이미지를 덮어 쓰면 해당 픽셀은 이되고이됩니다.

두 개의 직사각형을 사용하는 DrawImage 오버로드를 호출하여 표시 할 이전 이미지의 부분을 다시 그려야합니다.

낮은 이미지에 투명 부분이있는 경우 투명도가 올바르게 겹쳐 지도록 FillRectangle을 호출하여 먼저 해당 영역을 흰색 (또는 원래 배경이 무엇이든)으로 지워야합니다.

2

다른 옵션은 이미지를 직접 페인트하지 않는 것입니다.

System.Windows.Forms.PictureBox 

을 그리고 이미지의 가시성/transaparency을 변경하는 특성

Region 

입니다 : 사용합니다. 영역이 직사각형 일 필요는 없습니다. 모든 행 세트에서 정의 될 수 있습니다.

PS : Brushes.Transparent 실제로 투명하지는 않지만 부모 컨테이너의 BackColor를 의미합니다. 컨트롤에 그림 때

+1

귀하의'PS'을 그릴 클립 & 지역 포메이션으로 만 사실이다. 비트 맵은 완벽한 알파 블렌드 투명성을 지원합니다. 그러나 '투명'은 '아무 것도하지 않는다'는 의미입니다. 그것은 "픽셀 지우기"를 의미하지 않습니다. – SLaks

3
//using System.Drawing.Drawing2D; 

g.FillRectangle(Brushes.White,x,y,width,height); 
g.CompositingMode = CompositingMode.SourceCopy;  
g.FillRectangle(Brushes.Transparent,x,y,width,height); 
+1

이것이 나에게 적합하지 않았습니다. 나는 어떤 차이도 느끼지 않았다. –

+0

이것은 작동하지 않습니다. CompositingMode.SourceCopy는 RGB 채널에만 영향을줍니다. –

0
float[][] ptsArray ={ 
      new float[] {1, 0, 0, 0, 0}, 
      new float[] {0, 1, 0, 0, 0}, 
      new float[] {0, 0, 1, 0, 0}, 
      new float[] {0, 0, 0, 0.5f, 0}, 
      new float[] {0, 0, 0, 0, 1}}; 
      ColorMatrix clrMatrix = new ColorMatrix(ptsArray); 
      ImageAttributes imgAttributes = new ImageAttributes(); 
      imgAttributes.SetColorMatrix(clrMatrix, 
      ColorMatrixFlag.Default, 
      ColorAdjustType.Bitmap); 
      _ImageThumb.Height, imgAttributes); 
      e.Graphics.DrawImage(_ImageThumb,new Rectangle(0, 0, _ImageThumb.Width,_ImageThumb.Height),0, 0, _ImageThumb.Width, _ImageThumb.Height,GraphicsUnit.Pixel, imgAttributes); 

//이

관련 문제