johnfound
johnfound

Reputation: 7061

How to create PNG image with color_type=3 and bit_depth=1

The source is an RGBA PNG image (color_type=6 and bit_depth=8).

I need an image with indexed color and 2 palette items (color_type=3, bit_depth=1).

I tried with ImageMagick, but was able to reach only 1bit grayscale image (color_type=0, bit_depth=1) or 2bit indexed color image (color_type=3, bit_depth=2) in which only 2 colors are in use.

According to the PNG specification such image is possible, but how to create it?

Here is an image I am trying to convert:

enter image description here

The result of "convert input.png -type palette -depth 1 output.png":

enter image description here

The result of "convert input.png -type palette -depth 1 -colors 2 output.png"

enter image description here

Both results have bit_depth=2, but the second one uses only 2 colors of 4 possible.

Upvotes: 3

Views: 5223

Answers (3)

WinTakeAll
WinTakeAll

Reputation: 258

Use one of the following 3, ordered from least to most ancillary tags in the output file:

convert -colors 2 -define png:include-chunk=none -verbose input.png output.png

 

convert -colors 2 -define png:exclude-chunk=bkgd -verbose input.png output.png

 

convert -colors 2 -background #000000 -verbose input.png output.png

The root of this problem is that ImageMagick by default tags the image with a white background color (bKGD) PNG chunk (unnecessarily I'd say), and then adds this color to the palette if it's not already there, even if the image has no pixels of that color. Your particular image doesn't have white after converting to 2-color, so the unneeded background color tag becomes a 3rd color and it can no longer be saved as a 1-bit indexed color image. See also this from the author of IM.

The reason others have failed to reproduce the problem is probably that they've tested with images where one of the 2 colors happened to be white.

The 1st option with -define png:include-chunk=none avoids the problem by not outputting any ancillary PNG chunks at all (e.g. bKGD, gAMA, cHRM, tEXt, tIME). Like pngcrush -rem alla. I'd prefer this for a less cluttered file (without it IM will add a few of these even if they weren't in the input file). Note: There's also the simple -strip option which should avoid most of these, but as of v6.9.3 it won't cut bKGD due to a bug.

The 2nd with -define png:exclude-chunk=bkgd removes only the offending background chunk.

The 3rd option with -background #000000 retains all ancillary PNG chunks including bKGD but sets it black, one of the 2 colors present in your image, so it can still be 1-bit. Adjust the color for an image with neither white nor black in it.

Note that for all these I'm including the -verbose switch. Not overly verbose; just goes from zero to two lines of status output where you'll notice a "2c" if the image stayed 2-color or a "3c" if not. It will also tell you if the palette reduction was lossy or not. It also outputs "8-bit sRGB" for most images, even paletted ones with fewer than 8 bits-per-pixel; that's not a bug as in your comment to another answer @johnfound, this refers not to the bits-per-pixel but to the bits-per-color component. It can be more than 8-bit for (rare) deep color images.

Upvotes: 3

leonbloy
leonbloy

Reputation: 75926

convert input.png -background white -type palette -depth 1 -colors 2 output.png

works for me.

(Why -depth=1 is not enough? No idea.)

BTW, the tweakpng tool is useful for checking this kind of things.

Update: if the images have transparency, you might play safer by removing it explicitly:

convert input.png -background white -flatten -type palette -depth 1 -colors 2 output.png

(You can replace white for your preference)

Upvotes: 2

Mark Setchell
Mark Setchell

Reputation: 207485

I think the command you need is this:

convert input.png -type palette -depth 1 output.png

If not, please post your input image and say how/where you find the color_type and bit_depth fields you refer to.

Exiftool tells me this:

ExifTool Version Number         : 9.76
File Name                       : output.png
Directory                       : .
File Size                       : 2.3 kB
File Modification Date/Time     : 2015:01:10 19:20:33+00:00
File Access Date/Time           : 2015:01:10 19:21:46+00:00
File Inode Change Date/Time     : 2015:01:10 19:20:33+00:00
File Permissions                : rw-r--r--
File Type                       : PNG
MIME Type                       : image/png
Image Width                     : 640
Image Height                    : 427
Bit Depth                       : 1
Color Type                      : Grayscale
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
Gamma                           : 2.2
Background Color                : 1
Datecreate                      : 2015-01-10T10:21:30+00:00
Datemodify                      : 2015-01-10T10:21:30+00:00
Image Size                      : 640x427

ImageMagick identify tells me this:

Image: output.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: PseudoClass
  Geometry: 640x427+0+0
  Units: Undefined
  Type: Bilevel
  Base type: Bilevel
  Endianess: Undefined
  Colorspace: Gray
  Depth: 8/1-bit
  Channel depth:
    gray: 1-bit
  Channel statistics:
    Pixels: 273280
    Gray:
      min: 0 (0)
      max: 255 (1)
      mean: 1.90168 (0.00745755)
      standard deviation: 21.9388 (0.0860345)
      kurtosis: 129.1
      skewness: 11.4499
  Colors: 2
  Histogram:
    271242: (  0,  0,  0) #000000 gray(0)
      2038: (255,255,255) #FFFFFF gray(255)
  Colormap entries: 2
  Colormap:
         0: (  0,  0,  0) #000000 gray(0)
         1: (255,255,255) #FFFFFF gray(255)
  Rendering intent: Undefined
  Gamma: 0.45455
  Background color: gray(255)
  Border color: gray(223)
  Matte color: gray(189)
  Transparent color: gray(0)
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 640x427+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2015-01-10T19:20:33+00:00
    date:modify: 2015-01-10T19:20:33+00:00
    png:bKGD: chunk was found (see Background color, above)
    png:gAMA: gamma=0.45455 (See Gamma, above)
    png:IHDR.bit-depth-orig: 1
    png:IHDR.bit_depth: 1
    png:IHDR.color-type-orig: 0
    png:IHDR.color_type: 0 (Grayscale)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 640, 427
    png:text: 2 tEXt/zTXt/iTXt chunks were found
    signature: 3e08d7fea7bc7aeb0659ac2e2696084083d35ce30b0e3075dc561ad94259eaec
  Artifacts:
    filename: output.png
    verbose: true
  Tainted: True
  Filesize: 2.33KB
  Number pixels: 273K
  Pixels per second: 27.33MB
  User time: 0.000u
  Elapsed time: 0:01.009
  Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-11-10 http://www.imagemagick.org

Upvotes: 0

Related Questions