Что нового

[Автоматизация] ConvertIt - быстрое конвертирование изображений

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
AutoIt: 3.3.0.0
Версия: 1.0.0.3

Категория: Автоматизация, Файловая система

Описание: Программа для быстрого конвертирования большого количества изображений в другой формат с минимальной потерей качества. Обычно это могут делать "просмотровщики" типа ACDSee, PhotoScape и др., но они слишком громоздкие.

Код/Пример:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Icon_239.ico
#AutoIt3Wrapper_outfile=ConvertIt.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Comment=Программа для быстрого конвертирования изображений
#AutoIt3Wrapper_Res_Description=Программа для быстрого конвертирования изображений
#AutoIt3Wrapper_Res_Fileversion=1.0.0.3
#AutoIt3Wrapper_Res_LegalCopyright=Copyright © 2009 Medic84
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#AutoIt3Wrapper_Res_Field=Разработчик|Medic84 & CreatoR
#AutoIt3Wrapper_Res_Field=E-mail|[email protected]
#AutoIt3Wrapper_Res_Field=Версия AutoIt|%AutoItVer%
#AutoIt3Wrapper_Res_Field=Дата компиляции|%date% %time%
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <File.au3>

Global $sPath_Read, $sIn, $sOut
Global $iAbort = 0
$Font = "Comic Sans MS"
Global $sCopyright_URL = "http://autoit-script.ru"
$Form1_1 = GUICreate("ConvertIT", 250, 280)
GUICtrlCreateTab(5, 5, 240, 270)
GUICtrlCreateTabItem("Главная")
GUISetIcon(@ScriptDir & "\Icon.ico")
GUICtrlCreateLabel("Выберите папку:", 15, 30, -1, 13)
$Input1 = GUICtrlCreateInput(@MyDocumentsDir & "\Мои рисунки", 15, 50, 180, 20)
$Path_Butn = GUICtrlCreateButton("...", 200, 50, 30, 20)
GUICtrlCreateLabel("Конвертировать...", 15, 75, -1, 13)
GUICtrlCreateLabel("Из:", 15, 100, -1, 13)
$Combo1_Out = GUICtrlCreateCombo("", 150, 100, 75, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "BMP|JPG|JPEG|GIF|PNG|TIF|TIFF")
GUICtrlCreateLabel("В:", 125, 100, -1, 13)
$Combo2_In = GUICtrlCreateCombo("", 40, 100, 75, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "BMP|JPG|JPEG|GIF|PNG|TIF|TIFF")
$Delete_Img = GUICtrlCreateCheckbox("Удалять исходники", 15, 140)
$Label_Scet = GUICtrlCreateLabel("", 15, 180, 220, 13, $SS_CENTER)
GUICtrlSetFont(-1, 9, 600, 4, $Font)
GUICtrlSetColor(-1, 16711680)
$Start = GUICtrlCreateButton("Начать", 45, 235, 160, 30)
$Progress = GUICtrlCreateProgress(15, 200, 220, 30)
GUICtrlCreateTabItem("О программе")
;GUICtrlCreatePic("au3.jpg", 90, 40, 70, 84)
GUICtrlCreateLabel("Программа предназначена для быстрой конвертации большого количества изображений без потери качества", 15, 140, 220, 100, $SS_CENTER)
GUICtrlCreateLabel("Copyright © 2010 Medic84", 60, 250, 210, 20)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Path_Butn
			$sInitDir = GUICtrlRead($Input1)
			While 1
				$Folder1 = FileSelectFolder("Выберите папку:", "", 1, $sInitDir, $Form1_1)
				If @error Then ContinueLoop 2
				If FileExists($Folder1) Then ExitLoop
				$sInitDir = $Folder1
				MsgBox(48, "Внимание", "Выбранный вами каталог не существует.", 0, $Form1_1)
			WEnd
			GUICtrlSetData($Input1, $Folder1)
		Case $Start
			_Convert_Proc()
	EndSwitch
WEnd

