Bạn có thể sử dụng curl
để tải về các phần của hình ảnh. Tất cả phụ thuộc vào mức độ mạnh mẽ của nó. Một trường hợp thử nghiệm có thể là 500 byte đầu tiên. Có vẻ như để làm việc cho rất nhiều png
và jpg
, sau đó sử dụng identify
hoặc muốn kiểm tra kích thước.
curl -o 500-peek -r0-500 "http://example.net/some-image.png"
Biên tập:
Lâu rồi tôi mới viết trình phân tích cú pháp hình ảnh, nhưng đã suy nghĩ và làm mới một số ký ức của tôi.
Tôi nghi ngờ rằng đó là tất cả các loại hình ảnh bạn muốn kiểm tra (nhưng sau đó một lần nữa, có lẽ không). Tôi sẽ mô tả một số những cái phổ biến hơn : PNG
, JPEG
(JFIF) và GIF
.
PNG:
Đây là đơn giản khi khai thác kích thước. Một png
tiêu đề lưu trữ kích thước trong 24 byte đầu tiên. Đầu tiên là một tiêu đề cố định:
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.
Tiếp đến khối trough ra các tập tin. Chúng bao gồm một trường cố định về chiều dài, loại và tổng kiểm tra. Ngoài ra một phần dữ liệu tùy chọn kích thước chiều dài .
May mắn thay, đoạn đầu tiên luôn luôn là IHDR
với bố cục này:
byte description
0-3 Image Width
4-7 Image Height
8 Bits per sample or per palette index
... ...
Bằng cách này, chúng ta có các kích thước đó là byte 16-20 và 21-24. Bạn có thể kết xuất dữ liệu bằng cách ví dụ 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
Trên máy Big Endian / Motorola, người ta cũng có thể in các kích thước trực tiếp bằng cách:
hexdump -s16 -n8 -e '1/4 "%u" "\n"' sample.png
Tuy nhiên, trên Little Endian / Intel, nó không phải là dễ dàng, và nó cũng không phải là rất di động.
Bằng cách này, chúng ta có thể triển khai tập lệnh bash + hexdump như trong:
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
Nhưng, điều này không trực tiếp hiệu quả. Mặc dù nó đòi hỏi một khối lớn hơn (75-100 byte), nhưng identify
khá nhanh hơn. Hoặc viết thói quen trong ví dụ C, sẽ nhanh hơn các cuộc gọi thư viện.
JPEG:
Khi nói đến jpg
nó không phải là dễ dàng. Nó cũng bắt đầu với một tiêu đề chữ ký , nhưng phần kích thước không ở mức bù cố định. Sau tiêu đề:
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 ...
một khối mới đi kèm được chỉ định bởi một điểm đánh dấu hai byte bắt đầu bằng 0xff
. Thông tin lưu giữ về kích thước có giá trị 0xffc0
nhưng có thể bị chôn vùi khá nhiều dữ liệu.
Nói cách khác, bỏ qua các byte kích thước khối , kiểm tra điểm đánh dấu, bỏ qua các byte kích thước khối , đọc điểm đánh dấu, v.v. cho đến khi một byte chính xác xuất hiện.
Khi tìm thấy các kích thước được lưu trữ bởi hai byte ở mỗi độ lệch 3 và 5 sau điểm đánh dấu .
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.
Đã viết một chương trình C đơn giản để kiểm tra một số tệp và khoảng 10.000 hình ảnh jpg, khoảng 50% có thông tin kích thước trong 500 byte đầu tiên, chủ yếu là 50% giữa ca. 100 và 200. Tệ nhất là khoảng 80.000 byte. Một hình ảnh, như chúng ta nói chuyện hình ảnh:
QUÀ TẶNG:
Mặc dù gif thường có thể có nhiều hình ảnh được lưu trữ bên trong, nhưng nó có kích thước canvas được chỉ định trong tiêu đề, nhưng điều này đủ lớn để chứa hình ảnh. Nó dễ dàng như với PNG và yêu cầu các byte thậm chí gây sốt: 10. Sau phép thuật và phiên bản, chúng tôi tìm thấy kích thước. Ví dụ từ hình ảnh 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
Nói cách khác, bạn có thể kiểm tra sáu byte đầu tiên để xem đó có phải là gif không, sau đó đọc bốn byte tiếp theo để biết kích cỡ.
Các định dạng khác:
Có thể đã tiếp tục, nhưng đoán tôi dừng ở đây bây giờ.