Skocz do zawartości

plik JPG, miejsce przechowywania wysokości i szerokości


LionX Dagger

Rekomendowane odpowiedzi

witam

 

otóż nie mam zielonego pojęcia gdzie plik typu jpg przechowuje dane na temat swojej szerokości i wysokości, próbowałem znaleźć jakąś zależność w plikach o wymiarach 16x16 32x16 32x32 64x64 przy pomocy "xvi32" niestety okazało się to tylko skuteczne dla plików typu bmp,gif,png :/

 

może wy mi pomożecie

 

albo chociaż ktoś z was zna jakiś dll, dzięki któremu mógłbym sprawdzić rozmiar (szerokość i wysokość ) tych plików graficznych przed załadowaniem ich do GM

 

edit: udało mi się wreszcie znaleśc zależność w jpg

 

dla innych ciekawskich komórki w hex to

 

dla BMP (bmp akurat ma po 4 kolejno komórki dla szerokości i wysokości ja przetestowałem tylko do drugiej)

szerokość 12 i 13 wzór (12+(13*256))

wysokość 16 i 17 wzór (16+(17*256))

 

(wszystkich wzorów nie jestem pewny poza wzorem z 2 pierwszych komórek BMP uznałem że inne liczą na tej samej zasadzie, wyjdzie w praniu )

 

Dla Gif

szerokość 6 i 7 wzór (6+(7*256))

wysokość 8 i 9 wzór (16+(17*256))

 

Dla png

szerokość 13 i 12 wzór (13+(12*256))

wysokość 17 i 16 wzór (17+(16*256))

 

Dla jpg

szerokość BE i BD wzór (BE+(BD*256))

wysokość BC i BB wzór (BC+(BB*256))

(Jednak okazało się że te dane na jpg są złe :P)

Odnośnik do komentarza
Udostępnij na innych stronach

Właściwie, to pozycja danych o wymiarach w JPG zmienia się w zależności od pliku. Napisałem skrypt, który wyszukuje te dane i je zwraca:

 

jpg_get_dimensions

GML
// argument0: sciezka do pliku jpg

// zwraca: wysokosc i szerokosc spakowana w DWORDa, lub 0 jeśli nastąpił błąd

var file, width, height, blockType, blockSize, result;

 

result = 0;

file = file_bin_open( argument0, 0 );

 

if ( file_bin_read_byte( file ) != $FF && file_bin_read_byte( file ) != $D8 ) {

show_message( "Nie rozpoznano pliku jpg." );

file_bin_close( file );

return 0;

}

 

while ( true ) {

if ( file_bin_read_byte( file ) == $FF ) {

blockType = file_bin_read_byte( file );

 

if ( blockType == $C0 ) {

file_bin_seek( file, file_bin_position( file ) + 3 );

 

height = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

width = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

result = (width << 16) | height;

 

file_bin_seek( file, file_bin_position( file ) - 7 );

} else if ( blockType == $D9 )

break;

 

blockSize = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

file_bin_seek( file, file_bin_position( file ) + blockSize - 2 );

} else

break;

}

 

file_bin_close( file );

return result;

potem żeby odpakować te wartości możesz użyć tych skryptów:

 

get_width

GML
// argument0: wartosc zwrocona przez jpg_get_dimensions

// zwraca: szerokosc

return argument0 >> 16;

get_height

GML
// argument0: wartosc zwrocona przez jpg_get_dimensions

// zwraca: wysokosc

return argument0 & $FFFF;

no i przykład użycia:

 

GML
var dimensions;

dimensions = jpg_get_dimensions( get_open_filename( "Pliki jpg|*.jpg", "" ) );

 

show_message( "Szerokość: " + string( get_width( dimensions ) ) +

"#Wysokość: " + string( get_height( dimensions ) ) );

powinno trybić, sprawdzałem na kilku różnych plikach i było OK :P

Odnośnik do komentarza
Udostępnij na innych stronach

Właściwie, to pozycja danych o wymiarach w JPG zmienia się w zależności od pliku.

Hmm to dlatego było tak trudno znaleźć jakiś spójny wzór :/

 

 

 

Napisałem skrypt, który wyszukuje te dane i je zwraca:

jpg_get_dimensions

GML
// argument0: sciezka do pliku jpg

// zwraca: wysokosc i szerokosc spakowana w DWORDa, lub 0 jeśli nastąpił błąd

var file, width, height, blockType, blockSize, result;

 

result = 0;

file = file_bin_open( argument0, 0 );

 

if ( file_bin_read_byte( file ) != $FF && file_bin_read_byte( file ) != $D8 ) {

show_message( "Nie rozpoznano pliku jpg." );

file_bin_close( file );

return 0;

}

 

while ( true ) {

if ( file_bin_read_byte( file ) == $FF ) {

blockType = file_bin_read_byte( file );

 

if ( blockType == $C0 ) {

file_bin_seek( file, file_bin_position( file ) + 3 );

 

height = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

width = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

result = (width << 16) | height;

 

file_bin_seek( file, file_bin_position( file ) - 7 );

} else if ( blockType == $D9 )

break;

 

blockSize = (file_bin_read_byte( file ) << 8) | file_bin_read_byte( file );

file_bin_seek( file, file_bin_position( file ) + blockSize - 2 );

} else

break;

}

 

file_bin_close( file );

return result;

potem żeby odpakować te wartości możesz użyć tych skryptów:

 

get_width

GML
// argument0: wartosc zwrocona przez jpg_get_dimensions

// zwraca: szerokosc

return argument0 >> 16;

get_height

GML
// argument0: wartosc zwrocona przez jpg_get_dimensions

// zwraca: wysokosc

return argument0 & $FFFF;

no i przykład użycia:

 

GML
var dimensions;

dimensions = jpg_get_dimensions( get_open_filename( "Pliki jpg|*.jpg", "" ) );

 

show_message( "Szerokość: " + string( get_width( dimensions ) ) +

"#Wysokość: " + string( get_height( dimensions ) ) );

powinno trybić, sprawdzałem na kilku różnych plikach i było OK :P

Nie wiem jak żeś to wykombinował ale mi też dobrze działa :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...