this SO answerにC#メソッドがあり、画像に透明性があるかどうかを検出しました。私はこのメソッドをPowerShellに変換しようとしています。InteropServices.Marshal.Copy C#メソッドから変換されたPowerShellスクリプトで常にゼロ
残念ながら、私はそれを動作させるように見えることはできません。 Marshal.Copyの部分がすべて正常に機能しているように見えます.の配列は、Marshal.Copy
の後でもゼロでいっぱいです。続き
は、C#で元のコードです:
public bool IsAlphaBitmap(ref System.Drawing.Imaging.BitmapData BmpData)
{
byte[] Bytes = new byte[BmpData.Height * BmpData.Stride];
Marshal.Copy(BmpData.Scan0, Bytes, 0, Bytes.Length);
for (p = 3; p < Bytes.Length; p += 4) {
if (Bytes[p] != 255) return true;
}
return false;
}
そして、これは私が(それが動作しない)、これまで持っていPowerShellのバージョンである:
function IsAlphaBitMap([string]$imagepath)
{
$BitMap = New-Object System.Drawing.BitMap($imagepath)
$Rect = New-Object System.Drawing.Rectangle(0, 0, $BitMap.Width, $BitMap.Height)
$BmpData = [System.Drawing.Imaging.BitmapData]$BitMap.LockBits($Rect, [System.Drawing.Imaging.ImageLockMode]::ReadWrite, $BitMap.PixelFormat)
$Bytes = New-Object byte[] ($BmpData.Height * $BmpData.Stride)
[System.Runtime.InteropServices.Marshal]::Copy($BmpData.Scan0, $Bytes, 0, $Bytes.Length)
for($p=3 ; $p -lt $Bytes.Length ; $p+=4)
{
if ($Bytes[$p] -ne 255) { write-host $Bytes[$p] } # { return $true }
}
return $false
}
私はwrite-host
を使用していましたループは戻り値ではなく、常に各繰り返しの出力を読み取ることができます。これは常にゼロです。私はどこに間違っていたのか誰にでも見える?
出力がゼロの行であっても、 'write-host'からの出力を追加することを検討することができます。また、「これは32 bpp画像のみで動作する」というコメントの1つで警告に耳を傾けましたか?あなたがそうした場合、そのようなイメージを使ってテストを実行したと言わなければなりません。 – Sabuncu
申し訳ありませんが、私はそれを明確にしませんでした。あなたは正しいです、私は32ビットRGBA PNGイメージでこれを実行することを意図しました。 PNGタイプ0,2,3では、tRNSチャンクをチェックし、タイプ4のImageMagickでチェックします(遅いですが)私の場合はまれですので大丈夫です。私はこれがImageMagickを使うよりも速くなることを期待していましたが、まだ動作させていません。 – Bighead