Что нового

Прорисовка даты на фотографиях

NONer

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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#Include <GDIPlus.au3>

$iLeft = 5
$iTop = 5

$xColor = 0xFFFFD823
$iFontSize = 24
$iFontStyle = 0
$fgt = FileGetTime(@ScriptDir & '\shot_018.jpg', 1)

$sText = $fgt[0] & '.' & $fgt[1] & '.' & $fgt[2] & '.' & $fgt[3] & ':' & $fgt[4] & ':' & $fgt[5]
_GDIPlus_Startup()
$hFamily = _GDIPlus_FontFamilyCreate('Arial')
$hFont   = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontStyle)
$hFormat = _GDIPlus_StringFormatCreate()


$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\shot_018.jpg')
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
$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)
_GDIPlus_ImageSaveToFileEx($hImage, @ScriptDir & '\shot_018(1).jpg', _GDIPlus_EncodersGetCLSID ('JPG'))
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage  )

_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_Shutdown()
Исходный пример ТУТ
 
A

Alofa

Гость
joiner
Как не парадоксально это звучит но, по-видимому нужно так:
Код:
$fgt = FileGetTime(@ScriptDir & '\shot_018.jpg')
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
A

Alofa

Гость
OffTopic:
joiner, я поэтому и написал:
Alofa сказал(а):
Как не парадоксально это звучит...




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

А вообще, что касается той части кода, которая определяет дату создания картинки, то я бы сделал так:
Код:
#include <GDIPlus.au3>
Global $sFileJPG, $hImage, $aAll, $sDate, $GDIP_STATUS = 0
Global Const $GDIP_PROPERTYTAGDATETIME = 0x0132 ; Дата и время создания изображения

$sFileJPG = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Изображения (*)', 1)
If @error Or Not $sFileJPG Then Exit -1

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sFileJPG)
$aAll = _GDIPlus_ImageGetAllPropertyItems($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
If Not IsArray($aAll) Then Exit -2

; Узнаем дату создания из EXIF-метаданных. Если таковых нет, то FileGetTime()
For $i = 1 To $aAll[0][0]
	If $aAll[$i][0] = $GDIP_PROPERTYTAGDATETIME Then
		$sDate = DllStructGetData(DllStructCreate('char[' & $aAll[$i][1] & ']', $aAll[$i][3]), 1)
		ExitLoop
	EndIf
	If $i = $aAll[0][0] Then
		$aFTime = FileGetTime($sFileJPG)
		$sDate = $aFTime[0] & ':' & $aFTime[1] & ':' & $aFTime[2] & ' ' & $aFTime[3] & ':' & $aFTime[4] & ':' & $aFTime[5]
	EndIf
Next
ConsoleWrite($sDate & @LF)

#cs ====================================================================================================================
	Две функции ниже из библиотеки "GDIP.au3" от Yashied (http://autoit-script.ru/index.php/topic,1384.0.html)
	адаптированы под Autoit v3.3.12.0
#ce ====================================================================================================================
Func _GDIPlus_ImageGetAllPropertyItems($hImage)
	Local $iI, $iCount, $tBuffer, $pBuffer, $iBuffer, $tPropertyItem, $aSize, $aPropertyItems[1][1], $aResult
	Local $tagGDIPPROPERTYITEM = 'uint id;uint length;ushort type;ptr value'

	$aSize = _GDIPlus_ImageGetPropertySize($hImage)
	If @error Then Return SetError(@error, @extended, -1)

	If $GDIP_STATUS Then
		$GDIP_ERROR = 1
		Return -1
	ElseIf $aSize[1] = 0 Then
		$GDIP_ERROR = 2
		Return -1
	EndIf

	$iBuffer = $aSize[0]
	$tBuffer = DllStructCreate("byte[" & $iBuffer & "]")
	$pBuffer = DllStructGetPtr($tBuffer)
	$iCount = $aSize[1]

	$aResult = DllCall($__g_hGDIPDll, "uint", "GdipGetAllPropertyItems", "hwnd", $hImage, "uint", $iBuffer, "uint", $iCount, "ptr", $pBuffer)
	If @error Then Return SetError(@error, @extended, -1)

	$GDIP_STATUS = $aResult[0]
	If $GDIP_STATUS Then
		$GDIP_ERROR = 3
		Return -1
	EndIf

	ReDim $aPropertyItems[$iCount + 1][4]
	$aPropertyItems[0][0] = $iCount

	For $iI = 1 To $iCount
		$tPropertyItem = DllStructCreate($tagGDIPPROPERTYITEM, $pBuffer)
		$aPropertyItems[$iI][0] = DllStructGetData($tPropertyItem, "id")
		$aPropertyItems[$iI][1] = DllStructGetData($tPropertyItem, "length")
		$aPropertyItems[$iI][2] = DllStructGetData($tPropertyItem, "type")
		$aPropertyItems[$iI][3] = DllStructGetData($tPropertyItem, "value")
		$pBuffer += DllStructGetSize($tPropertyItem)
	Next

	Return $aPropertyItems
EndFunc   ;==>_GDIPlus_ImageGetAllPropertyItems

Func _GDIPlus_ImageGetPropertySize($hImage)
	Local $aSize[2], $aResult

	$aResult = DllCall($__g_hGDIPDll, "uint", "GdipGetPropertySize", "hwnd", $hImage, "uint*", 0, "uint*", 0)
	If @error Then Return SetError(@error, @extended, -1)

	$GDIP_STATUS = $aResult[0]
	If $GDIP_STATUS Then Return -1

	$aSize[0] = $aResult[2]
	$aSize[1] = $aResult[3]
	Return $aSize
EndFunc   ;==>_GDIPlus_ImageGetPropertySize
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
Большое спасибо за помощь.
 
A

Alofa

Гость
NONer откройте какое-нибудь фото в Photoshop-е, отредактируйте, сохраните изменения и посмотрите как изменятся даты.
 

axsmak

Знающий
Сообщения
32
Репутация
7
Alofa сказал(а):
А вообще, что касается той части кода, которая определяет дату создания картинки, то я бы сделал так
Единственный верный ответ, если речь идёт именно о фотографиях и дате съёмки. Дата съёмки только в EXIF будет корректна всегда.
 
Верх