Konwersja grafiki w PowerShellu cz.2

Ostatnio prezentowałem jak konwertować grafikę do poszczególnych formatów. Natomiast dziś z racji potrzeb jednego projektu nad którym obecnie pracuję przedstawię w jaki sposób można masowo dokonać konwersji wymiarów plików graficznych.

Jak poprzednio, by zacząć całą zabawę konieczne jest załadowanie odpowiednich bibliotek .NETa.

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

Następnie definiujemy parametry początkowe takie jak plik źródłowy.

$File = "p:\powershell.jpg"

Oraz nowe wymiary zdjęcia

$Width = 300
$Height = 400

Teraz musimy przyjąć czy chcemy na sztywno ustalać wymiary zdjęcia które wyżej podaliśmy. Czy może jednak chcemy zachowywać proporcje. Jeśli to drugie to musimy odczytać obecne wymiary zdjęcia i dokonać obliczeń poszczególnych boków na podstawie proporcji. Dodatkowo odczytujemy również format zdjęcia, który będzie nam potrzebny podczas zapisywania przekonwertowanego zdjęcia.

$OldImage = new-object System.Drawing.Bitmap $File
Write-Host "$($OldImage.Width)x$($OldImage.Height)" -ForegroundColor Red

$ImageFormat = $OldImage.RawFormat

if($OldImage.Width -lt $OldImage.Height)
{
	$NewWidth = $Width
	[int]$NewHeight = [Math]::Round(($NewWidth*$OldImage.Height)/$OldImage.Width)
}
else
{
	$NewHeight = $Height
	[int]$NewWidth = [Math]::Round(($NewHeight*$OldImage.Width)/$OldImage.Height)
}

Mając tak przygotowane parametry nowego zdjęcia możemy przystąpić do konwersji. Do tego celu tworzymy nowy obiekt graficzny.

$NewImage = new-object System.Drawing.Bitmap $NewWidth,$NewHeight

Następnie tworzymy dodatkowy obiekt na podstawie klasy System.Drawing.Graphics. Tutaj można by zadać pytanie czym różni się System.Drawing.Bitmap od System.Drawing.Graphics?

Główną różnicą jest to, iż obiekt graficzny na podstawie System.Drawing.Bitmap jest po prostu zbiorem piksli. Natomiast obiekt graficzny na bazie System.Drawing.Graphics jest przestrzenią stricte dostosowaną do rysowania. Klasa ta dostarcza nam odpowiednie metody np. związane z rysowaniem kształtów graficznych czy specjalistyczną konwersją grafiki.

$Graphics = [System.Drawing.Graphics]::FromImage($NewImage)

Podajemy jakiego algorytmu chcemy użyć do przeskalowania obrazu. Następnie wskazujemy źródło obrazu oraz punkty definiujące obszar gdzie ma być on wklejony, czyli punkt początkowy (lewy górny róg) 0,0 oraz punkt końcowy (prawy dolny róg) 300,375 – gdyż takie są proporcje zmiejszonego obrazu.

$Graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$Graphics.DrawImage($OldImage, 0, 0, $NewWidth, $NewHeight)

Nasz obraz powinien być już przekonwertowany, ale by zakończyć całą operację wszystkie zmiany muszą być zapisane do pliku. By to zrobić musimy najpierw zamknąć dowiązanie do pliku źródłowego by później móc go nadpisać nowym obrazem.

$OldImage.Dispose()
$NewImage.Save($File,$ImageFormat)
$NewImage.Dispose()

Ostatecznie otwórzmy jeszcze raz nasz plik i sprawdźmy nowe wymiary zdjęcia.

$Image = new-object System.Drawing.Bitmap $File
Write-Host "$($Image.Width)x$($Image.Height)" -ForegroundColor Red
$Image.Dispose()

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

Advertisements

Skomentuj

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

Logo WordPress.com

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

Zdjęcie z Twittera

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

Facebook photo

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

Google+ photo

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

Connecting to %s