DrawImage很慢,锁定救援?

时间:2014-11-05 00:34:18

标签: c# powershell image-manipulation lockbits

我已经阅读了很多关于使用lockbits来操作图像的c#教程,但我不知道如何将这些信息应用到powershell中。

这是问题所在:

$ image1'的高度为2950像素。 $ image2的高度为50像素,3000像素。我需要在$ image1中放入$ image2,我可以跳过$ image2的前49个px行。所以在伪代码中:

 For(y=0... For(x=0.... { image1(x,y) = image2(x,y+50) } ....))

下面的powershell脚本可以正常工作,但效果不是很快:

$rect = new-object Drawing.Rectangle 0, 0, $image1.width, $image1.height
$image1drawing.drawimage($image2, 
                         $rect, 
                         0, 50, $image2.width, ($image2.height - 50), 
                         $graphicalUnit)

我找到的网页,例如这个(Problem with using lockbits)或此网页(http://bobpowell.net/lockingbits.aspx)是"普通英文"但是如何将这个概念转换为PowerShell?

1 个答案:

答案 0 :(得分:0)

您使用的是正确的方法。使用DrawImage将比逐个复制像素更快。 一些建议,使其更快:

  1. 尝试使用Image.Clone从原始图像复制矩形,这将导致您需要创建的对象数量最少。
  2. 确保使用与原始图像相同的PixelFormat(更快速复印)。 PixelFormat中有Image个属性。
  3. 最重要的是:访问WidthHeight需要很长时间,因此请将它们保存到本地变量中以便重复使用。如果您事先了解它们,那么这是一种加快速度的好方法。
  4. 不要指望每个图像的宽高比为4:3的奇迹是3932 * 2950 * 3(假设24位RGB)=每个图像33Mb。这是很多数据,你可能很容易尝试复制一些演出,具体取决于你有多少图像。
  5. 最好编写简单的cmdlet并在PowerShell脚本中使用它。

    如果您仍然感兴趣的话,顺便说一下:

    在C#中使用lockbits(根据您的示例)依赖于unsafe context and using pointers。我不相信PowerShell可以访问不安全的上下文 您可以使用Marshall类操作非托管数据而不使用不安全的上下文;特别是ReadWrite方法(并且您可以使用Copy方法以内存为代价加快速度。)
    PowerShell并不是替代.Net通用语言,而是CmdLets的用途。