Что нового

[Элементы GUI] Наложение водяного знака на изображение

centaur

Новичок
Сообщения
12
Репутация
0
Есть пачка изображений в формате *.jpg.
Задача состоит в том, чтобы наложить на каждое изображение дату его создания (т.е. текст, не картинку).
Как можно это реализовать средствами Autoit без использования сторонних программ, может кто делал такое?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Дело это нехитрое, только вот JPEG такая штука, что чем больше его изменяешь, тем хуже становиться качество изображения.
 
Автор
centaur

centaur

Новичок
Сообщения
12
Репутация
0
Так а все-таки, не обращая внимания на качество изображения и тп. Как решается такая задача?
Если с jpg проблема, пусть это будут другие форматы... png, bmp и тп
 
Автор
centaur

centaur

Новичок
Сообщения
12
Репутация
0
Yashied сказал(а):
Дело это нехитрое...

На том и порешили, что дело настолько простое, что и заниматься им не стоит... а жаль :(

Тема не раскрыта, а тем более уж не закрыта...
 

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Я бы тоже хотел узнать как это зделать...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,485
Код:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

;~ $sImage_Path = @SystemDir & "\oobe\images\wpaback.jpg" ;FileOpenDialog("Open image...", "", "All Images (*.png;*.bmp;*.gif;*.jpeg)")
;~ If @error Then Exit

$sImage_Path = @ScriptDir & '\AutoItImage.jpg'
$sDestFile = StringRegExpReplace($sImage_Path, "(.*)(\.[^\.]*$)", "\1_With_Watermark\2")

_ScreenCapture_Capture($sImage_Path, 0, 0, 600, 400, 0)
_ImageSetWaterMark($sImage_Path, $sDestFile, 'Watermark with AutoIt', 0xFF0000, 16, -1, -1, 4)

; Show image
ShellExecute($sDestFile)
;~ Run('MSPaint.exe "' & $sDestFile & '"')

Func _ImageSetWaterMark($sSrcImage, $sDstImage, $sWaterMark, $iColor=0xFF0000, $iFontSize=16, $iLeft=0, $iTop=0, $iFormat=4)
	; Initialize GDI+ library
	_GDIPlus_StartUp()
	
	Local $hImage 	= _GDIPlus_ImageLoadFromFile($sSrcImage)
	
	Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	Local $hFamily 	= _GDIPlus_FontFamilyCreate("Arial")
	Local $hFont    = _GDIPlus_FontCreate($hFamily, $iFontSize, 1)
	Local $tLayout  = _GDIPlus_RectFCreate(0, 0)
	Local $hFormat  = _GDIPlus_StringFormatCreate($iFormat)
	Local $hBrush1  = _GDIPlus_BrushCreateSolid(0xA2FFFFFF)
	Local $hBrush2  = _GDIPlus_BrushCreateSolid("0xC4" & Hex(Number($iColor), 6))
	Local $hPen     = _GDIPlus_PenCreate(0xC4000000, 2)
	Local $aInfo    = _GDIPlus_GraphicsMeasureString($hGraphic, $sWaterMark, $hFont, $tLayout, $hFormat)
	
	Local $iWidth   = DllStructGetData($aInfo[0], "Width")
	Local $iHeight  = DllStructGetData($aInfo[0], "Height")
	
	If $iLeft = -1 Then $iLeft = _GDIPlus_ImageGetWidth($hImage) - $iWidth
	If $iTop = -1 Then $iTop = _GDIPlus_ImageGetHeight($hImage) - $iHeight
	
	If $iLeft = 0 Then $iLeft = 1
	If $iTop = 0 Then $iTop = 1
	
	DllStructSetData($aInfo[0], "X", $iLeft)
	DllStructSetData($aInfo[0], "Y", $iTop)
	
	_GDIPlus_GraphicsFillRect($hGraphic, $iLeft, $iTop, $iWidth, $iHeight, $hBrush1)
	_GDIPlus_GraphicsDrawRect($hGraphic, $iLeft, $iTop, $iWidth, $iHeight, $hPen)
	_GDIPlus_GraphicsDrawStringEx($hGraphic, $sWaterMark, $hFont, $aInfo[0], $hFormat, $hBrush2)
	
	; Save image
	Local $sTmp_ImageFile = StringRegExpReplace($sSrcImage, "(.*)(\.[^\.]*$)", "\1_tmp\2")
	_GDIPlus_ImageSaveToFile($hImage, $sTmp_ImageFile)
	
	; Free resources
	_GDIPlus_PenDispose         ($hPen    )
	_GDIPlus_BrushDispose       ($hBrush1 )
	_GDIPlus_BrushDispose       ($hBrush2 )
	_GDIPlus_StringFormatDispose($hFormat )
	_GDIPlus_FontDispose        ($hFont   )
	_GDIPlus_FontFamilyDispose  ($hFamily )
	_GDIPlus_GraphicsDispose    ($hGraphic)
	_GDIPlus_ImageDispose       ($hImage  )
	
	_GDIPlus_ShutDown()
	
	If $sDstImage <> $sSrcImage And FileExists($sDstImage) Then
		FileMove($sTmp_ImageFile, $sDstImage, 1)
	ElseIf $sDstImage = -1 Or $sDstImage = $sSrcImage Or Not FileExists($sDstImage) Then
		FileMove($sTmp_ImageFile, $sSrcImage, 1)
	EndIf
	
	FileDelete($sTmp_ImageFile)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,485
Или конкретно для поставленной задачи:

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

$iMake_Backup = 0
$sImages_Path = @ScriptDir & "\Images"

$aFiles = _FileListToArray($sImages_Path, "*.jpg", 1)

For $i = 1 To UBound($aFiles)-1
	$sImage = $sImages_Path & "\" & $aFiles[$i]
	$sFileTime = StringRegExpReplace(FileGetTime($sImage, 1, 1), "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "$3/$2/$1, $4:$5:$6")
	
	If $iMake_Backup Then
		FileCopy($sImage, $sImage & ".bak", 1)
	EndIf
	
	_ImageSetWaterMark($sImage, -1, $sFileTime, 0xFF0000, 16, -1, -1, 4)
Next

Func _ImageSetWaterMark($sSrcImage, $sDstImage, $sWaterMark, $iColor=0xFF0000, $iFontSize=16, $iLeft=0, $iTop=0, $iFormat=4)
	; Initialize GDI+ library
	_GDIPlus_StartUp()
	
	Local $hImage 	= _GDIPlus_ImageLoadFromFile($sSrcImage)
	
	Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	Local $hFamily 	= _GDIPlus_FontFamilyCreate("Arial")
	Local $hFont    = _GDIPlus_FontCreate($hFamily, $iFontSize, 1)
	Local $tLayout  = _GDIPlus_RectFCreate(0, 0)
	Local $hFormat  = _GDIPlus_StringFormatCreate($iFormat)
	Local $hBrush1  = _GDIPlus_BrushCreateSolid(0xA2FFFFFF)
	Local $hBrush2  = _GDIPlus_BrushCreateSolid("0xC4" & Hex(Number($iColor), 6))
	Local $hPen     = _GDIPlus_PenCreate(0xC4000000, 2)
	Local $aInfo    = _GDIPlus_GraphicsMeasureString($hGraphic, $sWaterMark, $hFont, $tLayout, $hFormat)
	
	Local $iWidth   = DllStructGetData($aInfo[0], "Width")
	Local $iHeight  = DllStructGetData($aInfo[0], "Height")
	
	If $iLeft = -1 Then $iLeft = _GDIPlus_ImageGetWidth($hImage) - $iWidth
	If $iTop = -1 Then $iTop = _GDIPlus_ImageGetHeight($hImage) - $iHeight
	
	If $iLeft = 0 Then $iLeft = 1
	If $iTop = 0 Then $iTop = 1
	
	DllStructSetData($aInfo[0], "X", $iLeft)
	DllStructSetData($aInfo[0], "Y", $iTop)
	
	_GDIPlus_GraphicsFillRect($hGraphic, $iLeft, $iTop, $iWidth, $iHeight, $hBrush1)
	_GDIPlus_GraphicsDrawRect($hGraphic, $iLeft, $iTop, $iWidth, $iHeight, $hPen)
	_GDIPlus_GraphicsDrawStringEx($hGraphic, $sWaterMark, $hFont, $aInfo[0], $hFormat, $hBrush2)
	
	; Save image
	Local $sTmp_ImageFile = StringRegExpReplace($sSrcImage, "(.*)(\.[^\.]*$)", "\1_tmp\2")
	_GDIPlus_ImageSaveToFile($hImage, $sTmp_ImageFile)
	
	; Free resources
	_GDIPlus_PenDispose         ($hPen    )
	_GDIPlus_BrushDispose       ($hBrush1 )
	_GDIPlus_BrushDispose       ($hBrush2 )
	_GDIPlus_StringFormatDispose($hFormat )
	_GDIPlus_FontDispose        ($hFont   )
	_GDIPlus_FontFamilyDispose  ($hFamily )
	_GDIPlus_GraphicsDispose    ($hGraphic)
	_GDIPlus_ImageDispose       ($hImage  )
	
	_GDIPlus_ShutDown()
	
	If $sDstImage <> $sSrcImage And FileExists($sDstImage) Then
		FileMove($sTmp_ImageFile, $sDstImage, 1)
	ElseIf $sDstImage = -1 Or $sDstImage = $sSrcImage Or Not FileExists($sDstImage) Then
		FileMove($sTmp_ImageFile, $sSrcImage, 1)
	EndIf
	
	FileDelete($sTmp_ImageFile)
EndFunc
 

tech-gs

Знающий
Сообщения
54
Репутация
5
Не знаю, можно ли писать в закрытые темы. Все же попробую.

Решение отличное, но есть одно НО. Скрипт не работает с изображениями в индексированных цветах, например, gif.
Понимаю, что такой задачи не ставилось, и все же, можно ли доработать скрипт в плане универсальности? Чтобы была возможность работать с изображениями в индексированных цветах.
Вопрос, видимо, к тебе, Creator :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
tech-gs [?]
Не знаю, можно ли писать в закрытые темы.
В закрытые темы вы писать не сможете, а вот писать в темы которым уже пять с лишним лет это моветон.
Создайте свою тему, опишите свой вопрос и сошлитесь на данную тему.
 
Верх