Func _Convert_Proc()
	$sPath_Read = GUICtrlRead($Input1)
	$sIn = GUICtrlRead($Combo2_In)
	$sOut = GUICtrlRead($Combo1_Out)
	$iDeleteImgs = (GUICtrlRead($Delete_Img) = $GUI_CHECKED)
	If StringStripWS($sPath_Read, 8) = "" or StringStripWS($sIn, 8) = "" or StringStripWS($sOut, 8) = "" Then Return MsgBox(16, "Ошибка", "Задано пустое поле!", 0, $Form1_1)
	If $sIn = $sOut Or (StringRegExp($sIn, "(?i)JPE?G") And StringRegExp($sOut, "(?i)JPE?G")) Or (StringRegExp($sIn, "(?i)TIFF?") And StringRegExp($sOut, "(?i)TIFF?")) Then Return MsgBox(16, "Ошибка", "Выбраны одинаковые форматы", 0, $Form1_1)
	$aFileList = _FileListToArray($sPath_Read, "*." & $sIn)
	Switch @error
		Case 1
			Return MsgBox(16, "Ошибка", "Папка не найдена. Либо доступ к папке закрыт", 0, $Form1_1)
		Case 2
			Return MsgBox(16, "Ошибка", "Неверный фильтр", 0, $Form1_1)
		Case 3
			Return MsgBox(16, "Ошибка", "Неверный флаг", 0, $Form1_1)
		Case 4
			Return MsgBox(16, "Ошибка", "Файлы не найдены", 0, $Form1_1)
	EndSwitch
	Opt("GUIOnEventMode", 1)
	GUICtrlSetState($Path_Butn, $GUI_DISABLE)
	GUICtrlSetData($Start, "Прервать")
	GUICtrlSetOnEvent($Start, "_Abort_Convert_Proc")
	_GDIPlus_Startup()
	$i1_Percent = Round(100 / $aFileList[0], 9)
	$iPercents = 0
	For $i = 1 To $aFileList[0]
		$iPercents += $i1_Percent
		If $iAbort Then ExitLoop
		$sOldI = $sPath_Read & "\" & $aFileList[$i]
		$sNewI = StringRegExpReplace($sOldI, "\.[^\.]*$", ".") & $sOut
		$hImage = _GDIPlus_ImageLoadFromFile($sOldI)
		$CLSID = _GDIPlus_EncodersGetCLSID($sOut)
		If $iAbort Then ExitLoop
		_GDIPlus_ImageSaveToFileEx($hImage, $sNewI, $CLSID)
		Sleep(50)
		If $iAbort Then ExitLoop
		_GDIPlus_ImageDispose($hImage)
		If $iAbort Then ExitLoop
		GUICtrlSetData($Label_Scet, StringFormat("Обработан Файл [%i] из [%i]", $i, $aFileList[0]))
		GUICtrlSetData($Progress, $iPercents)
		If $iDeleteImgs Then FileDelete($sOldI)
	Next
	_GDIPlus_Shutdown()
	$iAbort = 0
	GUICtrlSetData($Progress, 0)
	Opt("GUIOnEventMode", 0)
	GUICtrlSetState($Path_Butn, $GUI_ENABLE)
	GUICtrlSetData($Start, "Начать")
	GUICtrlSetData($Label_Scet, "")
EndFunc

Func _Abort_Convert_Proc()
	If MsgBox(52, "Внимание!", "Отменить конвертирование?", 0, $Form1_1) = 6 Then $iAbort = 1
EndFunc
Файл: EXE + AU3

Снимок:
1.0.0.2
1.0.0.3

Источник: autoit-script.ru
Автор(ы): Medic84 , CreatoR
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
У меня какая-то ошибка вылетела. Пока не разбирался.
http://yfrog.com/7c46532625p


p.s. А сложно сделать программу, чтобы она конвертировала мультистраничные tif в png или gif (по странице на файл)?


Добавлено:
Сообщение автоматически объединено:

*Этот Tif не был мультистраничным. Обычный tif*
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
TIFF и TIF - разные форматы немого. Ошибка возникает из-за того что он не находит файлы TIFF


Добавлено:
Сообщение автоматически объединено:

Ой, да я вру :laugh:
Они одинаковые. Но поддержка все равно будет TIFF :blum: потом добавлю
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Medic84 [?]
Ошибка возникает из-за того что он не находит файлы TIFF

Ихмо, тогда стоит прописать сообщение "Таких файлов в директории не найдено" или вроде того :smile:
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Да. Я хотел добавить, а из головы вылетело.
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Еще пожелание. Я сконвертировал 8-битный png в tiff. Причем tiff оказался 32-х битным. Имхо, было бы здорово, если бы битность "до" и "после" совпадала. Или в программе была бы возможность выбора - ну это было бы уже совсем здорово :smile:


Добавлено:
Сообщение автоматически объединено:

В принципе, программу можно совершенствовать до бесконечности - это вопрос желания создателя!
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Suppir [?]
совершенствовать до бесконечности
Таким образом она превратится в комбайн типа ACDSee


если бы битность "до" и "после" совпадала
Я без понятия где в GDI+ изменение битности изображения))) Я конечно посмотрю, но не уверен что это будет реализовано.


Добавлено:
Сообщение автоматически объединено:

Исправил некоторые ошибки. Пишите еще! 8) :whistle:
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Сделать выбор папки вывода изображений
Открывать её после конвертирования.
Если в выбраной папке не будет файлов, форматы которых отсутствуют в выпадающем списке, то может их вообще убрать из списка ?
И если не выбран путь - блокировать кнопку ?

:whistle:
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Спасибо, будем работать :beer:
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Обновил программу. Изменил внешний вид, и добавил прогресс бар :smile:
Изменения вносить не стал, ибо не критично :smile:
Шапку поправил.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
$aFileList = _FileListToArray($sPath_Read, "*." & $sIn)
Switch @error
	Case 1
		Return MsgBox(16, "Ошибка", "Папка не найдена. Либо доступ к папке закрыт", 0, $Form1_1)
	Case 2
		Return MsgBox(16, "Ошибка", "Неверный фильтр", 0, $Form1_1)
	Case 3
		Return MsgBox(16, "Ошибка", "Неверный флаг", 0, $Form1_1)
	Case 4
		Return MsgBox(16, "Ошибка", "Файлы не найдены", 0, $Form1_1)
EndSwitch


Ошибка 3 никогда не будет задействована. Зачем тогда нужно это учитывать?
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
На всякий :smile:
От пары лишних сточек кода в маленькой программке ничего не будет :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А еще меня смутила вот эта фраза:

Программа предназначена для быстрой конвертации большого количества изображений без потери качества.

Конвертирование в JPEG уже подразумевает потерю качества.

:smile:
 
Автор
Medic84

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Yashied [?]
Конвертирование в JPEG уже подразумевает потерю качества.
Ну я имел ввиду не заметную для глаза :whistle: :-[
 
Верх