update 'exif.obj':

1) add new function exif_get_app2 (found maker from cameras: Nikon, Canon, Panasonic)
2) small fixes

git-svn-id: svn://kolibrios.org@5009 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2014-07-22 20:43:05 +00:00
parent aca533427d
commit 9adefdc190
3 changed files with 165 additions and 20 deletions

View File

@ -16,7 +16,7 @@ include '../../../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../../../dll.inc' include '../../../../dll.inc'
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
caption db '<EFBFBD>à®á¬®âà ¨­ä®à¬ æ¨¨ Exif 18.07.14',0 ;¯®¤¯¨áì ®ª­  caption db 'Źŕ®á¬®âŕ ¨­ä®ŕ¬ ć¨¨ Exif 23.07.14',0 ;Ż®¤Ż¨áě ®Ş­ 
struct FileInfoBlock struct FileInfoBlock
Function dd ? Function dd ?
@ -421,11 +421,7 @@ pushad
jne .cycle_0 jne .cycle_0
;áç¨â뢠ĽŹ ¤ŽçĽŕ­¨Ľ ⼣¨ ¤Ťď 0x8769 ;áç¨â뢠ĽŹ ¤ŽçĽŕ­¨Ľ ⼣¨ ¤Ťď 0x8769
stdcall [exif_get_app1_child], h_app1,h_child,0x8769 stdcall [exif_get_app2], h_app1,h_child
cmp dword[h_child],0
je .no_found_child
;áç¨â뢠¥¬ ¤®ç¥à­¨¥ ⥣¨ ¤«ï 0xa005
stdcall [exif_get_app1_child], h_child,h_child,0xa005
cmp dword[h_child],0 cmp dword[h_child],0
je .no_found_child je .no_found_child
@ -652,10 +648,12 @@ import_exif: ;
exif_get_app1 dd sz_exif_get_app1 exif_get_app1 dd sz_exif_get_app1
exif_get_app1_tag dd sz_exif_get_app1_tag exif_get_app1_tag dd sz_exif_get_app1_tag
exif_get_app1_child dd sz_exif_get_app1_child exif_get_app1_child dd sz_exif_get_app1_child
exif_get_app2 dd sz_exif_get_app2
dd 0,0 dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0 sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0 sz_exif_get_app1_child db 'exif_get_app1_child',0
sz_exif_get_app2 db 'exif_get_app2',0
;exif_get_image_160_120 ;exif_get_image_160_120
sc system_colors sc system_colors

View File

