Vous pouvez utiliser curl
pour télécharger des parties de l'image. Tout dépend de sa robustesse. Un cas de test pourrait être de 500 premiers octets. Semble travail pour beaucoup de png
et jpg
, puis utilisez identify
ou similaire pour vérifier la taille.
curl -o 500-peek -r0-500 "http://example.net/some-image.png"
Éditer:
Il y a longtemps que j'ai écrit des analyseurs d'images, mais j'ai réfléchi et rafraîchi une partie de ma mémoire.
Je soupçonne que ce sont toutes sortes d'images que vous souhaitez vérifier (mais encore une fois, peut-être pas). Je vais vous décrire quelques - unes des plus courantes: PNG
, JPEG
(JFIF) et GIF
.
PNG:
Celles-ci sont simples en matière d'extraction de taille. Un en- png
tête stocke la taille dans les 24 premiers octets. Vient d'abord un en-tête fixe:
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.
Viennent ensuite des morceaux à travers le fichier. Ils se composent d'un champ fixe de longueur, de type et de somme de contrôle. En outre, une section de données facultative de taille de longueur .
Heureusement, le premier morceau est toujours un IHDR
avec cette disposition:
byte description
0-3 Image Width
4-7 Image Height
8 Bits per sample or per palette index
... ...
Par cela, nous avons que les tailles sont octets 16-20 et 21-24. Vous pouvez vider les données par exemple 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
Sur une machine Big Endian / Motorola, on pourrait également imprimer les tailles directement en:
hexdump -s16 -n8 -e '1/4 "%u" "\n"' sample.png
Cependant, sur Little Endian / Intel, ce n'est pas si simple, et ce n'est pas très portable.
Par cela, nous pourrions implémenter un script bash + hexdump comme dans:
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
Mais ce n'est pas directement efficace. Bien qu'il nécessite un plus gros morceau (75-100 octets), il identify
est plutôt plus rapide. Ou écrivez la routine par exemple en C, ce qui serait plus rapide que les appels de bibliothèque.
JPEG:
En ce qui concerne jpg
ce n'est pas si simple. Il commence également par un en- tête de signature , mais le bloc de taille n'est pas à un décalage fixe. Après l'en-tête:
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 ...
un nouveau bloc vient spécifié par un marqueur de deux octets commençant par 0xff
. Celui qui contient des informations sur les dimensions a la valeur 0xffc0
mais peut être enterré un peu dans les données.
En d'autres termes, on saute les octets de taille de bloc , vérifie le marqueur, saute les octets de taille de bloc , lit le marqueur, et ainsi de suite jusqu'à ce que le bon arrive.
Lorsqu'elles sont trouvées, les tailles sont stockées sur deux octets chacune aux décalages 3 et 5 après le marqueur .
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.
A écrit un programme C simple pour vérifier certains fichiers et environ 10 000 images jpg, environ 50% avaient les informations de taille dans les 500 premiers octets, principalement 50% entre env. 100 et 200. Le pire était d'environ 80 000 octets. Une image, comme on parle d'images:
GIF:
Bien que gif puisse généralement avoir plusieurs images stockées, il a une taille de toile spécifiée dans l'en-tête, c'est assez grand pour héberger les images. C'est aussi simple qu'avec PNG , et nécessite même des octets de fièvre: 10. Après la magie et la version, nous trouvons des tailles. Exemple à partir d'une image 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
En d'autres termes, vous pouvez vérifier les six premiers octets pour voir s'il s'agit d'un gif, puis lire les quatre suivants pour les tailles.
Autres formats:
Aurait pu continuer, mais je suppose que je m'arrête ici pour l'instant.