2017-02-11 2 views
0

Ich möchte ein Powershell-Skript erstellen, die Dateisymbole übernimmt und sie in base64 konvertiert. Es gibt eine API-Assembly, die es mir ermöglicht, die Dateisymbole zu erhalten (nicht nur zugeordnet, sondern auch Bild-Thumbnails und Video-Thumbnails). Leider ist das Format, in dem es angegeben wird, eine BitmapSource. Ich würde gerne wissen, wie ich die Quelle in ein Bild umwandeln könnte, oder genauer, es in base64 ausschließlich durch Powershell konvertieren.Konvertieren einer BitmapSource in eine BitmapImage (oder Base64) über Powershell

HINWEIS: ES HAT Powershell sein ...

Ich habe versucht, eine Tonne Forschung zu tun, die Antwort zu finden, aber alles ist in C# getan, was es schwer macht für mich C# in Powershell zu konvertieren ..

Dies ist, was ich bisher:

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:

ich einen Weg gefunden, um die Quelle zu einem Bild mit dem folgenden Code zu konvertieren:

[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) 

Allerdings muss ich auch das Bild in Base64 konvertieren, die ich habe Probleme damit. Ich versuche, das Bild in einem Speicherstream zu speichern, aber es wird null, wenn ich auf die Bytes schaue.

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

Antwort

0

Vielleicht sollte dies so einfach sein, ich bin Missverständnis, das Problem hier, aber Bilder zu Base64 Umwandlung:

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

Noch einmal, ich könnte Ihre Frage falsch verstanden, aber ich verwendet habe, dass zu blobs in GUIs einbetten, so dass ich keine Dateiabhängigkeiten habe.

+0

Ich wünschte, es so einfach wäre, aber die Bitmap-Quelle ist die Quelle für die Miniaturansicht einer Datei (IE: Datei-Explorer oder ein Textdokument Symbol zum Beispiel), die kann ich nur wirklich bekommen (effizient und arbeitet mit allen Dateitypen). Das Problem ist, dass ich mit einer Bitmap-Quelle festhalte, da dies die Daten sind, die beim Abrufen des Thumbnails eines Dateityps (any) zurückgegeben werden. Ich versuche das zu konvertieren, was bedeutet, dass ich wahrscheinlich eine Art Assembly benötige, um das entweder in base64 oder ein Bild zu konvertieren. – TheTechyGamer

0

$ bitmap | Die Definition von gm zeigt, dass ein zweiter Parameter von imageformat benötigt wird.

Versuchen Sie, ein Bildformat zur Bitmapsave hinzuzufügen. Dies scheint für mich zu arbeiten:

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)