Niestety, nie jest to proste dla JPEG. Powinieneś spojrzeć na źródło do narzędzia wiersza poleceń jhead
. Dostarcza tych informacji. Podczas przechodzenia przez źródło zobaczysz funkcję ReadJpegSections
. Ta funkcja skanuje wszystkie segmenty zawarte w pliku JPEG, aby wyodrębnić żądane informacje. Szerokość i wysokość obrazu jest uzyskiwana podczas przetwarzania ramek, które mają znacznik SOFn
.
widzę źródło znajduje się w domenie publicznej, więc pokażę fragment, który pobiera informacje image:
static int Get16m(const void * Short)
{
return (((uchar *)Short)[0] << 8) | ((uchar *)Short)[1];
}
static void process_SOFn (const uchar * Data, int marker)
{
int data_precision, num_components;
data_precision = Data[2];
ImageInfo.Height = Get16m(Data+3);
ImageInfo.Width = Get16m(Data+5);
z kodu źródłowego, to jest dla mnie jasne, nie ma jednego „nagłówek "z tymi informacjami. Musisz przeskanować plik JPEG, analizując każdy segment, aż znajdziesz segment zawierający informacje, które chcesz. Jest to opisane w wikipedia article:
JPEG obraz składa się z sekwencji segmentów, każdy początku z markerem, z których każda zaczyna się bajt 0xFF następnie bajt wskazujący, jaki rodzaj markera jest. Niektóre znaczniki składają się tylko z tych dwóch bajtów; po innych następują dwa bajty wskazujące długość danych właściwych dla danych właściwych dla markera.
Plik w formacie JPEG składa się z szeregu segmentów:
SEGMENT_0
SEGMENT_1
SEGMENT_2
...
Każdy segment zaczyna się znacznik 2 bajtów. Pierwszy bajt to 0xFF
, drugi bajt określa typ segmentu. Następnie następuje kodowanie długości segmentu. W segmencie są dane specyficzne dla tego typu segmentu.
Szerokość i wysokość obrazu znajduje się w segmencie typu SOFn
lub "Początek klatki [n]", gdzie "n" to pewna liczba, która oznacza coś specjalnego dla dekodera JPEG. Powinien być wystarczająco dobry, aby szukać tylko dla SOF0
, a jego oznaczenie bajtu to 0xC0
. Po znalezieniu tej ramki możesz ją odkodować, aby znaleźć wysokość i szerokość obrazu.
więc struktura programu, aby robić to, co chcesz wyglądałby następująco:
file_data = the data in the file
data = &file_data[0]
while (data not at end of file_data)
segment_type = decoded JPEG segment type at data
if (type != SOF0)
data += byte length for segment_type
continue
else
get image height and width from segment
return
Jest to zasadniczo struktura znaleźć w Michael Petrov's get_jpeg_size()
implementation.
Czy masz szczegóły tego, co jest zawarte w plikach JPEG? Jeśli tak, proszę dołącz to w swoim pytaniu. Wątpię, czy powyższa metoda zadziała, ponieważ na początku jest generalnie nagłówek, a następnie zaczynają się rzeczywiste wartości pikseli. Jeśli potrzebujesz tylko informacji o wysokości i szerokości, wierzę, że możesz to uzyskać, czytając sam nagłówek. – shrm
@mishr: Mówię ogólnie o plikach jpeg. –
Rozumiem to, ale pytanie brzmi: czy wiesz, jaki jest format plików jpeg? Czy chcesz, abyśmy znaleźli to dla ciebie? – shrm