1

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);
4

1 回答 1

7

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

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

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

于 2011-01-19T14:54:35.260 回答