@ -54,7 +54,7 @@ table { font-size: 15px; }
<li><a href="#f_1">exif_get_app1</a></li> <li><a href="#f_1">exif_get_app1</a></li>
<li><a href="#f_2">exif_get_app1_tag</a></li> <li><a href="#f_2">exif_get_app1_tag</a></li>
<li><a href="#f_3">exif_get_app1_child</a></li> <li><a href="#f_3">exif_get_app1_child</a></li>
<li><a href="#f_4">exif_get_app2</a></li>
</ul> </ul>
</li> </li>
<li><a href="#const">Константы для функции exif_get_app1_child</a></li> <li><a href="#const">Константы для функции exif_get_app1_child</a></li>
@ -66,7 +66,7 @@ table { font-size: 15px; }
<p>Документация к свободной библиотеке <b>exif.obj</b>, для <b>ОС Колибри</b>. <p>Документация к свободной библиотеке <b>exif.obj</b>, для <b>ОС Колибри</b>.
Эта библиотека создана для просмотра информации находящейся в изображениях в формате Exif. Информация эта создается цифровыми фотокамерами и содержит разные параметры например такие как: название фирмы производителя, модель камеры, и т.д.</p> Эта библиотека создана для просмотра информации находящейся в изображениях в формате Exif. Информация эта создается цифровыми фотокамерами и содержит разные параметры например такие как: название фирмы производителя, модель камеры, и т.д.</p>
<p>Последнее обновление библиотеки 22.07.14.</p> <p>Последнее обновление библиотеки 23.07.14.</p>
<h1><a name="fun">Функции</a></h1> <h1><a name="fun">Функции</a></h1>
@ -108,6 +108,15 @@ h_child dd 0,0,0</pre>
<p>0x8769 - код тега (находящегося в списке тегов h_app1), который является указателем на список других дочерних тегов.</p> <p>0x8769 - код тега (находящегося в списке тегов h_app1), который является указателем на список других дочерних тегов.</p>
<p>В даном примере функция берет тег 0x8769 и пытается найти его в списке h_app1, если находит то заполняет по нему значения в структуре h_child. Далее к списку h_child можно применять функцию exif_get_app1_tag для взятия значения этих тегов. С помощью этой функции мы как бы переходим внутрь некой &quot;папки&quot; с тегами, которые сразу достать не можем.</p> <p>В даном примере функция берет тег 0x8769 и пытается найти его в списке h_app1, если находит то заполняет по нему значения в структуре h_child. Далее к списку h_child можно применять функцию exif_get_app1_tag для взятия значения этих тегов. С помощью этой функции мы как бы переходим внутрь некой &quot;папки&quot; с тегами, которые сразу достать не можем.</p>
<h4><a name="f_4">exif_get_app2</a></h4>
<p>Эта функция ищет начало данных Exif.app2. Если они найдены то заполняется структура app2. Если не найдены, то первый параметр в структуре делается равным 0. Пример:</p>
<pre>stdcall [exif_get_app2], h_app1,h_app2
...
h_app1 dd 0,0,0
h_app2 dd 0,0,0</pre>
<p>где h_app1 - структура c данными Exif.app1, предварительно заполненная функцией exif_get_app1.</p>
<p>h_app2 - структура для запоминания начала данных Exif.app2.</p>
<h1><a name="const">Константы для функции exif_get_app1_child</a></h1> <h1><a name="const">Константы для функции exif_get_app1_child</a></h1>
<p>Здесь приведены некоторые константы, которые могут использоватся как 3-й параметр для функции exif_get_app1_child. Эти константы обозначают специальные теги, которые содержат смещение на дочерние параметры, которые находятся в Exif.</p> <p>Здесь приведены некоторые константы, которые могут использоватся как 3-й параметр для функции exif_get_app1_child. Эти константы обозначают специальные теги, которые содержат смещение на дочерние параметры, которые находятся в Exif.</p>
<h4>0x8769</h4> <h4>0x8769</h4>
@ -122,12 +131,15 @@ import_exif:
exif_get_app1 dd sz_exif_get_app1 exif_get_app1 dd sz_exif_get_app1
exif_get_app1_tag dd sz_exif_get_app1_tag exif_get_app1_tag dd sz_exif_get_app1_tag
exif_get_app1_child dd sz_exif_get_app1_child exif_get_app1_child dd sz_exif_get_app1_child
exif_get_app2 dd sz_exif_get_app2
dd 0,0 dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0 sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0</pre> sz_exif_get_app1_child db 'exif_get_app1_child',0
sz_exif_get_app2 db 'exif_get_app2',0</pre>
<h1><a name="hist">История</a></h1> <h1><a name="hist">История</a></h1>
<p>15.07.14 - первая версия библиотеки, пример использования.</p> <p>15.07.14 - первая версия библиотеки, пример использования.</p>
<p>23.07.14 - добавлена функция exif_get_app2.</p>
</body> </body>
</html> </html>

View File

