Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem jak poznat obrázek JPEG

Ahoj,
jak se dá v Delphi poznat, že v zadaném souboru s příponou .jpeg, .jpg je skutečně obrázek JPEG a ne třeba přejmenovaný .doc? Má JPEG nějakou standardní hlavičku?
Díky za radu

Předmět Autor Datum
http://www.fastgraph.com/help/jpeg_header_format.ht ml
MaSo 14.06.2006 15:04
MaSo
To nie je uplne korektne, kazdy jpeg sice pravdepodobne bude zacinat FFh D8h, ale za tym nebude velk…
MM.. 14.06.2006 15:17
MM..
Podla google jpg nema standardny header. Sklada sa z blokov zacinajucimi markermi (ale len dva byty…
MM.. 14.06.2006 15:12
MM..
Z našeho IS exportujeme data do externího systému. Součástí dat jsou přílohy - soubory JPEG. Pro exp…
Žlababa 14.06.2006 15:37
Žlababa
No, povedal by som ze ak musis testovat aj velkost obrazku (max. 640x640bodov), tak musis zavolat fc…
MM.. 14.06.2006 15:42
MM..
Rozumím. Jde jen o to, zda existuje nějaká taková už hotová funkce (třeba přímo v Delphi), abych se…
Žlababa 14.06.2006 16:04
Žlababa
A čo tak to otvoriť v TJPEGImage a načítať údaje odtiaľ? Ak bude chyba pri otváraní, tak to nie je k…
msx. 14.06.2006 15:54
msx.
Třeba ti pomůže tohle: jpeginfo.html (dole je odkaz ke stažení)
host 14.06.2006 15:56
host
Možno Ti pomôže toto: { JPEG-Errorcodes: #36 : m:=m+'Output file write error --- out of disk space?…
pme 14.06.2006 18:31
pme
Pozerám, že občas mi to myslí dobre.;-):beer:
msx. 14.06.2006 19:54
msx.
Ahoj, moc díky všem za tipy, vypadá to na ten TJPEGImage. Vaše Žlababa :-)
Žlababa 15.06.2006 08:36
Žlababa
Stahni si "Dump JPEG marker information" zde: 15260.htm po par pokusech typu: JPEGDUMP.EXE -v -v… poslední
Charlie 28.06.2006 00:03
Charlie

To nie je uplne korektne, kazdy jpeg sice pravdepodobne bude zacinat FFh D8h, ale za tym nebude velkost ale napr. hned dalsi marker FFh E0h (JFIF) apod.
Ale je pravda ze ten test prvych 2bytov na FFh, D8h by mohol stacit (zhlavy ale neviem zarucit ze takto bude zacinat kazdy jpeg). Ale ako pisem nizsie nechapem na co je to dobre...

P.S. JFIF jpeg (s inymi sa asi ani nestretne) bude vyzerat takto ako je to nakreslene tu headerinfo.htm
dalo by sa testovat teda:
FF D8 FF E0, xx xx (cokolvek - 2byty), "JFIF", 00

Podla google jpg nema standardny header. Sklada sa z blokov zacinajucimi markermi (ale len dva byty FFh a typ bloku), ktore tam byt mozu ale nemusia (musia tam byt samozrejme bloky ktore obsahuju data obrazku :-))

Nechapem celkom o co ti ide, ved ak by to bol premenovany .doc tak ti to tvoje rutiny/procedury ktore to maju dekodovat nezdekoduju, snad v svojom programe nevolas funkcie ktore spustaju automaticky word :-O

Z našeho IS exportujeme data do externího systému. Součástí dat jsou přílohy - soubory JPEG. Pro export platí několik pravidel
1) soubory jsou ve formátu JPEG
2) velikost souboru nepřesáhne 640x640 bodů
3) celková velikost exportní dávky nepřesáhne 500kB

Podstatný je bod 1, tedy potřebuju otestovat, zda soubor, který uživatel připojil, je skutečně JPEG. Na otestování přípony se spoléhat nemůžu, chtělo by to nějakou důkladnější kontrolu.
Jinak díky za podněty

No, povedal by som ze ak musis testovat aj velkost obrazku (max. 640x640bodov), tak musis zavolat fciu ktora v tom subore najde nejaky header (ci uz JFIF alebo len klasicky) a z neho zisti velkost obrazku, a teda ak ten header najde s nejakymi rozumnymi udajmi sirkaxvyska, tak je to urcite jpeg. Ak fcia vrati nejaky error tak to jpeg nie je. Teda predpokladam ze ta fcia bude podporovat len jpeg-y a nic ine (ziadne bmp apod.), ak pouzijes nejaku univerzalnu fciu aj pre .bmp apod, tak samozrejme tym nezarucis ze to bude jpg.

Rozumím. Jde jen o to, zda existuje nějaká taková už hotová funkce (třeba přímo v Delphi), abych se v tom nemusel šťourat ručně. Vypadá to totiž docela jako lahůdka, a ručně vyzobávat pro všechny možné a nemožné formáty JPEGů se mi to opravdu nechce ;-)

Možno Ti pomôže toto:

{
JPEG-Errorcodes:
#36 : m:=m+'Output file write error --- out of disk space?';
#51 = JERR_NO_QUANT_TABLE: Quantization table 0x%02x was not defined
#52 : File is not a JPEG-File (for example if you try to read a GIF as a JPG)
#53 = JERR_OUT_OF_MEMORY: Insufficient memory (case %d)
#60 : JPEG file is incomplete
#67 : JPEG file is incomplete (like #60 - don't know where the difference

How to trap a JPEG-Error?
}

Image1.picture.loadfromfile(FileName);
if Image1.picture.graphic is TJpegImage then begin
    try
      TJPEGImage(Image1.picture.graphic).dibneeded;
    except
      on E:Exception do
        if (E.message='JPEG error #67') then begin
            showmessage('Incomplete JPEG')
        end;
    end;
end;

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