Что нового

работа с метадатой

Автор
S

saraconor

Новичок
Сообщения
420
Репутация
3
Код:
#include <GDIP.au3>
#include <Array.au3>

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

_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($sFileJPG)
$aAll = _GDIPlus_ImageGetAllPropertyItems($hImage)

$tPropertyData = DllStructCreate('char[' & $aAll[6][1] & ']', $aAll[6][3])
ConsoleWrite(DllStructGetData($tPropertyData, 1) & @LF)


_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

_GDIPlus_ImageRemovePropertyItem($hImage,$aAll[6][0])

Вроде бы должно удалить EXIF информацию "Название", но не удаляет.

И непонятно что делать с
Код:
_GDIPlus_ImageSetPropertyItem($hImage, $pPropertyItem)

Если с первым параметром ясно - тут объект изображения из файла, то со вторым как быть не понятно "$pPropertyItem - Pointer to a $tagGDIPPROPERTYITEM structure that specifies the property item to be set" Непонятно как работать с $tagGDIPPROPERTYITEM. Помогите пожалуйста.
 

Yashied

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

saraconor

Новичок
Сообщения
420
Репутация
3
Так тоже не работает:
Код:
#include <GDIP.au3>
#include <Array.au3>

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

_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile($sFileJPG)
$aAll = _GDIPlus_ImageGetAllPropertyItems($hImage)

$tPropertyData = DllStructCreate('char[' & $aAll[6][1] & ']', $aAll[6][3])
ConsoleWrite(DllStructGetData($tPropertyData, 1) & @LF)

_GDIPlus_ImageRemovePropertyItem($hImage,$aAll[6][0])

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
 
Автор
S

saraconor

Новичок
Сообщения
420
Репутация
3
В смысле как сохранить? Скрипт просто не удаляет данные из нужной строки. Еслиб удалял, после второго запуска в консоле было бы пусто. Изображение при этом не меняется.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Функция _GDIPlus_ImageLoadFromFile() загружает изображение в память. Все остальные действия производятся исключительно в памяти и никак не затрагивают сам файл.

Код:
_GDIPlus_ImageRemovePropertyItem($hImage, $aAll[6][0])
_GDIPlus_ImageSaveToFile($hImage, 'Test.jpg')

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
 
Автор
S

saraconor

Новичок
Сообщения
420
Репутация
3
Решение найдено.
Код:
;#include <GDIPlus.au3>

$SR = '77777777777' ;строка для подмены.
$FN = 'test'		;имя файла

_GDIPlus_Startup ()
$hFile = _GDIPlus_ImageLoadFromFile(@ScriptDir&'\'&$FN&'.jpg')
_GDIPlus_SetMetaData($hFile,'ImageDescription', "7777777777777")
_GDIPlus_ImageSaveToFile($hFile,@ScriptDir&'\'&$FN&' 2'&'.jpg')
_GDIPlus_Shutdown()

Func _GDIPlus_SetMetaData($hHandle,$sTagName, $vStr)
	Local $tagPropertyItem = "ulong id; ulong length; ushort Type; ptr value"
	Local $Struct_String, $Struct_Meta, $aResult, $PropertyTagType
    $Struct_String=DllStructCreate("char[" & StringLen($vStr) +1 & "];")
    DllStructSetData($Struct_String,1,$vStr)
    $Struct_Meta = DllstructCreate($tagPropertyItem)
    DllStructSetData($Struct_Meta,"ID",0x10E)
	DllStructSetData($Struct_Meta,"Length",StringLen($vStr) +1)
	DllStructSetData($Struct_Meta,"Type",2)
	DllStructSetData($Struct_Meta,"Value",DllStructGetPtr($Struct_String))
	$aResult = DllCall($ghGDIPDll, "int", "GdipSetPropertyItem", "hwnd", $hHandle, "ptr", DllStructGetPtr($Struct_Meta))
EndFunc
Кстати интересно, почему если сохранять копию файла то метадата меняется, а если сохранять в тот-же файл - ничего не изменится. Неужели прийдется создавать копию, потом удалять исходник и переименовывать копию на исходный файл, другого пути нет?
 
Верх