0

我使用 DrawImage Image 函数将图像的一部分复制到另一个图像。是否有可能使复制的部分“更暗”?比如,特殊的色调?有人可以给我一个例子吗?我听说过一种叫做 ImageAttributes 的东西,但我找不到它!

注意:我不想编辑源图像。

4

2 回答 2

2

 (不一定是这个问题的直接答案,而是一个后续问题,即指定ImageAttributesDrawImage方法会导致性能降低。该问题已被删除,但我还是在这里发布了我的回复,因为我已经写过了。忽略如果你希望。)

绘制图形很慢,尤其是在同时应用渲染效果时。花几分钟在 Photoshop 中工作,你就会明白我的意思。使图像变暗是一项计算成本很高的任务。您几乎无能为力让它运行得更快。

System.Drawing.Graphics.NET Framework 中的类中的例程是使用 GDI+ 在内部实现的,这使问题更加复杂,这不是硬件加速。一种可能的替代方法是切换回基于 GDI 的渲染,它在大多数系统上都是硬件加速的(这取决于您的视频卡供应商,但您今天发现的几乎每张卡都具有用于位块传输等基本功能的硬件加速) . 当然,这要困难得多,因为您需要从 Windows API 中 P/Invoke 函数才能使用基于 GDI 的绘图例程;.NET 为您提供的只是 GDI+。这比必要的工作要多得多,而且现代硬件上的速度改进可能很小(尤其是启用了 Windows Vista/7 的 Aero 主题,即使使用 GDI 也不使用硬件加速,因为所有内容都绘制到内存中的位图) .

坚持当前的实现,一些可能的优化确实浮现在脑海中:

  1. 重绘时是否调整图像大小?如果是这样,则需要对图像进行插值,相比之下这非常慢。

  2. 里面的图片是什么PixelFormatFormat32bppPArgb比替代品快得多。确保您使用的是该格式的图像。如果您不是现在,进行此更改应该会看到您的渲染速度大大提高。

  3. 为什么你需要如此频繁地重新渲染图像?如果是相同的图像,则在应用效果后绘制它并缓存Bitmap返回的对象。然后每次需要重绘图像时,使用内存中已有的图像,而不是创建新图像。这是一个简单的技巧,但它使您不必每次都重新做昂贵的部分。正如您所提到的,DrawImage单独比设置渲染属性要快得多。

通常,用户愿意等待大图像渲染。在这里相应地设置您的界面比尝试优化图形例程更合适。就用户而言,使用进度条和忙碌光标来指示实际正在发生的事情比从代码中挤出几毫秒的时间要走得更远。除非您在循环中反复应用此效果大约 100 或 1000 次(这看起来很愚蠢),否则不值得花时间进行优化。

于 2011-02-05T07:08:28.617 回答
1

DrawImage 函数甚至有一个特殊的重载,正是因为这个原因设置了一个 ImageAttributes 对象:

private void Example(PaintEventArgs e)
{
    ImageAttributes imageAttr = new ImageAttributes();
    imageAttr.SetGamma(2.2f);

    Rectangle rect = new Rectangle(250, 20, 200, 200);
    e.Graphics.DrawImage(myImage, rect, 0, 0, 200, 200, GraphicsUnit.Pixel, imageAttr);    
}
于 2011-02-05T00:11:20.153 回答