我已经阅读了很多关于使用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?
答案 0 :(得分:0)
您使用的是正确的方法。使用DrawImage
将比逐个复制像素更快。
一些建议,使其更快:
PixelFormat
(更快速复印)。 PixelFormat
中有Image
个属性。Width
和Height
需要很长时间,因此请将它们保存到本地变量中以便重复使用。如果您事先了解它们,那么这是一种加快速度的好方法。最好编写简单的cmdlet并在PowerShell脚本中使用它。
如果您仍然感兴趣的话,顺便说一下:在C#中使用lockbits
(根据您的示例)依赖于unsafe context and using pointers。我不相信PowerShell可以访问不安全的上下文
您可以使用Marshall
类操作非托管数据而不使用不安全的上下文;特别是Read
和Write
方法(并且您可以使用Copy
方法以内存为代价加快速度。)
PowerShell并不是替代.Net通用语言,而是CmdLets的用途。