imageList.Draw不会绘制不同的大小?

时间:2011-01-19 14:06:03

标签: c# .net graphics gdi+ imagelist

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 :(得分:7)

ImageList.Draw()有点不寻常,它利用了Windows内部的本机图像列表代码在列表中呈现图像的内置支持。这是一种优化,它避免了将存储在本机图像列表中的内部图像转换回托管图像对象的成本。

然而,一个副作用是这个绘图发生时不考虑应用于Graphics对象的任何变换。列表中的16x16图像将在纸上呈现为16x16像素。这确实有点难以找到,打印机具有非常高的分辨率(典型的每英寸600点),该图像变成小数点。

图像列表实际上是TreeView和ListView控件的图像源,它不是图像的通用集合对象。像List<Image>一样。您的解决方法很好,Image属性将内部位图转换回托管图像,然后Graphics.DrawImage()将适当地缩放它以获得接近屏幕大小的纸张大小。然而,通过制作6倍大的图像可以获得颗粒感。请注意,您应该Dispose()该对象。