Что нового

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

saraconor

Новичок
Сообщения
404
Репутация
3
как прочесть \ записывать \ стирать метадату в файле?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Так а что "метадату в файле"? Что есть такой стандарт "файл метадаты"?
Пока ты не приведёшь пример своего файла, что можно сказать?
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
любой файл, к примеру твоя аватарка.
 

Yashied

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

saraconor

Новичок
Сообщения
404
Репутация
3
WSWR сказал(а):
Наверное нет. Вот откопался скриптик читающий то что я понимаю под метадатой файла скрипта:
Код:
#include <Array.au3>

$prop = _GetExtProperty(@ScriptFullPath,-1)
_ArrayDisplay($prop,"Property Array")

Func _GetExtProperty($sPath, $iProp)
    Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty
    $iExist = FileExists($sPath)
    If $iExist = 0 Then
        SetError(1)
        Return 0
    Else
        $sFile = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1))
        $sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, "\", 0, -1)))
        $oShellApp = ObjCreate("shell.application")
        $oDir = $oShellApp.NameSpace ($sDir)
        $oFile = $oDir.Parsename ($sFile)
        If $iProp = -1 Then
            Local $aProperty[21]
            For $i = 0 To 20
                $aProperty[$i] = $oDir.GetDetailsOf ($oFile, $i)
            Next
            Return $aProperty
        Else
            $sProperty = $oDir.GetDetailsOf ($oFile, $iProp)
            If $sProperty = "" Then
                Return 0
            Else
                Return $sProperty
            EndIf
        EndIf
    EndIf
EndFunc   ;==>_GetExtProperty

Там куча строк на самом деле, тут просто на 20 настроено. Так вот, как можно удалять и менять запись в конкретной строке?
 

Yashied

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

Какие конкретно поля вас интересуют?
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Любое поле, желательно такое в котором можно записывать \ менять \ удалять записи, и чтобы эти записи не менялись после изменения и сохранения файла в программе. к примеру возьмем файл jpg - записываем некие данные в такое поле, после чего меняем файл в фотошопе, сохраняем, а запись наша остается как была и мы можем ее потом поменять нашим скриптом.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вы не совсем понимаете, что просите. Для того же .jpg файла в проводнике будет указано разрешение и размеры изображения. Эту информацию Windows Explorer берет непосредственно из файла. Если в Photoshop'е поменять разрешение или размеры изображения, то и данные в проводнике изменятся. Это не метаданные, это свойства изображения. Возьмите для примера размер файла. Вы не сможете что-либо добавить или удалить из этого файла так, чтобы размер остался неизменным.

Вообще, все зависит от самого файла. Если взять .mp3, то можно изменить теги (вот это и есть метаданные). Есть типы файлов, которые поддерживают метаданные, но не факт, что их поддерживает проводник.

P.S

Кстати, формат .jpg предусматривает метаданные, но на практике это мало используется. А вот .bmp или .ico не может содержать никаких посторонних данных.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Хорошо, давайте остановимся на .jpg просто как на примере. В 35 строке указано в какой программе сделан файл, эту строку записывает редактор при сохранении, это не свойство файла, а значит возможно есть и другие строки которые можно использовать на свой лад. Мы можем в какую-нибудь неиспользуемую графическим редактором строку что-нибудь записать а потом стереть? Цель - добиться того чтобы записанная информация уцелела после редактирования и перезаписи файла в редакторе.
 

Yashied

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

Если же вы настаиваете на .jpg, то в сети полно документации на этот формат, после ознакомления которой, вы сможете использовать .jpg по полной.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Хотелось бы получить возможность записывать, считывать, стирать информацию которая не сотрется сама после редактирования и пересохранения файла в редакторе. Интересует именно .jpg
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Yashied сказал(а):
Далеко не все редакторы заполняют теги при сохранении .jpg файла. Я думаю, что вам лучше более конкретно описать то, что вы хотите в результате получить, т.к. вряд ли целью является только .jpg файлы. Универсальных тегов для любых типов файлов попросту нет. Возможно, решением будет создание альтернативных потоков (свойство NTFS), см. пример к функции _WinAPI_EnumFileStreams().

Если же вы настаиваете на .jpg, то в сети полно документации на этот формат, после ознакомления которой, вы сможете использовать .jpg по полной.
Ну на то и раздел для новичков. Даже если я найду эту информацию, врятли я ей найду применение в autoit.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
saraconor сказал(а):
Ну на то и раздел для новичков. Даже если я найду эту информацию, врятли я ей найду применение в autoit.
Ну тогда поднимайте тему раз в 24 часа, кто-нибудь да поможет с кодом. У меня, к сожалению, нет времени, да и сама тема не цепляет как-то.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
кто-нибудь пожалуйста помогите с решением.
Где-то внутри файла jpg есть строки: марка фотоаппарата, фокусное расстояние съемки, выдержка, диафрагма, комментарий пользователя
Уважаемые форумчане, помогите пожалуйста найти способ считатывать и изменять данные из строки с этим комментарием.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Может быть ЭТО поможет?
Насколько я понял маркер комментария FF FE, дальше два байта длины этого комментария (включая эти два байта).
То есть вытащить можно без проблем. Но вот можно ли сделать так, чтобы изменёный комментарий был длинее того, что был, это надо эксперементировать.

Да, сейчас попробовал. Можно добавлять комментарии даже к тому файлу, у которого их не было. Открыл файл в бинарном виде. Вставил маркер FF FE, зарезервировал два байта под указание длинны. Написал комментарий. Подсчитал длину. Вставил два байта указывающие размер. Сохранил файл. Проверил в программе XnView, всё корректно отображает.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saraconor,
Только для версий 3.3.6.1 и 3.3.8.1 с использованием GDIP UDF - мощное дополнение к GDIPlus.au3.
Код:
#include <GDIP.au3>

Local $hImage, $aAllProperty, $tData
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\test.jpg')
$aAllProperty = _GDIPlus_ImageGetAllPropertyItems($hImage)

For $i = 1 To $aAllProperty[0][0]
	If $aAllProperty[$i][2] <> 2 Then ContinueLoop
	$tData = DllStructCreate('char[' & $aAllProperty[$i][1] + 1 & ']', $aAllProperty[$i][3])
;~ 	$GDIP_PROPERTYTAG* constants and value
	ConsoleWrite('0x' & Hex($aAllProperty[$i][0], 4) & @TAB & DllStructGetData($tData, 1) & @LF)
Next

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()



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

Подробнее про $GDIP_PROPERTYTAG* константы можно прочитать здесь: Property Item Descriptions.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Спасибо madmasles,
Вот примерно то что нужно:
Код:
#include <GDIP.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()

На выходе получаем "Название" из свойств файла. Как можно изменить эту строку через autoit ?
 
Верх