Szukam szybkiego sposobu na uzyskanie wysokości i szerokości obrazu w pikselach. Powinien obsługiwać co najmniej JPG, PNG i TIFF, ale im więcej, tym lepiej. Podkreślam szybko, ponieważ moje obrazy są dość duże (do 250 MB), a uzyskanie rozmiaru za pomocą ImageMagick zajmuje zbyt dużo czasu, identify
ponieważ oczywiście najpierw odczytuje obrazy jako całość.
Najlepiej szukam sposobu, który działa dobrze w Rubim, a nawet w Railsach 3.
Znam teorię (różne formaty obrazów, ich nagłówki i różnice itd.). Rzeczywiście, proszę o jakąś bibliotekę, która może rozwiązać mój problem w dość ogólny sposób.
Właśnie znalazłem imagesize, który wygląda obiecująco, chociaż rozwój wydaje się być martwy.
Odpowiedzi:
file
Komenda drukuje wymiary kilku formatów graficznych (np PNG, GIF, JPEG, najnowsze wersje również ppm, webp), a nie tylko czytać nagłówek.identify
Poleceń (od ImageMagick) drukuje wiele informacji obrazu dla różnych obrazów. Wydaje się, że ogranicza się do czytania części nagłówka (patrz komentarze). Ma również ujednoliconą produkcję, którejfile
niestety brakuje.exiv2
podaje wymiary dla wielu formatów, w tym JPEG, TIFF, PNG, GIF, WEBP, nawet jeśli nie ma nagłówka EXIF. Nie jest jednak jasne, czy w tym celu odczytuje wszystkie dane. Zobacz stronę podręcznika exiv2 dla wszystkich obsługiwanych formatów obrazów.head -n1
poda wymiary dla formatów PPM, PGM.W przypadku formatów popularnych w sieci zarówno
exiv2
iidentify
będą spełniały swoje zadanie. W zależności od przypadku użycia może być konieczne napisanie własnego skryptu, który łączy / analizuje dane wyjściowe kilku narzędzi.źródło
Nie jestem pewien, czy masz zainstalowany php, ale ta funkcja PHP jest całkiem przydatna
źródło
Możesz użyć funkcji identyfikacji ImageMagick . Oto jak to zrobić w bash (uwaga $ 0 to ścieżka obrazu):
A to również ukrywa potencjalne komunikaty o błędach. Nowoczesne implementacje
identify
odczytują tylko nagłówek, a nie cały obraz, dzięki czemu jest szybki. Nie wiem jednak, jak wypada w porównaniu z innymi metodami.źródło
read width height < <(identify -format "%w %h" "${1}")
https://joseluisbz.wordpress.com/2013/08/06/obtaining-size-or-dimension-of-images/ (BMP, PNG, GIF, JPG, TIF lub WMF)
Tutaj dla dwóch formatów PNG i JPG.
Mój kod pochodzi z klasy zaprojektowanej do mojego użytku, możesz go edytować zgodnie z własnymi potrzebami.
Sprawdź te funkcje / metody za pomocą PHP :
Korzystanie z kodu PHP:
Teraz te funkcje / metody używające JAVA :
Korzystanie z kodu Java:
źródło
ref
/out
parametrów w Javie - czy jest to uważane za najlepszą praktykę?Zakładam, że to żądane wymiary w pikselach (szerokość i wysokość)?
Wydaje mi się, że większość formatów plików ma pewne informacje w nagłówku określające wymiary, dzięki czemu oprogramowanie czytające plik może wiedzieć, ile miejsca musi zarezerwować, zanim zacznie czytać plik. Niektóre "surowe" formaty plików mogą być po prostu strumieniem bajtów z pewnymi bajtami "końca wiersza" na końcu każdego poziomego rzędu pikseli (w takim przypadku oprogramowanie musi odczytać pierwszą linię i podzielić rozmiar strumienia bajtów przez długość linii, aby uzyskać wysokość).
Nie sądzę, aby można było to zrobić w jakikolwiek „ogólny” sposób, ponieważ musisz zrozumieć format pliku (lub oczywiście skorzystać z biblioteki), aby wiedzieć, jak go czytać. Prawdopodobnie możesz znaleźć kod, który w większości przypadków da przybliżone oszacowanie wymiarów bez czytania całego pliku, ale myślę, że niektóre typy plików mogą wymagać przeczytania całego pliku, aby upewnić się, jakie naprawdę ma wymiary. Spodziewam się, że większość formatów obrazów zorientowanych na WWW ma nagłówek z takimi informacjami, aby przeglądarka mogła utworzyć wymiary pudełka przed załadowaniem całego obrazu.
Sądzę, że dobra biblioteka miałaby pewne metody uzyskiwania wymiarów plików, które obsługuje, i że metody te byłyby zaimplementowane tak wydajnie, jak to tylko możliwe.
Aktualizacja : wydaje się, że imageinfo robi to, co chcesz. (Nie testowałem tego)
źródło
Jeśli masz informacje EXIF na obrazach, możesz po prostu przeczytać nagłówek EXIF.
źródło
-ping jest opcją, która wydaje się być wprowadzona w tym celu.
Jednak od ImageMagick 6.7.7 nie obserwuję spowolnienia nawet dla każdego dużego pliku, np .:
Czy możesz stworzyć przykładowy obraz wejściowy, dla którego nadal jest wolny?
źródło
tldr: wystarczy plik "nazwaobrazu"
współpracuje z webp, wszystkimi formatami jpg (jpeg, jpg200, ..),
Przykładowy wynik wygląda tak
załaduj wyjście pliku na listę Pythona i użyj czwartego pola na liście.
FYI, zoptymalizował około 18000+ obrazów, aby zmniejszyć ruch w sieci.
źródło