2011-07-28 107 views
5

我需要將文件夾和子文件夾中的所有圖像轉換爲jpg。我需要用命令文件批處理這個進程。針對我的GUI工具針我需要腳本。將所有圖像轉換爲jpg

我試圖從ImageMagick使用mogrify.exe,也有convert.exe功能,但afaik他們都能夠轉換圖像。

我寫的下一個腳本:

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

但它不工作,當我嘗試運行它,我得到了錯誤:

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. 

而且我發現下面的代碼:

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

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

我如何才能使它與樹的工作,並將png和tiff轉換爲jpg?

回答

13

我已經做了轉換位圖文件到這裏圖標文件類似的東西:

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

我把它適應您的要求和測試功能,爲圖像文件轉換爲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

謝謝你的回答! – Suliman

+0

沒問題。請記住將問題標記爲已回答。 –

+0

看起來不錯;儘管我會使用'[IO.Path] :: ChangeExtension($ _。FullName,'.jpg')'而不是手動字符串格式。 –

0

我改編了Chad Miller's answer以整合從此博客文章中設置JPEG質量等級的能力:
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

從具有alpha通道的PNG獲取反轉的顏色。任何想法如何解決這個問題? –

+0

@RossPresser我不知道我自己,但一個快速搜索導致這[答](http://stackoverflow.com/q/6513633/603003)。請注意,System.Drawing.Image是純.NET API,因此任何使用.NET的答案(無論是C#還是PS)都可以被「翻譯」。 – ComFreek

+0

有趣。我最終只是將42張圖像複製到另一臺可以使用imagemagick的機器上。但有一天我會記住的。 –