Konwersja grafiki w PowerShellu

W dzisiejszym poście chciałbym zaprezentować prosty skrypt PowerShell’owy do konwersji grafiki. Zwykle do tego typu zadań wykorzystywałem narzędzia firm trzecich, ale okazuje się, iż wcale nie jest to konieczne. PowerShell z drobną pomocą .NET’a świetnie sobie z tym radzi.

By móc w ogóle skorzystać z odpowiednich klas .NETa konieczne jest załadowanie odpowiednich bibliotek z przestrzeni nazw System.Windows.Forms.

[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")

Aby podejść do problem bardziej profesjonalnie tworzymy listę wyboru dostępnych formatów, czyli do jakiego typu pliku graficznego przekonwertujemy nasze zdjęcie.

$Title = "Format"
$Message = "Wybierz docelowy format pliku?"

$ChoiceBmp = New-Object System.Management.Automation.Host.ChoiceDescription "&Bmp"
$ChoiceEmf = New-Object System.Management.Automation.Host.ChoiceDescription "&Emf"
$ChoiceGif = New-Object System.Management.Automation.Host.ChoiceDescription "&Gif"
$ChoiceIcon = New-Object System.Management.Automation.Host.ChoiceDescription "&Icon"
$ChoiceJpeg = New-Object System.Management.Automation.Host.ChoiceDescription "&Jpeg"
$ChoicePng = New-Object System.Management.Automation.Host.ChoiceDescription "&Png"
$ChoiceTiff = New-Object System.Management.Automation.Host.ChoiceDescription "&Tiff"
$ChoiceWmf = New-Object System.Management.Automation.Host.ChoiceDescription "&Wmf"

$Types = [System.Management.Automation.Host.ChoiceDescription[]]($ChoiceBmp, $ChoiceEmf, $ChoiceGif, $ChoiceIcon, $ChoiceJpeg, $ChoicePng, $ChoiceTiff, $ChoiceWmf)
$Type = $host.ui.PromptForChoice($Title, $Message, $Types, 0)

I po dokonaniu wybory generujemy odpowiedni format pliku.

Switch($Type)
{
	0 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Bmp; $Ext = ".bmp"}
	1 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Emf; $Ext = ".emf"}
	2 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Gif; $Ext = ".gif"}
	3 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Icon; $Ext = ".ico"}
	4 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Jpeg; $Ext = ".jpg"}
	5 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Png; $Ext = ".png"}
	6 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Tiff; $Ext = ".tif"}
	7 {$ImageFormat = [System.Drawing.Imaging.ImageFormat]::Wmf; $Ext = ".wmf"}
}

Mając tak przygotowane środowisko, możemy przejść do sedna sprawy. Mianowicie wskazujemy jaki plik źródłowy chcemy przekonwertować i gdzie chcemy zapisać plik docelowy.

$SourceFile = "p:\powershell.bmp"
$Destination = $(Get-Location).Path
$SourceFileProperty = Get-ItemProperty $SourceFile
$ImageName = $SourceFileProperty.BaseName
$SaveLocation = Join-Path -Path $Destination -ChildPath ($ImageName+$Ext)

Natomiast sama konwersja odbywa się poprzez utworzenie obiektu do którego ładujemy żądany obraz.

$Image = new-object system.drawing.bitmap $SourceFile

Jeżeli chcemy możemy go poddać dodatkowej prostej obróbce, ale nie jest to wymagane.

$Image | Get-Member

Ostatecznie zapisujemy plik pod wskazaną ścieżką wraz z uwgzlędnieniem wcześniej zdefiniowanego formatu. Ważne jest również, aby po całej operacji zwolnić zasoby. Bez tej operacji plik źródłowy będzie cały czas „otwarty” w systemie i nie będzie można go np. usunąć.

$Image.save($SaveLocation,$ImageFormat)
$Image.Dispose()

Sprawdźmy więc jak się udała nasza konwersja.

Jak widzmy został utworzony nowy plik graficzny. Przy czym możemy zaobserwować, iż jak plik w formacie bmp zajmował ponad 800KB to przekonwertowany plik w formacie jpeg zajmuje niecałe 20KB.

Gotową funkcję do masowej konwersji możemy znaleźć w galerii TechNetu.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s