LionX Dagger Opublikowano 3 Października 2010 Udostępnij Opublikowano 3 Października 2010 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 Więcej opcji udostępniania...
Snake Opublikowano 3 Października 2010 Udostępnij Opublikowano 3 Października 2010 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 Więcej opcji udostępniania...
LionX Dagger Opublikowano 4 Października 2010 Autor Udostępnij Opublikowano 4 Października 2010 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę