2011-07-28 20 views
5

Potrzebuję przekonwertować wszystkie obrazy w folderze i podfolderach na jpg. Muszę partii tego procesu z pliku polecenia. Narzędzia GUI do igieł dla mnie Potrzebuję skryptu.Konwertuj wszystkie obrazy na jpg

Próbowałem użyć Mogrify.exe z ImageMagick, istnieje również funkcja convert.exe, ale Afaik oba z nich są w stanie konwertować obrazy.

pisałem następny skrypt:

$rootdir = "E:\Apps\скрипты\temp1\graphics" 
$files = dir -r -i *.png $rootdir 
foreach ($file in $files) {.\mogrify.exe -format png *jpg $file} 

Ale to nie działa, gdy próbuję go uruchomić, mam błędy:

mogrify.exe: unable to open file `*jpg' @ error/png.c/ReadPNGImage/3633. 
mogrify.exe: Improper image header `E:\Apps\скрипты\temp1\graphics\telluric\day\ 
Athens\2011-07-03-17.png' @ error/png.c/ReadPNGImage/3641. 
mogrify.exe: unable to open image `*jpg': Invalid argument @ error/blob.c/OpenBl 
ob/2588. 

Mam także znaleźć następny kod:

[Reflection.Assembly]::LoadWithPartialName('System.Drawing') 

$img=[Drawing.Image]::FromFile("$(cd)\Max.jpg") 
$img.Save("$(cd)\max.gif", 'Gif') 
$img.Dispose() 

Jak mogę uzyskać to działa z drzewa katalogów i konwertować png i tiff do jpg?

Odpowiedz

13

Robiłem coś podobnego z konwertowania plików bitmapowych na ikonę Pliki tutaj:

http://sev17.com/2011/07/creating-icons-files/

ja go dostosować do własnych potrzeb i przetestować funkcję do konwersji plików graficznych do JPG:

function ConvertTo-Jpg 
{ 
    [cmdletbinding()] 
    param([Parameter(Mandatory=$true, ValueFromPipeline = $true)] $Path) 

    process{ 
     if ($Path -is [string]) 
     { $Path = get-childitem $Path } 

     $Path | foreach { 
      $image = [System.Drawing.Image]::FromFile($($_.FullName)); 
      $FilePath = [IO.Path]::ChangeExtension($_.FullName, '.jpg'); 
      $image.Save($FilePath, [System.Drawing.Imaging.ImageFormat]::Jpeg); 
      $image.Dispose(); 
     } 
    } 

} 

#Use function: 
#Cd to directory w/ png files 
cd .\bin\pngTest 

#Run ConvertTo-Jpg function 
Get-ChildItem *.png | ConvertTo-Jpg 
+0

Dzięki za odpowiedź! – Suliman

+0

Nie ma problemu. Pamiętaj, aby oznaczyć pytanie jako udzielone. –

+0

Wygląda dobrze; chociaż użyłbym '[IO.Path] :: ChangeExtension ($ _. FullName, '.jpg')' zamiast ręcznego formatowania napisów. –

0

Zaadaptowałem Chad Miller's answer w celu włączenia możliwości ustawienia poziomu jakości JPEG z tego wpisu na blogu:
Benoît Patra's blog: Resize image and preserve ratio with Powershell

# Try uncommenting the following line if you receive errors about a missing assembly 
# [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
function ConvertTo-Jpg 
{ 
    [cmdletbinding()] 
    param([Parameter(Mandatory=$true, ValueFromPipeline = $true)] $Path) 

    process{ 
    $qualityEncoder = [System.Drawing.Imaging.Encoder]::Quality 
    $encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1) 

    # Set JPEG quality level here: 0 - 100 (inclusive bounds) 
    $encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($qualityEncoder, 100) 
    $jpegCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | where {$_.MimeType -eq 'image/jpeg'} 

    if ($Path -is [string]) { 
     $Path = get-childitem $Path 
    } 

    $Path | foreach { 
     $image = [System.Drawing.Image]::FromFile($($_.FullName)) 
     $filePath = "{0}\{1}.jpg" -f $($_.DirectoryName), $($_.BaseName) 
     $image.Save($filePath, $jpegCodecInfo, $encoderParams) 
     $image.Dispose() 
    } 
    } 
} 

#Use function: 
# cd to directory with png files 
cd .\bin\pngTest 


#Run ConvertTo-Jpg function 
Get-ChildItem *.png | ConvertTo-Jpg 
+0

Uzyskiwanie odwróconych kolorów z pliku PNG za pomocą kanału alfa. Masz pomysł, jak to naprawić? –

+0

@RossPresser Nie wiem sam, ale szybkie wyszukiwanie doprowadziło do [odpowiedzi] (http://stackoverflow.com/q/6513633/603003). Zauważ, że System.Drawing.Image jest czystym API .NET, więc każda odpowiedź wykorzystująca .NET (czy to w języku C# czy PS) może być "przetłumaczona". – ComFreek

+0

Interesujące. Skończyło się na skopiowaniu 42 obrazów na inny komputer, na którym mogłem użyć imagemagick. Ale będę o tym pamiętać pewnego dnia. –