2011-11-27 1 views
2

C#을 윈폼에서 알파 채널의 그라디언트를 생성합니다. 비트 맵을 드로잉 영역 위로 늘리려고하는데 어떤 이유로 뻗어 있지 않습니다. 드로잉 영역의 오른쪽 및 아래쪽 여백에 알파 채널 그라디언트가 표시됩니다.Graphics.DrawImage는 <p></p> 내가 닷넷 2.0 C#의 윈폼 프로젝트가 .. 내가 정말 당혹 문제에 직면하고있어 2.0

이 문제를 해결하는 데 꽤 오래 걸렸습니다. 문제를 재현하는 몇 줄의 코드를 만듭니다 (코드 스 니펫과 스크린 샷 참조).

누구든지이 문제에 대해 밝힐 수 있습니까?

미리 감사드립니다.

-

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    // Create a black bitmap resource sized 10x10 
    Image resourceImg = new Bitmap(10, 10); 
    Graphics g = Graphics.FromImage(resourceImg); 
    g.FillRectangle(Brushes.Black, 0, 0, resourceImg.Width, resourceImg.Height); 

    Rectangle drawingArea = new Rectangle(0, 0, 200, 200); // Set the size of the drawing area 
    e.Graphics.FillRectangle(Brushes.Aqua, drawingArea); // Fill an aqua colored rectangle 
    e.Graphics.DrawImage(resourceImg, drawingArea);  // Stretch the resource image 

    // Expected result: The resource image should completely cover the aqua rectangle. 
    // Actual Result: The right and bottom edges become gradiently transparent (revealing the aqua rectangle under it) 
} 

DrawImage Problem

답변

4

동작은 GDI +가 가장자리를 처리하는 방법과 관련이있다. 이 경우 넓은 영역에서 아주 작은 이미지를 확대하고 GDI +에 가장자리를 처리하는 방법을 알려주지 않았습니다. ImageAttributes 클래스를 사용하고 WrapMode를 적절하게 설정하면이 문제를 해결할 수 있습니다. 예를 들어

:

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    using (var resourceImg = new Bitmap(10, 10)) 
    { 
     using (var g = Graphics.FromImage(resourceImg)) 
     { 
      g.FillRectangle(Brushes.Black, 0, 0, 
       resourceImg.Width, resourceImg.Height); 
     } 

     var drawingArea = new Rectangle(0, 0, 200, 200); 
     e.Graphics.FillRectangle(Brushes.Aqua, drawingArea); 

     using (var attribs = new ImageAttributes()) 
     { 
      attribs.SetWrapMode(WrapMode.TileFlipXY); 
      e.Graphics.DrawImage(resourceImg, drawingArea, 
        0, 0, resourceImg.Width, resourceImg.Height, 
        GraphicsUnit.Pixel, attribs); 
     } 
    }  
} 

상기 코드가 모두 흑색 화상을 생성한다. attribs.SetWrapMode(WrapMode.TileFlipXY); 문을 주석 처리하면 파란색 그라디언트가 표시됩니다. 랩 모드가 설정되면 가장자리에서 이미지를 뒤집기 위해 GDI +에 지시하므로 이미지를 확대 할 때 가장자리가 더 어두워 지거나 사라지지 않습니다.

+0

이제 나는 그것을 얻는다. "WrapMode.Clamp'는"오작동 "이다. (나는 픽셀을 곱하기를 기대했지만, 분명히 다른 점진적인 컬러 이동 알고리즘을 사용하고있다.) 깨달음의 답장을 보내 주셔서 감사합니다. – AVIDeveloper

+0

안녕하세요. 기꺼이 도와 드리겠습니다. – rsbarro