Что нового

[Автоматизация] Сжатие множества jpg файлов в три клика

ulan44

Знающий
Сообщения
55
Репутация
8
Доброго времени суток камрады.
Вообщем требовалось как то упростить жизнь логистам в торговой компании, а именно при приемки товара грузчики всегда делали фото отчеты, потом эти отчеты отсылались компаниям поставщикам, соответственно у некоторых поставщиков были до кучи еще ограничения на почтовых серверах до 2Мб одно сообщение. Ну отчеты могли доходить до 300Мб, особо не на отсылаешь писем с ограничением в 2Мб.
Так вот, увидев это безобразие как они мучились в office picture manager решил им помочь.
И была написана эта утилита, с максимальным упрощенным интерфейсом и максимально быстрым сжатием изображения, до кучи еще есть вставка Copiright.
Может быть кому и пригодиться, пользуйтесь на здоровье.
Кстати будет и немного доработанная версия, с возможностью добавления файлов в архив rar или zip

Код:
#Include <File.au3>
#Include <Array.au3>
#include <GDIPlus.au3>

HotKeySet("{ESC}", "Terminate")

;Выбираем папки где хранятся файлы jpg и куда будем их сохранять
;Важно чтобы папки имели разные пути или разные имена

$Files_Path = FileSelectFolder("Укажите папку с файлами JPG",@DesktopDir)						;где хранятся оригинальные файлы
$Files_Result_Path = FileSelectFolder("Укажите папку для сохранения сжатых файлов",@DesktopDir)	;куда будем сохранять результат после сжатия файлов

      If $Files_Result_Path = $Files_Path Then
	  MsgBox(0,"Ошибочка","Невозможно сохранить файлы в одну и ту же папку с исходниками," & @CRLF & "Пожалуйста, выберите другую папку")
		 Sleep(500)
		 _Error()
	  EndIf

$Files_Mask="*.jpg"

Global $FileList=_FileListToArray($Files_Path,$Files_Mask,1)
$Nmbr_Files=$FileList[0]
_ArrayDelete($FileList,0)
 $handled_files=0
 ProgressOn("Мега прога", "Процесс сжатия изображений", "")

  For $File in $FileList
    If Compress_Jpg_Img_And_Add_Text($Files_Path&"\"&$File,$Files_Result_Path&"\"&$File,30,"Copyright ") Then ;тут можно подставить свой копирайт будет отображаться в верхнем левом углу
        $handled_files+=1
        ConsoleWrite("file "&$Files_Path&$File&" handled "&Int(100*$handled_files/$Nmbr_Files)&"%"&@CRLF)
    Else
        ConsoleWrite("file "&$Files_Path&$File&" handled failure"&@CRLF)
    EndIf
		ProgressSet(100*$handled_files/$Nmbr_Files, 100*$handled_files/$Nmbr_Files & " %        " & "Имя файла: " &$File &@CRLF &"Всего файлов в папке: "& $Nmbr_Files)
Next
ProgressSet(100 , "Все файлы сжаты", "Процесс выполнен на: "&100*$handled_files/$Nmbr_Files &"%")
sleep(5000)
ProgressOff()

Func Compress_Jpg_Img_And_Add_Text($sPath_To_Source_Jpg_File,$sPath_To_Result_Jpg_File,$iQuality=100,$sText="hello world",$xColor = 0xFFFFFFFF)

$iFontSize = 42	;размер шрифта
$iFontStyle = 3	;стиль

_GDIPlus_Startup()
$hFamily = _GDIPlus_FontFamilyCreate('Arial')	;Выбираем шрифт которым будет делать надпись
$hFont   = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontStyle)
$hFormat = _GDIPlus_StringFormatCreate()

$hImage = _GDIPlus_ImageLoadFromFile($sPath_To_Source_Jpg_File)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)

$iLeft = 5	;отступ от левого края
$iTop = _GDIPlus_ImageGetHeight($hImage)/100

$tLayout  = _GDIPlus_RectFCreate($iLeft, $iTop)
$hBrush  = _GDIPlus_BrushCreateSolid($xColor)
$aInfo    = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)

_GDIPlus_GraphicsDrawStringEx($hGraphic, $sText, $hFont, $aInfo[0], $hFormat, $hBrush)

    $sCLSID = _GDIPlus_EncodersGetCLSID ("JPG")
    $tParams = _GDIPlus_ParamInit (1)
    $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $iQuality)
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    $pParams = DllStructGetPtr($tParams)

    $ret=_GDIPlus_ImageSaveToFileEx ($hImage, $sPath_To_Result_Jpg_File, $sCLSID, $pParams)

_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage  )

_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_Shutdown()
Return $ret
EndFunc

Func _Error()
	  $Files_Result_Path = FileSelectFolder("Укажите папку для сохранения сжатых файлов",@DesktopDir)	;куда будем сохранять результат после сжатия файлов
	  Return $Files_Result_Path
EndFunc

Func Terminate()
	 Exit 0
EndFunc
 

Вложения

  • convert_jpg.au3
    3.4 КБ · Просмотры: 21

Skif_off

Знающий
Сообщения
173
Репутация
12
Quality = 30, качество совсем не имеет значение?
Оптимизация таблицы Хаффмана, прогрессивное сжатие + убрать EXIF дадут возможность поднять качество. Но не уверен, что GDIPlus это умеет, знаю, что умеет jpegtran.
 
Автор
U

ulan44

Знающий
Сообщения
55
Репутация
8
Skif_off сказал(а):
Quality = 30, качество совсем не имеет значение?
Качество да не имело значение, при таком параметре было вполне различимы детали разгрузки и содержимое европаллет, а так же в некоторых случаях допустим (брак, бой коробок и недовложения) изображение было приемлемым и вопросов не вызывало. А когда делали в ручную с помощью picture manager сжатие ставили до 70%, а то и до 80%, тогда периодически высылали исходники по просьбе поставщика.
Но спасибо за наводку, гляну в сторону jpegtran
 
Верх