2013-09-03 4 views
5

... czy powinienem zagłębić się w strumień danych, szukając sekwencji 0xFF 0xD8?Czy powinienem oczekiwać znacznika JPEG SOI na samym początku strumienia danych?

Od this Q, nauczyłem się, co APPn nie musi natychmiast podążać za SOI. Czy istnieją specyfikacje zgodne ze zdjęciami JPEG, w których pozycja SOI! = Początek strumienia?


cytat ze specyfikacji (załącznik B, § 1.1.2):

Markery służą do określenia różnych części konstrukcyjnych skompresowanych formatów danych. Większość znaczników rozpoczyna segmenty znaczników zawierające powiązaną grupę parametrów; niektóre markery są samodzielne. Wszystkie znaczniki mają przypisane kody dwubajtowe: bajt X'FF ', po którym następuje bajt o numerze nie równy 0 lub X'FF' (patrz Tabela B.1). Każdy znacznik może opcjonalnie być poprzedzony dowolną liczbą bajtów wypełniających, które są bajtami o kodzie X'FF '.

Odpowiedz

3

libjpeg nie zezwala na śmieci przed SOI:

/* Like next_marker, but used to obtain the initial SOI marker. */ 
/* For this marker, we do not allow preceding garbage or fill; otherwise, 
* we might well scan an entire input file before realizing it ain't JPEG. 
* If an application wants to process non-JFIF files, it must seek to the 
* SOI before calling the JPEG library. 
*/ 

Od: Random libjpeg mirror.

E.g. go implementation również nie pozwala na poprzednie śmieci.

Jednak w razie wątpliwości, trzymać się prawa Postel za:

być liberalne w tym, co akceptują i konserwatywny w co wyślesz

Mimo, że nie chce być zbyt liberalny, albo możesz wyodrębnić nie rzeczywisty plik JPEG ze strumienia, ale osadzoną miniaturę EXIF ​​lub coś w tym stylu.

+0

To całkiem logiczne, że losowe bajty na początku unieważniają cały strumień, ale mówiłem o bajtach dopełnienia, co wydaje się być dozwolone przez specyfikację (zobacz edycję). –

+0

Tak, specyfikacja może tak mówić, ale wiele implementacji, w tym implementacja referencyjna, obsługuje inaczej SOI (dałem libjpeg, idź jako przykłady). Jednak wypełnienie bajtów (a czasem nawet losowych śmieci) poprzedzających znacznik są chętnie akceptowane dla wszystkich innych znaczników w większości implementacji, które napotkałem ... przynajmniej do pewnego punktu. – nmaier