Bash: Самый Быстрый способ определить размеры изображения от URL

Во-первых, отключите пароль, с помощью passwd -l username.

Также отметьте в man страница для passwd для опции -l:

   -l, --lock
       Lock the password of the named account. This option disables a password by changing it to a value which matches no
       possible encrypted value (it adds a ´!´ at the beginning of the password).

       Note that this does not disable the account. The user may still be able to login using another authentication token
       (e.g. an SSH key). To disable the account, administrators should use usermod --expiredate 1 (this set the account's
       expire date to Jan 2, 1970).

       Users with a locked password are not allowed to change their password.
8
15.10.2013, 20:12
5 ответов

Как Вы отмечаете, Вам не нужен целый пакет ImageMagick. Вам просто нужно identify.

Вам также будут нужны библиотеки исполняемые ссылки на (и библиотеки, которые те библиотеки связывают с).

> whereis identify
identify: /bin/identify /usr/bin/identify /usr/share/man/man1/identify.1.gz
> ldd /bin/identify

ldd покажет список. Когда я сделал это, это включало, приблизительно X освобождают, libjpeg, и т.д. и две библиотеки ясно от пакета ImageMagick, libMagickCore и libMagickWand. Они надеются быть связанными с тем же набором вещей, поэтому если у Вас есть это, identify должен работать.

Вы не должны загружать все изображение для получения размеров, потому что они находятся в заголовке в начале файла, и это что identify взгляды на. Например, здесь я копирую первых 4 КБ с полного jpeg в новый файл:

dd if=real.jpg of=test.jpg bs=1024 count=4

4 КБ должно быть более чем достаточно для включения заголовка - я уверен, что Вы могли сделать это с 1/4 та сумма. Теперь:

>identify test.jpg 
test.jpg JPEG 893x558 893x558+0+0 8-bit DirectClass 4.1KB 0.000u 0:00.000

Это - корректные размеры для real.jpg. Заметьте, однако, что размер (4.1 КБ) является размером усеченного файла, так как та информация не от заголовка изображения.

Так: только необходимо загрузить первый килобайт или так каждого изображения.

13
27.01.2020, 20:08

Предполагает, что Вы имеете, "определяют". Поместите это в сценарий и chmod +x <scriptname>. Выполнять его тип <scriptname> picture.jpg и Вы получите высоту и ширину изображения. Первые 2 раздела должны проверить, существует ли изображение, затем устанавливает его как переменную ИЗОБРАЖЕНИЯ. Следующий раздел должен удостовериться, что файл на самом деле там. Последние 2 раздела должны взять релевантную информацию от 'определить' вывода и отобразить его.

#!/bin/bash
if [[ "${#}" -ne "1" ]]
then
die "Usage: $0 <image>"
fi

IMAGE="${1}"

if [[ ! -f "${IMAGE}" ]]
then
die "File not found: ${IMAGE}"
fi

IMG_CHARS=`identify "$1" | cut -f 3 -d' '`
WIDTH=`echo $IMG_CHARS | cut -d'x' -f 1`
HEIGHT=`echo $IMG_CHARS | cut -d'x' -f 2`

echo -e "W: ${WIDTH} H: ${HEIGHT}"
1
27.01.2020, 20:08
  • 1
    хороший сценарий. однако, было бы хорошо, если Вы могли бы объяснить, что это делает (так как Exchange Стека об изучении). большое спасибо –  strugee 15.10.2013, 21:35

Можно использовать curl загружать части изображения. Все это зависит от того, насколько устойчивый это должно быть. Тестовый сценарий мог составить первые 500 байтов. Кажется, работает на большое количество из png и jpg, затем используйте identifyи т.п. проверять размер.

curl -o 500-peek -r0-500 "http://example.net/some-image.png"

Править:


Долгое время, так как я записал синтаксические анализаторы изображения, но уделил ему некоторое внимание и обновило часть моей памяти.

Я подозреваю, что это - весь вид изображений, которые Вы хотите проверить (но с другой стороны, возможно, не). Я опишу некоторые более общие: PNG, JPEG (JFIF) и GIF.


PNG:

Они просты когда дело доходит до извлечения размера. A png заголовок хранит размер в первых 24 байтах. Сначала прибывает фиксированный заголовок:

byte  value  description
   0  0x89   Bit-check. 0x89 has bit 7 set.
 1-3  PNG    The letters P,N and G
 4-5  \r\n   Newline check.
   6    ^z   MS-DOS won't print data beyond this using `print`
   7    \n   *nix newline.

Затем прибывает канавка блоков файл. Они состоят из фиксированного поля длины, типа и контрольной суммы. Кроме того, раздел дополнительных данных размера длины.

К счастью первый блок всегда IHDR с этим расположением:

byte  description
0-3   Image Width
4-7   Image Height
  8   Bits per sample or per palette index
...   ...

Этим у нас есть это, размеры являются байтом 16-20, и 21-24. Можно вывести данные, например, hexdump:

hexdump -vn29 -e '"Bit-test: " /1 "%02x" "\n" "Magic   : " 3/1 "%_c" "\n" "DOS-EOL : " 2/1 "%02x" "\n" "DOS-EOF : " /1 "%02x" "\n" "NIX-EOL : " /1 "%02x" "\n" "Chunk Size: " 4/1 "%02u" "\n" "Chunk-type: " 4/1 "%_c" "\n" "Img-Width : " 4/1 "%02x" "\n" "Img-Height: " 4/1 "%02x" "\n" /1 "Depth : %u bit" "\n" /1 "Color : %u" "\n" /1 "Compr.: %u" "\n" /1 "Filter: %u" "\n" /1 "Interl: %u" "\n"' sample.png

На Обратном порядке байтов / машина Motorola можно было также распечатать размеры непосредственно:

hexdump -s16 -n8 -e '1/4 "%u" "\n"' sample.png

Однако на Прямом порядке байтов / Intel, не то, чтобы легкий, и это, ни очень портативно.

Этим, которое это, мы могли реализовать удар + hexdump сценарий как в:

png_hex='16/1 "%02x" " " 4/1 "%02x" " " 4/1 "%02x" "\n"'
png_valid="89504e470d0a1a0a0000000d49484452"

function png_wh()
{
    read -r chunk1 img_w img_h<<<$(hexdump -vn24 -e "$png_hex" "$1")
    if [[ "$chunk1" != "$png_valid" ]]; then
        printf "Not valid PNG: \`%s'\n" "$1" >&2
        return 1
    fi
    printf "%10ux%-10u\t%s\n" "0x$img_w" "0x$img_h" "$1"
    return 0
}

if [[ "$1" == "-v" ]]; then verbose=1; shift; fi

while [[ "$1" ]]; do png_wh "$1"; shift; done

Но, это не непосредственно эффективно. Хотя это требует большего блока (75-100 байтов), identify скорее быстрее. Или запишите стандартную программу в, например, C, который был бы быстрее затем вызовы библиотеки.


JPEG:

Когда дело доходит до jpg это не настолько легко. Это также начинается с заголовком подписи, но блок размера не при фиксированном смещении. После заголовка:

 byte  value
 0-1   ffd8          SOI (Start Of Image)
 2-3   ffe0          JFIF marker
 4-5   <block-size>  Size of this block including this number
 6-10  JFIF\0        ...
11-12  <version>
   13  ...

новый блок приходит указанный двухбайтовым маркером, запускающимся с 0xff. Одна содержащая информация о размерах имеет значение 0xffc0 но может быть проложен под землей вполне немного вниз данные.

Другими словами, байты размера блока пропуска, проверьте маркер, пропустите байты размера блока, считайте маркер, и так далее пока корректный не придет.

При нахождении размеры хранятся на два байта каждый при смещении 3 и 5 после маркера.

 0-1   ffc0          SOF marker
 2-3   <block-size>  Size of this block including this number
   4   <bits>        Sample precision.
 5-6   <Y-size>      Height
 7-8   <X-size>      Width
   9   <components>  Three for color baseline, one for grayscale.

Записал простую программу C для проверки некоторых файлов и приблизительно 10 000 изображений jpg, непосредственно 50% имели информацию о размере в первых 500 байтах, главным образом 50% приблизительно между 100 и 200. Худшими составляли приблизительно 80 000 байтов. Изображение, поскольку мы говорим изображения:

JFIF_SOF_graph


GIF:

Хотя gif обычно можно было хранить повторные изображения в, ему указали размер холста в заголовке, это является достаточно большим для корпуса изображений. Это столь же легко как с PNG, и потребуйте даже байтов лихорадки: 10. После волшебства и версии мы находим размеры. Пример от 364x472 изображение:

<byte>  <hex>   <value>
  0-2   474946  GIF  Magic
  3-5   383961  89a  Version (87a or 89a)
  6-7   6c01    364  Logical Screen Width
  8-9   d801    472  Logical Screen Height

Другими словами, можно проверить первые шесть байтов, чтобы видеть, является ли это gif, затем считайте следующие четыре для размеров.


Другие форматы:

Возможно, продолжился, но предположение я останавливаюсь здесь на данный момент.

12
27.01.2020, 20:08
mohsen@debian:~/codes/amlak/amlak/src$ file ~/Screenshot\ from\ 2013-07-10\ 01\:25\:34.png 
/home/mohsen/Screenshot from 2013-07-10 01:25:34.png: PNG image data, 1366 x 768, 8-bit/color RGB, non-interlaced

file command установлен по умолчанию на дистрибутивах, и просто зависьте от:

Depends: libc6 (>= 2.4), libmagic1 (= 1:5.14-2), zlib1g (>= 1:1.1.4)

Я думаю, что можно установить его легко для встроенного. Вы просто пишете a regular expression для его вывода.

0
27.01.2020, 20:08
  • 1
    file не дает размеры для, например, .jpg файлы. –  goldilocks 15.10.2013, 20:24
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));"
Array
(
    [0] => 2560
    [1] => 1440
    [2] => 2
    [3] => width="2560" height="1440"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w
    [3] => width="2560" height="1440"
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w | awk {'print $3'}
width="2560"
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w | awk {'print $4'}
height="1440"

Вы заменяете file:// с http://

0
27.01.2020, 20:08
  • 1
    , я не уверен PHP, хорошо подходит для низкие встроенные системы ресурсов. Плюс это, кажется, выбирает целый файл. –  peterph 16.10.2013, 00:16
  • 2
    Это - php-cli не php модуль для апача, этому не нужно апачу. –  PersianGulf 16.10.2013, 00:28
  • 3
    Тем не менее это загрузит целый механизм PHP, который является пожирателем ресурсов памяти. Плюс разумная часть PHP должен был бы быть установлен, который мог бы быть проблемой для встроенной системы также (дисковое пространство могло бы быть ограничено). Для регулярной системы это могла бы быть опция, хотя необходимо будет изменить его для предотвращения выбирающего целого изображения (см. ответ Sukminder). –  peterph 16.10.2013, 00:48

Теги

Похожие вопросы