2017-02-11 7 views
0

ファイルアイコンをとり、それらをbase64に変換するpowershellスクリプトを作成します。ファイルアイコン(関連するだけでなく、画像のサムネイルと動画のサムネイル)を取得できるAPIアセンブリがあります。残念ながら、それが与えられるフォーマットはBitmapSourceです。どのようにソースをイメージに変換するか、より正確には、それをPowerShellを介して厳密にbase64に変換することができます。BitmapSourceをPowershell経由でBitmapImage(またはBase64)に変換する

メモ:IT PowerShellにする必要があります...

私は答えを見つけるための研究のトンをやってみましたが、すべてが、それは難しい私はPowerShellのにC#のを変換できるようになり、C#で行われます。..

これは私がこれまで持っているものです。

Add-Type -Path ..\dll\Microsoft.WindowsAPICodePack.Shell.dll 
Add-Type -Path ..\dll\Microsoft.WindowsAPICodePack.dll 

Import-Module ..\dll\Microsoft.WindowsAPICodePack.dll 
Import-Module ..\dll\Microsoft.WindowsAPICodePack.Shell.dll 

[System.Windows.Media.Imaging.BitmapSource] $iconSrc = [Microsoft.WindowsAPICodePack.Shell.ShellFile]::FromFilePath('image I am converting').Thumbnail.BitmapSource 

はEDIT:

私は、次のコードを使用して、イメージにソースを変換する方法を見つけました:

[System.Windows.Media.Imaging.BitmapSource] $iconSrc = [Microsoft.WindowsAPICodePack.Shell.ShellFile]::FromFilePath ('Image to convert path').Thumbnail.BitmapSource 
$MemoryStream = New-Object System.IO.MemoryStream 
$enc = New-Object System.Windows.Media.Imaging.BmpBitmapEncoder 
$enc.Frames.Add([System.Windows.Media.Imaging.BitmapFrame]::Create($iconSrc)) 
$enc.Save($MemoryStream) 
$bitmap = New-Object System.Drawing.Bitmap($MemoryStream) 

しかし、私も問題が起きているbase64に画像を変換する必要があります。イメージをメモリストリームに保存しようとしていますが、バイトを見るとnullになります。

MemoryStream = New-Object System.IO.MemoryStream 
$bitmap.save($MemoryStream) 
$Bytes = $MemoryStream.ToArray() 
$MemoryStream.Flush() 
$MemoryStream.Dispose() 
$iconB64 = [convert]::ToBase64String($Bytes) 

答えて

0

たぶん私はここに問題を誤解していますが、Base64でに画像を変換すると、このような単純な次のようになります。もう一度

[convert]::ToBase64String((Get-Content $ImagePath -Encoding Byte)) 

、私はあなたの問題を誤解しているかもしれませんが、私はにそれを使用していました私はファイル依存関係を持たないように、GUIにBLOBを埋め込みました。

+0

私はそれが簡単だったと思いますが、ビットマップソースはファイル(IE:ファイルエクスプローラまたはテキストドキュメントアイコンなど)のサムネイルのソースです実際には(効率的に、すべてのファイルタイプで動作します)。問題は、ビットマップソースが残っていることです。ファイルタイプ(任意)のサムネイルを取得してから返されるデータです。私はそれを変換しようとしています。つまり、これをbase64または画像のいずれかに変換するために、何らかのアセンブリが必要なことを意味します。 – TheTechyGamer

0

$ビットマップ| gmの定義は、imageformatの第2引数が必要であることを示しています。

bitmapsaveにimageformatを追加してみてください。これは私にとってはうまくいくようです:

MemoryStream = New-Object System.IO.MemoryStream 
$bitmap.save($MemoryStream, [System.Drawing.Imaging.ImageFormat]::Jpeg) 
$Bytes = $MemoryStream.ToArray() 
$MemoryStream.Flush() 
$MemoryStream.Dispose() 
$iconB64 = [convert]::ToBase64String($Bytes) 
関連する問題