# encoding: ascii # api: powershell # title: Resizer of pictures # description: Script for total resize of all pictures in one or multiple directories. # version: 0.1 # type: script # author: Oleg Medvedev # license: CC0 # x-poshcode-id: 6132 # x-archived: 2016-03-18T23:47:38 # x-published: 2016-12-05T11:22:00 # # Purpose: free space on the file server used by users’ multimegabyte-size home pictures. # Disadvantages: # No orientation bit handling # No metadata preserving (now it is completely lost) # [reflection.assembly]::LoadWithPartialName("System.Drawing") $SizeLimit=1280 # required size of picture's long side $logfile="resizelog.txt" # log file for errors $toresize=$args[0] # list of directories to find and resize images. can be empty if ([string]$toresize -eq “”) { # if script startup parameter empty, use some default values $toresize=@("n:\path1", "n:\path2\", "s:\path3") } echo $toresize # visual control #Write-Host -NoNewLine ("Press any key.") # Optional "Press any key" #$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") #Write-Host "" $error.clear() # first part. find and resize jpgs Get-ChildItem -recurse $toresize -include *.jpg | foreach { $OldBitmap = new-object System.Drawing.Bitmap $_.FullName # open found jpg if ($error.count -ne 0) { # error handling $error | out-file $logfile -append -encoding default $error[($error.count-1)].TargetObject | out-file $logfile -append -encoding default echo $_>>$logfile $error.clear() } $LongSide=$OldBitmap.Width # locating long side of picture if ($OldBitmap.Width -lt $OldBitmap.Height) { $LongSide=$OldBitmap.Height } if ($LongSide -gt $SizeLimit) { # if long side is greater than our limit, process jpg if ($OldBitmap.Width -lt $OldBitmap.Height) { # calculate dimensions of picture resize to $newH=$SizeLimit $newW=[int]($OldBitmap.Width*$SizeLimit/$OldBitmap.Height) } else { $newW=$SizeLimit $newH=[int]($OldBitmap.Height*$newW/$OldBitmap.Width) } $NewBitmap = new-object System.Drawing.Bitmap $newW,$newH # create new bitmap $g=[System.Drawing.Graphics]::FromImage($NewBitmap) $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic # use high quality resize algorythm $g.DrawImage($OldBitmap, 0, 0, $newW, $newH) # resize our picture $name=$_.DirectoryName+"\"+$_.name+".new" # generating name for new picture $NewBitmap.Save($name, ([system.drawing.imaging.imageformat]::jpeg)) # save newly created resized jpg $NewBitmap.Dispose() # cleaning up our mess $OldBitmap.Dispose() $n=get-childitem $name if ($n.length -ge $_.length) { # if resized jpg has greater size than original Write-host -NoNewLine "+" # draw "+" $n.delete() # and delete it } else { # if resized jpg is smaller than original if ($n.Exists -and $_.Exists) { $name=$_.FullName $_.Delete() # delete original $n.MoveTo($name) # rename new file to original name (replace old file with new) echo ($Name + " " + $LongSide) # write its name for visual control } } } else { # if long side is smaller than limit, draw dot for visual Write-host -NoNewLine "." $OldBitmap.Dispose() } } #second part. process other than jpgs bitmaps Get-ChildItem -recurse $toresize -include *.bmp, *.tif, *.gif | foreach { $OldBitmap = new-object System.Drawing.Bitmap $_.FullName # open picture if ($error.count -ne 0) { # handle errors if any $error | out-file $logfile -append -encoding default $error[($error.count-1)].TargetObject | out-file $logfile -append -encoding default $error.clear() } $LongSide=$OldBitmap.Width # find picture's long side if ($OldBitmap.Width -lt $OldBitmap.Height) { $LongSide=$OldBitmap.Height } if ($LongSide -gt $SizeLimit) { # if long side is greater than our limit, process picture if ($OldBitmap.Width -lt $OldBitmap.Height) { # calculating new dimensions $newH=$SizeLimit $newW=[int]($OldBitmap.Width*$SizeLimit/$OldBitmap.Height) } else { $newW=$SizeLimit $newH=[int]($OldBitmap.Height*$newW/$OldBitmap.Width) } $NewBitmap = new-object System.Drawing.Bitmap $newW,$newH # create new bitmap $g=[System.Drawing.Graphics]::FromImage($NewBitmap) $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic $g.DrawImage($OldBitmap, 0, 0, $newW, $newH) # copy resized image to it $name=$_.DirectoryName+"\"+$_.name.substring(0, $_.name.indexof($_.extension))+".jpg" # generating new name, jpg extension $NewBitmap.Save($name, ([system.drawing.imaging.imageformat]::jpeg)) # save new file $NewBitmap.Dispose() $OldBitmap.Dispose() $n=get-childitem $name if ($n.length -ge $_.length) { # if new file is longer than original, $n.delete() # delete new file Write-host -NoNewLine "+" # and draw "+" for beauty } else { # if new file is shorter than original (as we expect) echo ($Name + " " + $LongSide) # draw its name $_.Delete() # delete oroginal } } else { # if long side is less than our limit, try to recompress it to jpg $name=$_.DirectoryName+"\"+$_.name.substring(0, $_.name.indexof($_.extension))+".jpg" $OldBitmap.Save($name, ([system.drawing.imaging.imageformat]::jpeg)) $OldBitmap.Dispose() $n=get-childitem $name if ($n.length -ge $_.length) { # if new jpg is greater than original $n.delete() # delete new jpg Write-host -NoNewLine "-" # draw "-" for visual control } else { echo ($Name + " " + $LongSide) # draw new file name $_.Delete() # delete original } } }