Автор Тема: [Автоматизация] Сжатие множества jpg файлов в три клика  (Прочитано 6092 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ulan44 [?]

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

Код: AutoIt [Выделить]
#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
 



Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Сентябрь 23, 2015, 13:40:52 от ulan44 »

Русское сообщество AutoIt


Оффлайн ulan44 [?]

  • Новичок
  • *
  • Сообщений: 55

  • Автор темы
  • Репутация: 7
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Бывает  :( , исправил.

Оффлайн Skif_off [?]

  • Новичок
  • *
  • Сообщений: 173
  • Репутация: 12
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Quality = 30, качество совсем не имеет значение?
Оптимизация таблицы Хаффмана, прогрессивное сжатие + убрать EXIF дадут возможность поднять качество. Но не уверен, что GDIPlus это умеет, знаю, что умеет jpegtran.

Оффлайн ulan44 [?]

  • Новичок
  • *
  • Сообщений: 55

  • Автор темы
  • Репутация: 7
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Quality = 30, качество совсем не имеет значение?
Качество да не имело значение, при таком параметре было вполне различимы детали разгрузки и содержимое европаллет, а так же в некоторых случаях допустим (брак, бой коробок и недовложения) изображение было приемлемым и вопросов не вызывало.  А когда делали в ручную с помощью picture manager сжатие ставили до 70%, а то и до 80%, тогда периодически высылали исходники по просьбе поставщика.
Но спасибо за наводку, гляну в сторону jpegtran
« Последнее редактирование: Сентябрь 23, 2015, 13:53:16 от ulan44 »

Русское сообщество AutoIt

Re: [Автоматизация] Сжатие множества jpg файлов в три клика
« Ответ #3 Отправлен: Сентябрь 23, 2015, 13:44:38 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
29 Ответов
13942 Просмотров
Последний ответ Декабрь 21, 2011, 16:12:49
от Isn
4 Ответов
3208 Просмотров
Последний ответ Ноябрь 30, 2010, 00:10:15
от HelpMe
38 Ответов
12453 Просмотров
Последний ответ Март 28, 2012, 18:50:58
от Timerlan
5 Ответов
4007 Просмотров
Последний ответ Ноябрь 21, 2012, 12:23:39
от vaf
0 Ответов
1430 Просмотров
Последний ответ Ноябрь 20, 2012, 10:23:03
от madmasles
3 Ответов
3959 Просмотров
Последний ответ Июль 17, 2013, 23:57:01
от AZJIO
0 Ответов
1656 Просмотров
Последний ответ Июнь 18, 2014, 12:12:59
от 2012_diko
1 Ответов
922 Просмотров
Последний ответ Январь 16, 2015, 00:16:11
от madmasles
3 Ответов
650 Просмотров
Последний ответ Июль 21, 2017, 17:42:35
от cnm
6 Ответов
472 Просмотров
Последний ответ Январь 25, 2018, 18:46:59
от lixar21