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
将比逐个复制像素更快。让它更快的一些建议:
- 尝试使用Image.Clone从原始图像中复制一个矩形,这将使您需要创建的对象数量最少
- 确保使用与原始图像相同的
PixelFormat
(复制速度更快)。Image
中有一个PixelFormat
属性 - 最重要的是:访问
Width
和Height
需要很长时间,所以请将它们保存到本地变量中以供重用。如果你事先了解它们,那是加快速度的好方法 - 不要指望在4:3的宽高比下会出现奇迹,每张图像的宽高比为3932*2950*3(假设24位RGB)=33Mb。这是一个很大的数据,你可能很容易试图复制一些演出,这取决于你有多少图像
您最好编写一个简单的cmdlet并在PowerShell脚本中使用它。
BTW,如果你仍然感兴趣:
在C#中使用lockbits
(根据您的示例)依赖于不安全的上下文和使用指针。我认为PowerShell无法访问不安全的上下文
通过使用Marshall
类,您可以在不使用不安全上下文的情况下操作非托管数据;特别是Read
和Write
方法(使用Copy
方法可能会以牺牲内存为代价加快速度)
PowerShell并不是用来替代.Net通用语言的,这就是Cmdlet的作用。