Что нового

[Данные, строки] Как прочитать EXIF-информацию из JPEG файла

Юрчище

Новичок
Сообщения
16
Репутация
0
Подскажите как прочитать EXIF-информацию из JPEG файла CANON!
Особенно интересует 1.Модель камеры, 2.Дата съемки, 3.Поворот картинки, 4.Номер файла

1. Удалось найти UDF: ImageGetInfo от Автора Lazycat:
http://www.autoitscript.com/forum/topic/13096-udf-imagegetinfo/page__hl__exif
но это не работает - выдает только размеры изображения
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Спасибо за подсказку, madmasles ! :smile:
Осталось два вопроса:
1. Как я понял _GDIPlus_ImageLoadFromFile загружает файл в память - НЕ будет ли больших временных задержек, если мне прийдется поочередно загружать и выгружать все мои фото с карты памяти ?
2. Моего опыта хватило написать код, понять что Имя Камеры сотавляет 18 байтов кодов ASCII, но как получить строку с названием камеры ?
Заранее спасибо.

Код:
#include-once
#include <GDIPlus.au3>
#include <GDIPConstants.au3>
Global $ghGDIPMatrix = 0
Global $GDIP_STATUS = 0
Global $GDIP_ERROR = 0

_GDIPlus_Startup ()
$file = FileOpenDialog("Please select file", "", "JPEG files (*.jpg;*.jpeg)");
$hImage = _GDIPlus_ImageLoadFromFile($file)

$a1 = _GDIPlus_ImageGetAllPropertyItems($hImage)
;~ $GDIP_PROPERTYTAGEQUIPMODEL = 0x0110 - Модель камеры
For $i=1 To $a1[0][0]
 If $a1[$i][0] = 0x0110 Then MsgBox (0, "EXIF Data", $a1[$i][0] & " " & $a1[$i][1] & " " & $a1[$i][2]) ;Вовращает "272 18 2"
Next

_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Уважаемые форумчане!
Ну подскажите как получить строку из Структуры, содержащей Pointer (указатель) на эту самую строку ?
Наверняка это 1-2 строки кода.
Пожалуйста помогите !
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Юрчище,
Попробуйте так.
Код:
#include <GDIP.au3>

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

_GDIPlus_Startup()
$iStart = TimerInit()
$hImage = _GDIPlus_ImageLoadFromFile($sFileJPG)
$aAll = _GDIPlus_ImageGetAllPropertyItems($hImage)
For $i = 1 To $aAll[0][0]
	If $aAll[$i][2] = 2 Then
		$tPropertyData = DllStructCreate('char[' & $aAll[$i][1] & ']', $aAll[$i][3])
		ConsoleWrite(DllStructGetData($tPropertyData, 1) & @LF)
	EndIf
Next
_GDIPlus_ImageDispose($hImage)
ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iStart)) & @LF)
_GDIPlus_Shutdown()
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Очередное большое человеческое СПАСИБО, madmasles !
:IL_AutoIt_1:
Все получилось, а это Ваша подсказка в 2 строки.
Имея Указатель на структуру-строку $pPointerData длиной в $iSizeData байт читаем ее:

Код:
$tPropertyData = DllStructCreate('char[' & $iSizeData & ']', $pPointerData) ;Создаем
$sPropertyData = DllStructGetData($tPropertyData, 1) ;Читаем


Надеюсь последний вопрос: будет ли использование GDIPlus занимать много ресурсов компа и времени на обработку ? :stars:
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Для случая строки ASCII:
; Possible property value types are:
; |2 - The value pointer points to a null terminated character stringASCII string
Вы предложили:
Код:
$tPropertyData = DllStructCreate('char[' & $iSizeData & ']', $pPointerData)


А для этого:
; |3 - The value pointer points to an array of unsigned shorts
поскажите ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Юрчище,
Если я правильно понял описание (у меня плохо с английским), то, наверное так.
Код:
#include <GDIP.au3>

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

_GDIPlus_Startup()
$iStart = TimerInit()
$hImage = _GDIPlus_ImageLoadFromFile($sFileJPG)
$aAll = _GDIPlus_ImageGetAllPropertyItems($hImage)
For $i = 1 To $aAll[0][0]
	Switch $aAll[$i][2]
		Case 2
			$tPropertyData = DllStructCreate('char[' & $aAll[$i][1] & ']', $aAll[$i][3])
			ConsoleWrite('2: ' & DllStructGetData($tPropertyData, 1) & @LF)
		Case 3
			$tPropertyData = DllStructCreate('short[' & $aAll[$i][1] / 2 & ']', $aAll[$i][3])
			ConsoleWrite('3: ' & DllStructGetData($tPropertyData, 1) & @LF)
	EndSwitch
Next
_GDIPlus_ImageDispose($hImage)
ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iStart)) & @LF)
_GDIPlus_Shutdown()
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Да, именно это. А понял - делим на 2, т.к. short занимает 2 байта !
 
Верх