2012-12-28 7 views
7

다음 이미지를 살펴보면이 아이콘은 32x32 크기의 상당히 기본적인 아이콘입니다. 아이콘 주위에는 투명한 직사각형이 있습니다. 그러나 테스트하는 동안 네 모서리를 단색으로 채웠습니다. 내 이미지의 Graphics.DrawImage 자르기 부분이 왜입니까?

Source Image

이제 단순히 이미지를 그리는이 코드를 고려하지만, 더 큰 규모 : 나는 전체 이미지를 그리기 그리고 난 작물을 시도하고 있지 않다

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
    e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel); 
} 

주 어떤 식 으로든 그것을 확대하십시오.

Painted example

주의 문제 :

마지막으로,이 테스트가 저를 준다 출력은? 상단 행과 왼쪽 열의 픽셀 중 절반이 사라졌습니다. 그런 다음 그리드를 오버레이하여 그리드가 올바르게 정렬되었지만 이미지는 그렇지 않습니다. 크기를 64로 두 배로 늘리더라도 64는이 첫 번째 행/열 수확을 도입합니다.

참고로, 0,0보다 먼저 그리는 경우를 대비하여 대상 사각형을 오프셋했지만, 그렇지 않았습니다.

다른 보간 모드를 사용해 보았지만 두통으로 인해 흐림을 유발할 수있는 한 픽셀은 여전히 ​​자르기 때문에 보간 모드로 인한 것 같지 않습니다.

나는 또한 다른 그래픽 모드를 사용하려고했지만 도움이되지 않았다는 사실 외에도 어쨌든 픽셀을 고수해야합니다.

나는 호기심에서 96dpi로 이미지의 새로운 사본을 다시 시도하고 동일한 효과를 얻었으므로 원본 이미지의 해상도라고 생각하지 않습니다.

빨대에서 클러치를하고 대신 Rectangle을 사용하면 효과가 없습니다.

누구나이 명백한 작물이 발생하는 이유에 대한 단서를 제공 할 수 있습니까?

감사합니다.

답변

7

PixelOffsetModePixelOffsetMode.Half에 기본적으로 설정되어

고속 안티 알리아싱 들어, 수직 및 수평 , -0.5 화소 단위에 의해 상쇄되도록 지정.

원본 이미지의 반 화소는 결과 이미지에서 8 픽셀이므로 누락 된 부분입니다. PixelOffsetMode.None로 설정

시도 : 그냥 사용자들에 의해 comfirmed 응답을 포함

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.PixelOffsetMode = PixelOffsetMode.None; 
    e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
    e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel); 
} 
+6

로템은, 당신의 대답을 주셔서 감사합니다 - 난이 특정 자산을 인식하지 않았다. 나는 그것을 테스트했지만 여전히 작동하지 않았다. 그러나 'HighQuality'로 설정하면 이미지가 올바르게 렌더링됩니다. 나에게는 어리석은 기본값처럼 들리지만 알면 쉽게 고칠 수 있습니다 - 다시 한 번 감사드립니다! –

+0

나는 동일한 문제가 있었다. 또한'PixelOffsetMode' 속성을 인식하지 못했습니다. 다시 말하지만,'PixelOffsetMode.None'은 명확한 설정 임에도 불구하고 저에게 효과적이지 않았지만'PixelOffsetMode.HighQuality'가 효과가있었습니다. –

1

, 나는 그것을 자신을 시도하고 문제가 PixelOffsetMode.HighQuality 대신 none으로 해결되었다.관리

C#을

e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

내 경우 C++ :

e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality;