Я пытаюсь найти действительно быстрый метод определения размеров изображений.
Я знаю, что могу создать изображение, а затем использовать imagemagick для определения высоты и ширины изображения. Я обеспокоен тем, что это не самый быстрый способ сделать это.
Я также обеспокоен необходимостью установить imagemagick, когда мне нужен только небольшой набор функций. Я нахожусь на встроенной системе, которая имеет очень ограниченные ресурсы (процессор, память, память).
Любые идеи?
bash
wget
imagemagick
exvance
источник
источник
Ответы:
Как вы заметили, вам не нужен весь пакет ImageMagick . Тебе просто нужно
identify
.Вам также понадобятся библиотеки, на которые ссылаются исполняемые файлы (и библиотеки, на которые эти библиотеки ссылаются).
ldd
покажет список. Когда я сделал это, он включал в себя несколько библиотек X libs, libjpeg и т. Д., А также две библиотеки из пакета ImageMagick,libMagickCore
иlibMagickWand
. Они выглядят связанными с одной и той же кучей вещей, поэтому, если у вас есть это,identify
должно работать.Вам не нужно загружать все изображение, чтобы получить размеры, потому что они находятся в заголовке в начале файла, и это то, на что мы
identify
смотрим. Например, здесь я копирую первые 4 КБ из полного jpeg в новый файл:4 кБ должно быть более чем достаточно, чтобы включить заголовок - я уверен, что вы могли бы сделать это с 1/4 этой суммы. Сейчас же:
Это правильные размеры для
real.jpg
. Однако обратите внимание, что размер (4,1 КБ) - это размер усеченного файла, поскольку эта информация не из заголовка изображения.Итак, вам нужно всего лишь загрузить первый килобайт каждого изображения.
источник
Вы можете использовать
curl
для загрузки частей изображения. Все зависит от того, насколько надежным он должен быть. Тестовый случай может быть первым 500 байтов. Кажется, для работы много,png
аjpg
затем используйтеidentify
или как, чтобы проверить размер.Редактировать:
Я давно писал парсеры изображений, но немного подумал и освежил часть своей памяти.
Я подозреваю, что это все виды изображений, которые вы хотите проверить (но опять же, возможно, нет). Я опишу некоторые из наиболее распространенных из них:
PNG
,JPEG
(JFIF) иGIF
.PNG:
Это просто, когда дело доходит до извлечения размера.
png
Заголовка хранит размер в пределах первых 24 байт. Сначала идет фиксированный заголовок:Далее идут куски через файл. Они состоят из фиксированного поля длины, типа и контрольной суммы. Кроме того необязательных данные секция длиной размера.
К счастью, первый блок всегда
IHDR
с таким макетом:Таким образом, мы имеем размеры 16-20 и 21-24. Вы можете вывести данные, например, с помощью hexdump:
На машине Big Endian / Motorola можно также распечатать размеры напрямую:
Однако на Little Endian / Intel это не так просто и не очень портативно.
Таким образом, мы можем реализовать скрипт bash + hexdump, как в:
Но это не совсем эффективно. Хотя для этого требуется больший кусок (75-100 байт), он
identify
работает довольно быстро. Или напишите подпрограмму, например, в C, которая будет быстрее, чем вызовы библиотеки.JPEG:
Когда дело доходит до
jpg
этого не так просто. Он также начинается с заголовка подписи , но размер блока не с фиксированным смещением. После заголовка:появляется новый блок, указанный двухбайтовым маркером, начинающимся с
0xff
. Тот, который содержит информацию об измерениях, имеет значение,0xffc0
но может быть скрыт в данных.Другими словами, один пропускает байты размера блока , проверяет маркер, пропускает байты размера блока , читает маркер и так далее, пока не появится правильный.
Найденные размеры сохраняются по два байта каждый со смещением 3 и 5 после маркера .
Написал простую C-программу для проверки некоторых файлов и около 10.000 изображений в формате jpg, примерно 50% имели информацию о размере в первых 500 байтах, в основном 50% между ок. 100 и 200. Худшее было около 80.000 байтов. Картинка, как мы говорим, картинки:
GIF:
Хотя GIF обычно может иметь несколько изображений , хранящихся внутри, он имеет брезентовый размер , указанный в заголовке, это достаточно большая для размещения изображений. Это так же просто, как с PNG , и требует даже байтов лихорадки: 10. После магии и версии мы находим размеры. Пример из изображения 364x472:
Другими словами, вы можете проверить первые шесть байтов, чтобы увидеть, если это GIF, а затем прочитать следующие четыре для размеров.
Другие форматы:
Можно было бы продолжить, но, думаю, я остановлюсь здесь сейчас.
источник
Предполагается, что у вас есть «определить». Поместите это в сценарий и
chmod +x <scriptname>
. Для запуска наберите<scriptname> picture.jpg
и вы получите высоту и ширину изображения. Первые 2 раздела должны проверить, есть ли изображение, а затем установить его в качестве переменной IMAGE. Следующий раздел должен убедиться, что файл на самом деле там. Последние 2 раздела должны взять соответствующую информацию из «идентификатора» и отобразить ее.источник
file command
устанавливается по умолчанию на искажениях и зависит только от:Я думаю, что вы можете легко установить его для встроенных. Вы просто пишите
regular expression
для его вывода.источник
file
не дает размеры, например, для.jpg
файлов.Вы заменяете
file://
наhttp://
источник