@ -28,6 +28,7 @@ tag_format_f8b equ 12 ;float 8 byte
align 4 align 4
txt_dp db ': ',0 txt_dp db ': ',0
txt_zap db ', ',0
txt_div db '/',0 txt_div db '/',0
; ;
@ -212,6 +213,7 @@ db 0x87,0xac,'Image layer',0
db 0x87,0xaf,'Geo tiff directory',0 db 0x87,0xaf,'Geo tiff directory',0
db 0x87,0xb0,'Geo tiff double params',0 db 0x87,0xb0,'Geo tiff double params',0
db 0x87,0xb1,'Geo tiff ascii params',0 db 0x87,0xb1,'Geo tiff ascii params',0
db 0x88,0x25,'GPS info',0
db 0x88,0x28,'Opto-Electric conv factor',0 db 0x88,0x28,'Opto-Electric conv factor',0
db 0x88,0x29,'Interlace',0 db 0x88,0x29,'Interlace',0
db 0x88,0x5c,'Fax recv params',0 db 0x88,0x5c,'Fax recv params',0
@ -385,7 +387,6 @@ db 0x82,0x9a,'Exposure time',0
db 0x82,0x9d,'F number',0 db 0x82,0x9d,'F number',0
db 0x88,0x22,'Exposure program',0 db 0x88,0x22,'Exposure program',0
db 0x88,0x24,'Spectral sensitivity',0 db 0x88,0x24,'Spectral sensitivity',0
db 0x88,0x25,'GPS info',0
db 0x88,0x27,'ISO',0 db 0x88,0x27,'ISO',0
db 0x88,0x2a,'Time zone offset',0 db 0x88,0x2a,'Time zone offset',0
db 0x88,0x2b,'Self timer mode',0 db 0x88,0x2b,'Self timer mode',0
@ -681,6 +682,102 @@ popad
ret ret
endp endp
;output:
; app2 - 㪠§ â¥«ì ­  ­ ç «® exif.app2 (¨«¨ 0 ¥á«¨ ­¥ ­ ©¤¥­® ¨«¨ ä®à¬ â ä ©«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï)
align 4
proc exif_get_app2, app1:dword, app2:dword
pushad
mov eax,[app1]
cmp [eax],edx
je .no_suport ;¥á«¨ ­¥ ­ ©¤¥­ 㪠§ â¥«ì ­  ­ ç «® exif.app1
mov edi,[app2]
movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1
;­ ç «® ¯®¨áª  ¯à®¨§¢®¤¨â¥«ï ª ¬¥àë
mov ebx,0x010f
bt edx,0
jnc @f
ror bx,8
@@:
;¯à®¢¥à塞 ç¨á«® ⥣®¢
mov eax,[eax]
movzx ecx,word[eax]
bt edx,0
jnc @f
ror cx,8
@@:
cmp ecx,1
jl .no_suport ;¥á«¨ ç¨á«® ⥣®¢ <1
;¯¥à¥å®¤¨¬ ­  1-© ⥣
add eax,offs_tag_0
@@:
cmp word[eax],bx
je @f
add eax,tag_size
loop @b
jmp .no_suport ;¥á«¨ ­¥ ­ ©¤¥­®
@@: ;¥á«¨ ­ ©¤¥­®
mov ebx,dword[eax+4]
bt edx,0
jnc @f
ror bx,8
ror ebx,16
ror bx,8
@@:
cmp ebx,4
jle .no_suport ;­ §¢ ­¨¥ ¯à®¨§¢®¤¨â¥«ï ¬¥­ìè¥ 4 ᨬ¢®«®¢, ­¥ ¯®¤¤¥à¦¨ ¢ ¥âáï
mov ebx,dword[eax+8]
bt edx,0
jnc @f
ror bx,8
ror ebx,16
ror bx,8
@@:
;¯à®¢¥àª  ¯®¤¤¥à¦¨¢ ¥¬ëå ¯à®¨§¢®¤¨â¥«¥©
mov eax,[app1]
add ebx,[eax+4]
cmp dword[ebx],'Cano'
je .suport
cmp dword[ebx],'NIKO'
je .suport
cmp dword[ebx],'Pana'
je .suport
;¢á¥ ®áâ «ì­ë¥ ­¥ ¯®¤¤¥à¦¨¢ îâáï
jmp .no_suport
.suport:
;­ å®¤¨¬ ⥣ 0x8769 (à áè¨à¥­­ë¥ ¤ ­­ë¥ ¯® Exif)
stdcall exif_get_app1_child, eax,edi,0x8769
cmp dword[edi],0
je .no_suport
;­ å®¤¨¬ ⥣ 0xa005 (¤ ­­ë¥ Maker ¯® ª ¬¥à¥)
stdcall exif_get_app1_child, edi,edi, 0x927c
cmp dword[edi],0
je .no_suport
cmp dword[ebx],'NIKO'
jne @f
add dword[edi],18 ;for Nikon
@@:
cmp dword[ebx],'Pana'
jne @f
add dword[edi],12 ;for Panasonic
@@:
jmp @f
.no_suport:
mov dword[edi],0
@@:
popad
ret
endp
;description: ;description:
; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ç⥭¨ï ­ §­ ç¥­¨© ⥣®¢ ; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ç⥭¨ï ­ §­ ç¥­¨© ⥣®¢
;input: ;input:
@ -732,13 +829,17 @@ proc read_tag_value, app1:dword, t_max:dword
add esi,2 add esi,2
stdcall str_n_cat,edi,esi,[t_max] stdcall str_n_cat,edi,esi,[t_max]
jmp @f jmp .start_read
.tag_unknown: .tag_unknown:
;¥á«¨ ⥣ ­¥ ­ ©¤¥­ áâ ¢¨¬ ¥£® ª®¤ ¢¬¥áâ® ­ §¢ ­¨ï ;¥á«¨ ⥣ ­¥ ­ ©¤¥­ áâ ¢¨¬ ¥£® ª®¤ ¢¬¥áâ® ­ §¢ ­¨ï
movzx ebx,word[eax] movzx ebx,word[eax]
bt edx,0
jnc @f
ror bx,8
@@:
stdcall hex_in_str, edi, ebx,4 stdcall hex_in_str, edi, ebx,4
mov byte[edi+4],0 mov byte[edi+4],0
@@: .start_read:
;ç¨â ¥¬ ¨­ä®à¬ æ¨î ¢ ⥣¥ ;ç¨â ¥¬ ¨­ä®à¬ æ¨î ¢ ⥣¥
mov bx,tag_format_ui1b mov bx,tag_format_ui1b
@ -750,18 +851,34 @@ proc read_tag_value, app1:dword, t_max:dword
jne .tag_01 jne .tag_01
stdcall str_n_cat,edi,txt_dp,[t_max] stdcall str_n_cat,edi,txt_dp,[t_max]
call get_tag_data_size call get_tag_data_size
cmp ebx,1 cmp ebx,4
jg .over4b_01 jg .over4b_01
;・皚ィ ョ、ュョ 1 。<>ゥ箘「ョ・ 遞皚ョ cmp ebx,1
je @f
or edx,2 ;array data
mov ecx,dword[eax+8]
mov dh,bl
@@:
;¥á«¨ 1 ®¤­® ¡ ©â®¢®¥ ç¨á«®
movzx ebx,byte[eax+8] movzx ebx,byte[eax+8]
;bt edx,0
;jnc @f
; ror bx,8
;@@:
stdcall str_len,edi stdcall str_len,edi
add edi,eax add edi,eax
mov eax,ebx mov eax,ebx
call convert_int_to_str ;[t_max] call convert_int_to_str ;[t_max]
bt edx,1
jnc .end_f
@@:
;¥á«¨ ®â 2 ¤® 4 ®¤­® ¡ ©â®¢ëå ç¨á¥«
dec dh
cmp dh,0
je .end_f
shr ecx,8
stdcall str_n_cat,edi,txt_zap,[t_max]
stdcall str_len,edi
add edi,eax
movzx eax,cl
call convert_int_to_str ;[t_max]
jmp @b
.over4b_01: .over4b_01:
;... ;...
jmp .end_f jmp .end_f
@ -808,8 +925,16 @@ proc read_tag_value, app1:dword, t_max:dword
jne .tag_03 jne .tag_03
stdcall str_n_cat,edi,txt_dp,[t_max] stdcall str_n_cat,edi,txt_dp,[t_max]
call get_tag_data_size call get_tag_data_size
cmp ebx,1 cmp ebx,2
jg .over4b_03 jg .over4b_03
jne @f
;¥á«¨ ¤¢  2 ¡ ©â®¢ëå ç¨á« 
or edx,2 ;array data
movzx ecx,word[eax+10]
bt edx,0
jnc @f
ror cx,8
@@:
;¥á«¨ ®¤­® 2 ¡ ©â®¢®¥ ç¨á«® ;¥á«¨ ®¤­® 2 ¡ ©â®¢®¥ ç¨á«®
movzx ebx,word[eax+8] movzx ebx,word[eax+8]
bt edx,0 bt edx,0
@ -820,6 +945,14 @@ proc read_tag_value, app1:dword, t_max:dword
add edi,eax add edi,eax
mov eax,ebx mov eax,ebx
call convert_int_to_str ;[t_max] call convert_int_to_str ;[t_max]
bt edx,1 ;array ?
jnc .end_f
;¤®¡ ¢«ï¥¬ 2-¥ ç¨á«®
stdcall str_n_cat,edi,txt_zap,[t_max]
stdcall str_len,edi
add edi,eax
mov eax,ecx
call convert_int_to_str ;[t_max]
.over4b_03: .over4b_03:
;... ;...
jmp .end_f jmp .end_f
@ -1079,7 +1212,9 @@ EXPORTS:
dd sz_exif_get_app1, exif_get_app1 dd sz_exif_get_app1, exif_get_app1
dd sz_exif_get_app1_tag, exif_get_app1_tag dd sz_exif_get_app1_tag, exif_get_app1_tag
dd sz_exif_get_app1_child, exif_get_app1_child dd sz_exif_get_app1_child, exif_get_app1_child
dd sz_exif_get_app2, exif_get_app2
dd 0,0 dd 0,0
sz_exif_get_app1 db 'exif_get_app1',0 sz_exif_get_app1 db 'exif_get_app1',0
sz_exif_get_app1_tag db 'exif_get_app1_tag',0 sz_exif_get_app1_tag db 'exif_get_app1_tag',0
sz_exif_get_app1_child db 'exif_get_app1_child',0 sz_exif_get_app1_child db 'exif_get_app1_child',0
sz_exif_get_app2 db 'exif_get_app2',0