2011-01-19 7 views
1

ImageList에는 "Draw"라는 메서드가 있습니다.imageList.Draw는 다른 크기로 그려지지 않습니다?

imageList.Draw(graphics, bounds.X, bounds.Y, bounds.Width, bounds.Height, imgIndex); 

이 메서드를 사용하여 PrintDocument의 그래픽 개체에 이미지를 그립니다. 원본 이미지 크기 (16 x 16 픽셀)를 사용하면 이미지가 올바르게 그려집니다. 그러나 경계 크기를 변경하면 아무 것도 그려지지 않습니다. 크기를 32 x 32 (두 배 크기)로 변경해도 아무런 효과가 없습니다. 아무것도 그려지지 않습니다. 다른 dpi 때문에 그려지는 크기를 바꿀 필요가 있습니다 ... 내가 틀린 곳은 어디입니까?

편집 : 단순히 대신 g.DrawImage 메서드를 사용하여 솔루션을 보인다. 왜 imageList.Draw() 그리는하지 않습니다 나에게 미스터리 ...

g.DrawImage(imageList.Images[imgIndex], bounds); 
+1

이상한. 당신의 코드는 나에게 잘 보이고, 나는 전에 이것을 한 것을 알고있다. –

+0

그래, 나도 알아 :-) 어쩌면 그것은 dpi (화면 대 인쇄물)의 차이 때문일까? 누가 알아 ? :-) –

답변

7

ImageList.Draw()가 조금 이상하다 ... 아직 나에게 신비입니다 내장 지원 네이티브 이미지 목록은 Windows 내부의 코드는 목록에 이미지를 렌더링합니다. 이는 최적화이므로 기본 이미지 목록에 저장된 내부 이미지를 관리되는 이미지 객체로 다시 변환하는 비용을 피할 수 있습니다.

그러나이 부작용은 Graphics 객체에 적용된 변환과 상관없이 발생합니다. 목록에있는 16x16 이미지는 종이에 16x16 픽셀로 렌더링됩니다. 프린터가 매우 고해상도 (인치 당 600 도트가 일반적 임)이며, 이미지가 소수점으로 바뀝니다.

이미지 목록은 실제로 TreeView 및 ListView 컨트롤의 이미지 소스를위한 것이 었습니다. 이미지 목록은 이미지를위한 훌륭한 범용 컬렉션 개체가 아닙니다. List<Image>처럼. 해결 방법은 좋으며 Image 속성은 내부 비트 맵을 관리되는 이미지로 다시 변환합니다. 그러면 Graphics.DrawImage()가 적절하게 크기를 조절하여 화면의 크기에 가까운 크기의 용지를 얻습니다. 그러나 입자가 생기면 이미지를 6 배 더 크게 만듭니다. 그 개체를 Dispose()해야합니다.

+0

고마워! 위대한 대답, 언제나처럼 :-) –

관련 문제