perintah shell untuk mendapatkan ukuran piksel suatu gambar

43

Apakah ada perintah shell yang mengembalikan ukuran piksel suatu gambar?

Saya mencoba membuat gif animasi mulai dari gif berbeda dengan ukuran berbeda menggunakan convert(misalnya convert -delay 50 1.gif 2.gif -loop 0 animated.gif).

Masalahnya adalah bahwa konversi hanya tumpang tindih gambar menggunakan ukuran gambar pertama sebagai ukuran animasi gif, dan karena mereka memiliki ukuran yang berbeda hasilnya sedikit berantakan, dengan bit dari frame lama ditampilkan di bawah yang baru.

biru
sumber
Apa itu "ukuran piksel"? Bit per piksel (kedalaman) atau jumlah piksel?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

50

menemukan solusi identify:, bagian dari paket imagemagick, melakukan apa yang saya butuhkan

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000
biru
sumber
Bisakah Anda menjelaskan mengapa saya mendapat beberapa baris ketika saya menjalankan identify imagename.ico? Like todour.ico[0] ICO 32x32 32x32+0+0 4-bit sRGB 0.000u 0:00.000 todour.ico[1] ICO 16x16 16x16+0+0 4-bit sRGB 0.000u 0:00.000 todour.ico[2] ICO 48x48 48x48+0+0 8-bit sRGB 0.000u 0:00.000
roachsinai
44

Daripada mem-parsing output identifydengan mata, atau dengan utilitas teks, Anda dapat menggunakan -formatopsi untuk menampilkan lebar dan tinggi dalam format apa pun yang paling cocok untuk Anda. Sebagai contoh:

$ identify -format '%w %h' img.png
100 200
$ identify -format '%wx%h' img.png
100x200

Sebuah daftar properti gambar yang Anda dapat output yang dapat ditemukan di halaman ini , tapi untuk pertanyaan di sini, tampaknya semua yang Anda butuhkan adalah %wdan %h, yang memberikan lebar dan tinggi gambar itu, masing-masing, dalam piksel.


Fleksibilitas yang diberikan oleh -formatsaya sangat berguna bagi saya dalam menemukan gambar terbesar dalam hal piksel, dengan menghasilkan %[fx:w*h]sejumlah gambar dan menyortir hasilnya.

Anda mungkin ingin menentukan -pingopsi jika Anda memproses banyak gambar, menggunakan pelarian yang lebih rumit, dan ingin memastikan program tidak membuang waktu memuat seluruh gambar. Dengan lolos sederhana, -pingharus menjadi default. Informasi lebih lanjut tentang pilihan antara -pingdan +pingdapat ditemukan di sini .

Dan Getz
sumber
15

Anda cukup menggunakan perintah "file" untuk mendapatkan informasi yang Anda butuhkan:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
Pascal Schmiel
sumber
1
Ini TIDAK melaporkan ukuran untuk jenis gambar (non-png) lainnya ... file taylor-swift-money-makers-990.jpg->taylor-swift-money-makers-990.jpg: JPEG image data, JFIF standard 1.01, comment: "CREATOR: gd-jpeg v1.0 (using IJ"
alex grey
Tidak benar, setidaknya di bawah versi macOS terbaru.
rien333
5

Gunakan identifyuntuk melihat ukuran:

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000

Ekstrak nilai melalui cut | sed, dari bidang 3:

identify ./color.jpg | cut -f 3 -d " " | sed s/x.*// #width
identify ./color.jpg | cut -f 3 -d " " | sed s/.*x// #height

Tetapkan ke variabel:

W=`identify ./color.jpg | cut -f 3 -d " " | sed s/x.*//` #width
H=`identify ./color.jpg | cut -f 3 -d " " | sed s/.*x//` #height
echo $W
> 1980
echo $H
> 650
Hugolpz
sumber
2

Keduanya displaydan filesangat lambat, dan memiliki potensi untuk membawa bahkan sistem yang cukup mampu berlutut berurusan dengan banyak file. Tes kecil:

     $ du -h *.png --total | tail -n 1
     9.2M    total

     $ ls -l *.png | wc -l
     107

     $ /usr/bin/time file *.png
-->  0.37user 0.26system 0:06.93elapsed 9%CPU (0avgtext+0avgdata 37232maxresident)k
     22624inputs+0outputs (9major+2883minor)pagefaults 0swaps

     $ /usr/bin/time identify *.png
-->  0.56user 0.22system 0:06.77elapsed 11%CPU (0avgtext+0avgdata 25648maxresident)k
     34256inputs+0outputs (119major+2115minor)pagefaults 0swaps

Dengan hanya membaca byte yang diperlukan, operasi ini dapat dipercepat secara signifikan.

     $ /usr/bin/time ./pngsize *.png
-->  0.00user 0.00system 0:00.03elapsed 12%CPU (0avgtext+0avgdata 1904maxresident)k
     0inputs+0outputs (0major+160minor)pagefaults 0swaps

Ini adalah pngsize:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <err.h>
#define oops(syscall) { printf("error processing %s: ", argv[i]); \
        fflush(0); perror(syscall"()"); continue; }
int main(int argc, char **argv) {
    int fd, i;
    uint32_t h, w;
    if (argc < 2) { printf("%s <pngfile> [pngfile ...]\n", argv[0]); exit(0); }
    for (i = 1; i < argc; i++) {
        if (argc > 2) printf("%s: ", argv[i]);
        if ((fd = open(argv[i], O_RDONLY)) == -1) oops("open");
        if (lseek(fd, 16, SEEK_SET) == -1) oops("lseek");
        if (read(fd, &w, 4) < 1) oops("read");
        if (read(fd, &h, 4) < 1) oops("read");
        printf("%dx%d\n", htonl(w), htonl(h));
        if (close(fd) == -1) oops("close");
    }
    return 0;
}

Metode ini jauh lebih cepat daripada menggunakan perpustakaan yang memuat PNG ke depan, ke belakang dan ke samping hanya untuk mendapatkan ukuran gambar: P (Pertimbangkan kode dengan hati-hati sebelum memberi makan itu direktori yang penuh dengan PNG sewenang-wenang tentu saja.)

Menggunakan kode inet.h untuk htonl () ke de- endian -ize header byte pemesanan.

i336_
sumber
0

Anda juga dapat mencoba GraphicsMagick , yang merupakan fork ImageMagick yang digunakan pada misalnya Flickr dan Etsy:

$ gm identify a.jpg
a.jpg JPEG 480x309+0+0 DirectClass 8-bit 25.2K 0.000u 0:01

Ini lebih cepat daripada identifikasi ImageMagick (dalam tes saya sekitar dua kali).

Jerry Epas
sumber
0

Ini adalah cuplikan bermanfaat (saya tidak menulis) yang mengembalikan dimensi untuk setiap png dan jpg di folder:

file ./* | perl -ne '@m = /^.*.jpg|^.*.png|[0-9][0-9]*[ ]?x[ ]?[0-9][0-9]*/g; print "@m\n"'
ArleyM
sumber
0

Bagi yang menyukai saya yang menginginkan ukuran dalam megapiksel:

perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
SebMa
sumber