0

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

这就是问题:

$image1 的高度为 2950 像素。$image2 的高度高 50 像素,3000 像素。我需要将 $image2 放入 $image1 中,并且可以跳过 $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)

我找到的页面,例如这个(无法成功使用 lockbits)或这个(https://web.archive.org/web/20121203144033/http://www.bobpowell.net/lockingbits.htm)是在“简单的英语”中,但如何将这个概念转换为 PowerShell?

4

1 回答 1

0

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

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

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

顺便说一句,如果您仍然感兴趣:

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

于 2014-11-05T01:25:54.073 回答