我使用DrawImage Image函数将图像中的一部分复制到另一个图像。 是否有可能使复制的部分变得更“黑暗”?喜欢,特殊的色调?有人能给我一个例子吗?我听说过ImageAttributes,但我找不到它!Graphics.DrawImage变暗了?
注意:我不想编辑源图像。
我使用DrawImage Image函数将图像中的一部分复制到另一个图像。 是否有可能使复制的部分变得更“黑暗”?喜欢,特殊的色调?有人能给我一个例子吗?我听说过ImageAttributes,但我找不到它!Graphics.DrawImage变暗了?
注意:我不想编辑源图像。
的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);
}
(不一定是直接回答这个问题,但后续疑问,指定
ImageAttributes
到DrawImage
方法导致性能降低,这问题是 因为删除了,但我在这里发布我的回应呢,因为我已经写好了。如果你想忽略。)
绘图图形很慢,尤其是当您同时应用渲染效果时。花几分钟在Photoshop中工作,你会明白我的意思。变暗图像是一项计算成本很高的任务。你可以做些什么来让它变得更快。
这个问题进一步加剧了.NET Framework中的System.Drawing.Graphics
类中的例程在内部使用GDI +实现,这是而不是硬件加速。一种可能的选择是切换回基于GDI的渲染,这是在大多数系统上进行硬件加速(这取决于您的视频卡的供应商,但几乎所有您今天会发现的显卡都具有硬件加速功能,以实现比特块传输等基本功能) 。当然,这要困难得多,因为您需要从Windows API的P/Invoke函数来使用基于GDI的绘图例程; .NET为你提供的所有东西都是GDI +。这比完成更多的工作,现代硬件上的速度改进可能是最小的(特别是启用了Windows Vista/7的Aero主题,即使使用GDI也不使用硬件加速,因为所有内容都被绘制到内存中的位图) 。
当前实现,一对夫妇可能的优化的坚持就又映入脑海:
你是否调整图像大小,当你重绘?如果是这样,那就要求图像被内插,相比之下,这是非常慢的。
什么PixelFormat
是图像? Format32bppPArgb
比替代方案快得多。确保您使用该格式的图像。如果你不是现在,做这个改变应该会看到你的渲染速度大幅增加。
为什么你需要经常重新渲染图像?如果它是相同的图像,请在应用效果时绘制它并缓存返回的Bitmap
对象。然后每次需要重新绘制图像时,请使用已在内存中的图像,而不是创建一个新图像。这是一个简单的诀窍,但它使您不必每次都要再次做昂贵的零件。正如你所提到的,单独的DrawImage
比设置渲染属性要快得多。
一般而言,用户愿意等待大图像呈现。相应地设置界面比尝试优化图形例程更合适。使用进度条和忙碌光标来表示实际发生的事情,就用户而言,将进一步得多,而不是从代码中挤出几毫秒。除非你在一个循环中反复应用这个效果大约100或1000次(这看起来非常愚蠢),否则它不值得花费时间进行优化。
我刚写了一个关于这个例程的执行速度缓慢的问题的答案,但注意到当我试图提交我的答案时,这个问题已被删除。你是否已经解决了这个问题,或者只是认为它是无关紧要的? – 2011-02-05 06:27:42
我设法优化了应用程序的性能。但是我绝对有兴趣听到你的想法! – Voldemort 2011-02-05 06:41:23