# encoding: ascii
# api: powershell
# title: Compress-Bitmap
# description: Compress a bitmap to a certain filesize, using the PSCX Import-Bitmap, Resize-Bitmap, and Export-Bitmap … and a little trial and error.
# version: 0.1
# type: function
# author: Joel Bennett
# license: CC0
# function: Compress-Bitmap
# x-poshcode-id: 1290
# x-archived: 2013-05-22T18:29:49
# x-published: 2010-08-24T14:48:00
#
#
function Compress-Bitmap {
PARAM(
   [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
   [IO.FileInfo]$SourceFile
,
   [Parameter(Mandatory=$true, Position=1)]
   [String]$DestinationFile
,   
   [Parameter(Mandatory=$false)]
   [Int]$Width
,  [Parameter(Mandatory=$false)]
   [Int]$Height   
,  [Parameter(Mandatory=$false)]
   [Int]$MaxFilesize
,  [Parameter(Mandatory=$false)]
   [Int]$Quality = 100
)
BEGIN { if($SourceFile) { $SourceFile = Get-ChildItem $SourceFile } }
PROCESS {
   # Work our way down until we get a small enough file (this might be slow)
   [string]$intermediate = [IO.path]::GetRandomFileName() + ".jpeg"
   $bitmap = Import-Bitmap $SourceFile
   
   if($Width -and $Height) {
      $bitmap = Resize-Bitmap -Bitmap $bitmap -Width $Width -Height $Height
   } else { # work around another bug in Export-Bitmap
      $bitmap = Resize-Bitmap -Bitmap $bitmap -Percent 100
   }
   
   do { 
      Export-Bitmap -Bitmap $bitmap -Path $intermediate -Quality ($Quality--)
   } while( $MaxFilesize -and ((Get-ChildItem $intermediate).Length -gt $MaxFilesize))
   Write-Host "Output Quality: $($Quality + 1)%" -Foreground Yellow
   Move-Item $intermediate $DestinationFile -Force -Passthru
}
}
