3

I use Ubuntu. I have a large number of GIF images. How can one count how many pixels a GIF image has via command line?

3
  • 2
    Not worth a full answer, but ffprobe (part of the ffmpeg suite) includes the image width and height in the info it displays.  (It's mainly intended for audio and video, but handles a huge range of formats including still images.)
    – gidds
    Commented Jul 8 at 23:43
  • I'm interested to know what you want this number for? Are you aware that some frames of a GIF only update/overwrite a few pixels that have changed since the previous one, i.e. they are not complete? As such, the number of pixels is not really the height * width * numberOfFrames. Commented 2 days ago
  • @MarkSetchell because of the new pixel limit for gif on SE: meta.stackexchange.com/q/401421/178179; meta.stackexchange.com/q/399802/178179; meta.stackexchange.com/q/399756/178179 Commented 2 days ago

4 Answers 4

14

You can use imagemagick package. Command like this will print the dimensions (in pixels) of a image:

identify -format '%w %h' example.gif

And the result will be (example):

128 1024

And as suggested in comment to calculate the number of pixels you can use command like:

identify -format '%W %H * + ' example.gif | dc -e0 -f- -ep
4
  • 1
    ... or something like identify -format '%w %h * + ' example.gif | dc -e0 -f- -ep to do the arithmetic and handle multi-frame (animated) gifs Commented Jul 7 at 15:08
  • @steeldriver, for multiframe I am not sure it's required because AFAIK the frames have same dimention Commented Jul 7 at 15:34
  • 2
    TBH I just based it on the OP's solution - I guess one could do identify -format '%w * %h * %n\n' example.gif | head -n 1 | bc instead Commented Jul 7 at 17:43
  • 2
    ... fwiw I just tested with j7q3w.gif from the OP's answer and it looks like %w %h does vary by frame, but %W %H (which the imagemagick documentation refers to as the page or canvas geometry) are fixed. The first frame appears to have %w %h and %W %H equal, so either summing %W * %H with dc or calculating %w * %h * %n for the first frame (with head and bc) agree with the OP's 96738345 value. Commented Jul 7 at 23:12
2

I eventually used this Python script to get the number of pixels in a GIF image:

from PIL import Image
image_path = 'random.gif'
img = Image.open(image_path)
total_pixels = 0
frame_count = 0

# Iterate through each frame in the GIF
try:
    while True:
        img.seek(frame_count)
        width, height = img.size
        total_pixels += width * height
        frame_count += 1
except EOFError:
    pass

print(f'Number of pixels in {image_path}: {total_pixels:,} pixels')

Example on https://i.sstatic.net/j7q3w.gif:

Number of pixels in j7q3w.gif: 96,738,345 pixels
1

You can also just use the file command on some image types, it works for .GIF and .PNG:

    # file myimage.gif
    # myimage.gif: GIF image data, version 89a, 1295 x 264

Multiplying the width by height (those last two numbers) gives the pixel count.

This could be automated with a pipe through awk:

    # file myimage.gif | awk '{print $NF * $(NF-2)}'   
    # 341880

To run over a bunch of files:

    # find . -iname \*.gif | while read filename; do pixels=$( file "${filename}" | awk '{print $NF * $(NF-2)}' ); echo "${filename}: ${pixels} pixels"; done

EDIT: Incorporate @Romeo Ninov's comment.

1
  • 1
    When having space(s) in filename you can better use: awk '{print $NF * $(NF-2)}' Commented Jul 9 at 4:15
1

The final frame of an animated GIF can be addressed as animated.gif[-1] in ImageMagick. So you can get the width and height of the final frame using %W and %H and also the scene/frame number of that frame using %s - although this starts at zero. So the formula for total number of pixels is:

identify -format "%W * %H * (%s+1)\n" example.gif[-1] | bc
96738345

Or, maybe more simply with exiftool:

exiftool -p '$ImageWidth * $ImageHeight * $FrameCount' example.gif | bc
96738345

Another way... coalesce all the frames to their full size, convert to grey and a header-free stream of 1 byte/pixel, then count the bytes:

magick animated.gif -coalesce -depth 8 gray:- | wc -c
96738345

Another way... coalesce all the frames to their full size, append them all together and work out the product of width and height without calling any external utilities:

magick animated.gif -coalesce -append -format "%[fx:w*h]" -precision 10 info:
96738345

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .