2011-02-04 38 views
0

我使用DrawImage Image函数将图像中的一部分复制到另一个图像。 是否有可能使复制的部分变得更“黑暗”?喜欢,特殊的色调?有人能给我一个例子吗?我听说过ImageAttributes,但我找不到它!Graphics.DrawImage变暗了?

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

+0

我刚写了一个关于这个例程的执行速度缓慢的问题的答案,但注意到当我试图提交我的答案时,这个问题已被删除。你是否已经解决了这个问题,或者只是认为它是无关紧要的? – 2011-02-05 06:27:42

+0

我设法优化了应用程序的性能。但是我绝对有兴趣听到你的想法! – Voldemort 2011-02-05 06:41:23

回答

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

 (不一定是直接回答这个问题,但后续疑问,指定ImageAttributesDrawImage方法导致性能降低,这问题是 因为删除了,但我在这里发布我的回应呢,因为我已经写好了。如果你想忽略。)

绘图图形很慢,尤其是当您同时应用渲染效果时。花几分钟在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比设置渲染属性要快得多。

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