Graphics.DrawImage变暗了吗?

时间:2011-02-04 23:55:04

标签: graphics vb.net-2010 drawimage

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

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

2 个答案:

答案 0 :(得分: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);    
}

答案 1 :(得分:1)

  

(不一定是这个问题的直接答案,但对于ImageAttributes方法指定DrawImage的后续问题会导致效果降低。该问题自删除以来,但我发布了无论如何,在这里回答,因为我已经写过了。如果你愿意,请忽略。)

绘制图形很慢,尤其是在同时应用渲染效果时。花几分钟在Photoshop工作,你会明白我的意思。使图像变暗是一项计算成本高昂的任务。没有什么可以让它变得更快。

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

坚持当前的实现,我们会想到一些可能的优化:

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

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

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

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