Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Exif informace - výpis v C/C++

Dobrý den
Dělám v C/C++ program, co mi má vypsat EXIF informace z JPEG obrázku.Chtěl bych se proto zeptat, zda-li někdo neví o nějakých stručnějších skriptech v češtině, nebo offsetové DEC(vyhledávam adresu pomocí funkce fseek(), která bere pouze long adresu) adresy EXIF informací. Našel jsem i oficiální skripta, ale v jejich tabulkách offsetové adresy nepasovaly při převodu na adresy, které jsem našel při náhodném hledání přes cyklus.
Děkuji za odpovědi.
Změna předmětu, původně: Exif informace (Kráťa)

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Předpokládám, že na můj dotaz již nebude odpovězeno, ale za optání nic nedám. Když mám tag 9003, což…
hajnis 26.12.2011 17:29
hajnis
okrem toho ze nechapem co vlastne teraz mas presne za problem, si asi stale nepochopil to co som pis…
MM.. 26.12.2011 20:37
MM..
Nevím, jestli jsem to pochopil správně z té dokumentace. Hledám zase 2byty jednotlivých tagů např. D…
hajnis 26.12.2011 21:08
hajnis
A este priklad na motorola endian (to je jpeg z mojho mobilu). Tvoj program MUSI vediet spracovat ob…
MM.. 26.12.2011 23:38
MM..
Super!! Fakt moc díky za trpělivost a ochotu, nyní už to chápu.:-)
hajnis 27.12.2011 13:46
hajnis
Neni zac (aspon som si nastudoval EXIF :), dufam ze dostanes za jedna, lebo inac pojdem nakopat prof… poslední
MM.. 27.12.2011 13:49
MM..

Předpokládám, že na můj dotaz již nebude odpovězeno, ale za optání nic nedám.
Když mám tag 9003, což je datum pořízení, tak jak zjistím adresu, na které se nechází exif informace o datu a času?
např. adresa, na které se začíná vypisovat datum je: 2227dec, ale adresa na které nacházím tag 9003 je až na řádku 2356, takže úplně mimo. Chci se tedy zeptat:

Jak pomocí onoho tagu( nebo něčeho jiného) zjistím adresu, na které se nachází kýžená data?

Děkuji

okrem toho ze nechapem co vlastne teraz mas presne za problem, si asi stale nepochopil to co som pisal hore? Neexistuju ziadne adresy, existuje len retaz tagov. Prechadzas celu retaz (tag ktory nechces preskocis - pripocitas dlzku) az kym najdes svoj tag. Jeho format je popisany v specifikacii, exif specifikaciu mas (ten pdf subor)
P.S. to znamena ze tag s datumom moze byt aj na adrese milion, napr. ak je medzi tym este tag nahlad dlhy napr. 1MB.

Nevím, jestli jsem to pochopil správně z té dokumentace.
Hledám zase 2byty jednotlivých tagů např. Datum vytvoření(0132.H). Jakmile najdu tento tag, tak by hned za ním měly následovat informace které k tomuto tagu patří, do doby, než následuje další tag ne?

A este priklad na motorola endian (to je jpeg z mojho mobilu). Tvoj program MUSI vediet spracovat oba endiany, napr. si urob fcie CitajWORD a CitajDWORD, napr. (moznosti je mnoho mozes to urobit aj inac napr. aj naslednou konverziou apod)

unsigned int CitajDWORD(endian) {
 unsigned int i, bajt, hodnota=0;
 for (i=0; i<4; i++) {
  bajt = precitas bajt zo suboru;
  if(endian) {
   hodnota<<=8;
   hodnota+=bajt;
  }else{
   hodnota>>=8;
   hodnota+=bajt<<24;
  }
 }
 return(hodnota);
}

pre WORD (2bajty) to ani nemusis cyklom len 2x precitas bajt a ulozis spravne do unsigned int.
Ten priklad jpeg suboru:
FF D8 - Start Of Image, nic nepreskakujem citam dalsi chunk.
FF E0 - tento jpeg chunk ma nezaujima takze musim preskocit
00 10 - dlzka toho chunku je 10hex (16dec), takze musim preskocit presne 16-2= 14 bajtov, lebo 2bajty (dlzku samotnu) som uz precital!
FF E1 - hura mam APP1 chunk
25 06 - dlzka APP1 ma teraz nezaujima, ignorujem
45 78 69 66 - "Exif", otestujem alebo ignorujem
00 00 - ignorujem
TU JE EXIF OFFSET 0 (v mojom pripade je to absolutny offset suboru 1E hex, zapamatam si alebo vynulujem pocitadlo precitanych bajtov)
4D 4D - "MM" - zapamatam si ze mam motorola endian a pouzijem to pri citani vsetkych viacbajtovych hodnot
00 2A - tu ma byt 002A a aj je, otestujem alebo ignorujem.
00 00 00 08 - nulta IPD je na offsete 8, takze preskakujem 8-8=0 takze nic nepreskakujem.
00 09 - bude nasledovat 9 tagov
01 0F - nezaujima ma, preskakujem 2+4+4 dalsich bajtov
01 10 - nezaujima ma, preskakujem 2+4+4 dalsich bajtov
atd presne 9x.
Potom po tych 9 tagoch si precitam 4bajty "next IPD offset" ak je 00000000 tak koncia EXIF tabulky, ak neni 00000000 tak na tom exif offsete je dalsia tabulka s dalsimi EXIF tagmi (zacina 2bajtami poctom tagov a potom tagy a potom zas next IPD offset).
V tomto subore neni ani tag 0132 a ani 9003 takze v nom neni cas ani datum.

Zpět do poradny Odpovědět na původní otázku Nahoru