DrawImage很慢,锁定了救援

本文关键字:锁定 很慢 DrawImage | 更新日期: 2023-09-27 18:29:19

我读过很多关于使用锁位操作图像的C#教程,但我不知道如何将这些信息应用到PowerShell中。

这就是问题所在:

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

 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)

我找到的页面,比如这个(无法成功使用锁定位)或这个(https://web.archive.org/web/20121203144033/http://www.bobpowell.net/lockingbits.htm)处于";简明英语";但是如何将这个概念转换为PowerShell呢?

DrawImage很慢,锁定了救援

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

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

您最好编写一个简单的cmdlet并在PowerShell脚本中使用它。

BTW,如果你仍然感兴趣:

在C#中使用lockbits(根据您的示例)依赖于不安全的上下文和使用指针。我认为PowerShell无法访问不安全的上下文
通过使用Marshall类,您可以在不使用不安全上下文的情况下操作非托管数据;特别是ReadWrite方法(使用Copy方法可能会以牺牲内存为代价加快速度)
PowerShell并不是用来替代.Net通用语言的,这就是Cmdlet的作用。