Saya mencoba mencari metode yang sangat cepat dalam menentukan dimensi suatu gambar.
Saya tahu saya bisa membuat gambar dan kemudian menggunakan imagemagick untuk menentukan tinggi dan lebar gambar. Saya khawatir ini mungkin bukan cara tercepat untuk melakukannya.
Saya juga khawatir harus menginstal imagemagick ketika saya hanya membutuhkan sebagian kecil fungsi. Saya menggunakan sistem tertanam yang memiliki sumber daya sangat terbatas (CPU, RAM, penyimpanan).
Ada ide?
bash
wget
imagemagick
exvance
sumber
sumber
Jawaban:
Seperti yang Anda perhatikan, Anda tidak memerlukan seluruh paket ImageMagick . Anda hanya perlu
identify
.Anda juga akan membutuhkan pustaka untuk tautan yang dapat dieksekusi (dan pustaka yang ditautkan pustaka tersebut).
ldd
akan menampilkan daftar. Ketika saya melakukan ini, itu termasuk beberapa lib X, libjpeg, dll dan dua perpustakaan jelas dari paket ImageMagick,libMagickCore
danlibMagickWand
. Mereka tampaknya terkait dengan banyak hal yang sama, jadi jika Anda memilikinya, ituidentify
akan berhasil.Anda tidak perlu mengunduh seluruh gambar untuk mendapatkan dimensi, karena ini ada di header di awal file dan itulah yang
identify
terlihat. Sebagai contoh, di sini saya menyalin 4 kB pertama dari jpeg lengkap ke file baru:4 kB harus lebih dari cukup untuk memasukkan header - saya yakin Anda bisa melakukannya dengan 1/4 jumlah itu. Sekarang:
Itu adalah dimensi yang tepat untuk
real.jpg
. Perhatikan, bagaimanapun, bahwa ukuran (4.1KB) adalah ukuran file terpotong, karena informasi itu bukan dari header gambar.Jadi: Anda hanya perlu mengunduh kilobyte pertama atau lebih dari setiap gambar.
sumber
Anda dapat menggunakan
curl
untuk mengunduh bagian gambar. Itu semua tergantung pada seberapa kuat itu harus. Kasing uji bisa menjadi 500 byte pertama. Tampaknya bekerja banyakpng
danjpg
, kemudian gunakanidentify
atau sejenisnya untuk memeriksa ukuran.Edit:
Sudah lama sejak saya menulis parser gambar, tetapi memikirkannya dan menyegarkan ingatan saya.
Saya menduga itu semua jenis gambar yang ingin Anda periksa (tapi sekali lagi, mungkin tidak). Saya akan menjelaskan beberapa yang lebih umum:
PNG
,JPEG
(JFIF) danGIF
.PNG:
Ini sederhana dalam hal ekstraksi ukuran. Sebuah
png
sundulan menyimpan ukuran dalam 24 byte. Pertama datang tajuk tetap:Selanjutnya datang potongan melalui file. Mereka terdiri dari bidang tetap panjang, jenis dan checksum. Selain itu bagian data opsional ukuran panjang .
Untungnya potongan pertama selalu merupakan
IHDR
dengan tata letak ini:Dengan ini kita memiliki ukuran byte 16-20, dan 21-24. Anda dapat membuang data dengan misalnya hexdump:
Pada mesin Big Endian / Motorola orang juga dapat mencetak ukuran langsung dengan:
Namun, pada Little Endian / Intel, ini tidak mudah, dan juga tidak terlalu portabel.
Dengan ini kita bisa mengimplementasikan skrip bash + hexdump seperti pada:
Tapi, ini tidak efisien secara langsung. Meskipun membutuhkan potongan yang lebih besar (75-100 byte),
identify
ini agak lebih cepat. Atau tulis rutin dalam misal C, yang akan lebih cepat dari panggilan pustaka.JPEG:
Ketika sampai pada
jpg
hal itu tidaklah mudah. Itu juga dimulai dengan header tanda tangan , tetapi ukuran chunk tidak pada offset tetap. Setelah tajuk:blok baru datang ditentukan oleh penanda dua byte dimulai dengan
0xff
. Yang memegang informasi tentang dimensi memiliki nilai0xffc0
tetapi dapat dikuburkan di dalam data.Dengan kata lain, satu lewati byte ukuran blok , periksa marker, lewati byte ukuran blok , baca marker, dan seterusnya sampai yang benar muncul.
Ketika ditemukan ukuran disimpan oleh dua byte masing-masing pada offset 3 dan 5 setelah penanda .
Menulis program C sederhana untuk memeriksa beberapa file dan sekitar 10.000 gambar jpg, sekitar 50% memiliki informasi ukuran dalam 500 byte pertama, sebagian besar 50% antara ca. 100 dan 200. Yang terburuk adalah sekitar 80.000 byte. Gambar, seperti yang kita bicarakan gambar:
GIF:
Meskipun gif biasanya dapat menyimpan banyak gambar di dalamnya, ia memiliki ukuran kanvas yang ditentukan di header, ini cukup besar untuk menampung gambar. Ini semudah dengan PNG , dan bahkan memerlukan byte demam: 10. Setelah sihir dan versi kita menemukan ukuran. Contoh dari gambar 364x472:
Dengan kata lain Anda dapat memeriksa enam byte pertama untuk melihat apakah itu gif, lalu baca empat byte berikutnya untuk ukuran.
Format lain:
Bisa saja terus, tetapi saya kira saya berhenti di sini untuk saat ini.
sumber
Asumsikan Anda telah "mengidentifikasi". Masukkan ini ke dalam skrip dan
chmod +x <scriptname>
. Untuk menjalankannya ketik<scriptname> picture.jpg
dan Anda akan mendapatkan tinggi dan lebar gambar. 2 bagian pertama adalah untuk memeriksa apakah ada gambar kemudian mengaturnya sebagai variabel IMAGE. Bagian selanjutnya adalah memastikan file tersebut benar-benar ada. 2 bagian terakhir adalah untuk mengambil informasi yang relevan dari output 'identifikasi' dan menampilkannya.sumber
file command
diinstal secara default pada distors dan hanya bergantung pada:Saya pikir Anda dapat menginstalnya dengan mudah untuk disematkan. Anda hanya menulis
regular expression
untuk hasilnya.sumber
file
tidak memberikan dimensi untuk, misalnya,.jpg
file.Anda ganti
file://
denganhttp://
sumber