Code39
Code39

Reputation: 186

How do I correctly pass parameters to ImageMagick from PowerShell?

The following code works perfectly from the command line to combine two TIFF files.

magick -quiet file1.tif file2.tif -compress JPEG filecombined.tif

However, when I try to use it in PowerShell, I am getting many errors from Magick that indicate that it is not getting the correct parameters. My PowerShell code looks something like the following.

$InputFiles = 'files1.tif file2.tif'
$DestinationFile = 'filecombined.tif'
$magick -quiet $InputFiles -compress JPEG $DestinationFile

This gives me errors stating that it cannot find the input files and the message indicates that it thinks it is one filename instead of two. In PowerShell v4, I was able to get it to work by quoting each of the names. Not sure why this helped, but the names did not have spaces. However, I had to upgrade to v5 and this method broke.

I tried using a temporary file to store the input filenames, but this just caused a different error.

$InputFiles = 'files1.tif file2.tif'
$InputFiles | Out-File list.tmp
$DestinationFile = 'filecombined.tif'
$magick -quiet '@list.tmp' -compress JPEG $DestinationFile

magick.exe: unable to open image '@z:ÿþz

Upvotes: 1

Views: 2203

Answers (2)

user8994375
user8994375

Reputation:

I had a large collection of EPS images in several folders that I had to convert to PNG. I tested many Image Conversion programs, but most could not handle recursive conversion of Vector to Raster without choking (most displayed errors after processing a limited number of files. Some could not convert recursively through many subfolders). I created the following Powershell script from various sources that solved my problem and made recursive conversion of many files and folders easier. You can modify the file to perform any ImageMagick functions you need.

Have Fun.

# Recursive-Convert-EPS-to-PNG.ps1
$srcfolder = "C:\Temp"
$destfolder = "C:\Temp"
$im_convert_exe = "convert.exe"
$src_filter = "*.eps"
$dest_ext = "png"
$options = "-depth 8 -colorspace gray -threshold 40% -alpha off"
$logfile = "C:\temp\convert.log"
$fp = New-Item -ItemType file $logfile -force
$count=0
foreach ($srcitem in $(Get-ChildItem $srcfolder -include $src_filter -recurse))
{
$srcname = $srcitem.fullname

# Construct the filename and filepath for the output
$partial = $srcitem.FullName.Substring( $srcfolder.Length )
$destname = $destfolder + $partial
$destname= [System.IO.Path]::ChangeExtension( $destname , $dest_ext )
$destpath = [System.IO.Path]::GetDirectoryName( $destname )

# Create the destination path if it does not exist
if (-not (test-path $destpath))
{
    New-Item $destpath -type directory | Out-Null
}

# Perform the conversion by calling an external tool
$cmdline =  $im_convert_exe + " `"" + $srcname  + " `"" + $options + " `"" + $destname + " `""

#echo $cmdline
invoke-expression -command $cmdline

# Get information about the output file    
$destitem = Get-item $destname

# Show and record information comparing the input and output files
$info = [string]::Format( "{0} `t {1} `t {2} `t {3} `t {4} `t {5}", $count, $partial, $srcname, $destname, $srcitem.Length ,  $destitem.Length)
echo $info
Add-Content $fp $info

$count=$count+1
} 

Upvotes: 1

Code39
Code39

Reputation: 186

Put all the parameters for Magick into an array and use the call (&) operator to execute the command.

$MagickParameters = @( '-quiet' )
$MagickParameters += 'file1.tif'
$MagickParameters += 'file2.tif'
$MagickParameters += @( '-compress', 'JPEG' )
$MagickParameters += 'filecombined.tif'
&'magick' $MagickParameters

This may not be the most efficient use of arrays, but similar methods are possible if performance is a concern.

Upvotes: 1

Related Questions