본문 바로가기

업무 자동화

powershell 사진 용량 조절 스크립트

반응형


1. imagemagick 프로그램 이용
사진 해상도를 조절하여 용량을 줄이는 방법으로 imagemagick 프로그램이 필요하다.

* imagemagick 공식 홈페이지(윈도우 설치)
https://imagemagick.org/script/download.php#windows
* imagemagick 윈도우 설치 링크
https://download.imagemagick.org/ImageMagick/download/binaries/ImageMagick-7.0.11-12-Q16-HDRI-x64-dll.exe
* 환경변수 설정(PATH 뒤에 본인의 imagemagick 폴더 이름 입력)
cmd or powershell > setx path "%PATH%;C:\Program Files\ImageMagick-7.0.11-Q16-HDRI"

사진 용량 줄이고자 하는 대상 폴더로 이동 > 마우스 우클릭 후 여기서 Powershell 창 열기 >
아래 스크립트 복사 후 Powershell 창에 붙여넣기
 param([string]$path = ".\", [int]$minSize = 0, [switch]$jpg, [switch]$png, [switch]$gif, [switch]$verbose, [switch]$report)
 
 function Get-Size
 {
     param([string]$pth)
     "{0:n2}" -f ((gci -path $pth -recurse | measure-object -property length -sum).sum /1mb) + " mb"
 }
 
 function Get-Size-Kb
 {
     param([string]$pth)
     "{0:n2}" -f ((gci -path $pth -recurse | measure-object -property length -sum).sum /1kb) + " kb"
 }
 
 function Compress-Images([string]$type) {
     $params = switch ($type) {
         "jpg" { "-compress jpeg -quality 32" }
         "gif" { "-fuzz 10% -layers Optimize" }
         "png" { "-depth 24 -define png:compression-filter=2 -define png:compression-level=9 -define png:compression-strategy=1" }
     }
 
     if ($report) {
         echo ""
         echo "Listing $type files that would be included for compression with params: $params"
     } else {
         echo ""
         echo "Compressing $type files with parameters: $params"
     }
     
     Get-ChildItem $path -Recurse -Include "*.$type" | 
         Where-Object {
             $_.Length/1kb -gt $minSize
         } | 
         Sort-Object -Descending length |
         ForEach-Object {
             $file = $_.FullName
         
             if ($report) {
                 $fSize = Get-Size-Kb($file)
                 echo "$file - $fSize"
             } else {
                 if ($verbose) {
                     echo "Compressing $file"
                     $fileStartSize = Get-Size-Kb($file)
                 }
         
                 # compress image
                 if ($report -eq $False) {
                     iex "magick ""$file"" $params ""$file"""
                 }
 
                 if ($verbose) {
                     $fileEndSize = Get-Size-Kb($file)
                     echo "Reduced from $fileStartSize to $fileEndSize"
                 }
             }
         }
 }
 
 # begin compression process
 $startSize = Get-Size $path
 echo "Compressing images greater than $minSize kb in $path"
 echo "---"
 
 # determine whether to compress specific image types or all
 $compressAll = $false
 if (-NOT $jpg -AND -NOT $png -AND -NOT $gif) {
     $compressAll = $true
 }
 
 # compress, or skip, each image type as directed
 if ($jpg -OR $compressAll) {
     Compress-Images "jpg"
 }
 if ($gif -OR $compressAll) {
     Compress-Images "gif"
 }
 if ($png -OR $compressAll) {
     Compress-Images "png"
 }
 
 # echo completion and stats
 $endSize = Get-Size $path
 echo ""
 echo "DONE"
 echo "Starting sizes: $startSize" 
 echo "Ending sizes: $endSize"
 
 
스크립트 17번 째 줄의 quality 값을 낮게 수정할 수록 사진이 더 압축되어 용량이 줄어든다. 


2. 이미지 크기를 줄여 용량 감소

1번 사용방법과 동일
 $source = "."
 $exclude_list = '(Imprimerie|Photos)'
 $scale = 30
 Add-Type -AssemblyName System.Drawing
 
 $source_listephotos = Get-ChildItem $source -Recurse | 
 	where { $_.FullName -notmatch $exclude_list }
 
 
 foreach ($source_photos in $source_listephotos) {
 	$source = [System.Drawing.Image]::FromFile($source_photos.FullName)
     $size = "$([int]($source.Width*($scale/100))), $([int]($source.Height*($scale/100)))"
 	$dest = New-Object System.Drawing.Bitmap($source, $size)
 	$source.Dispose()
 	$dest.Save($source_photos.Fullname)
 	$dest.Dispose()
 }
 
 



반응형

'업무 자동화' 카테고리의 다른 글

cmd 라우팅 테이블 배치파일  (0) 2021.05.28
cmd IP 변경 배치파일  (0) 2021.05.28
유튜브(youtube) 자동 광고 스킵  (0) 2021.04.30
github 자동화 스크립트  (0) 2021.04.28
VBA 메크로 모음  (0) 2021.04.28