Конвертировать все изображения в JPG - PullRequest
6 голосов
/ 28 июля 2011

Мне нужно конвертировать все изображения в папке и подпапках в JPG.Мне нужно пакетировать этот процесс с командным файлом.Мне нужны скрипты для инструментов с графическим интерфейсом. Мне нужен скрипт.

Я пытался использовать mogrify.exe из ImageMagick, также есть функция convert.exe, но оба они могут конвертировать изображения.

Я написал следующий скрипт:

$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?

Ответы [ 2 ]

16 голосов
/ 29 июля 2011

Я сделал нечто похожее с преобразованием растровых файлов в файлы значков здесь:

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 голосов
/ 24 декабря 2014

Я адаптировал ответ Чеда Миллера , чтобы включить возможность устанавливать уровень качества JPEG из этого поста в блоге:
Блог Бенуа Патры: измените размер изображения и сохраните соотношение с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...