用 alpha 通道缩小我的 png

shrink my png with alpha channel

首先,我不是图形程序员,我可能不知道我想做的事情的正确术语。我知道我想做什么,但我不知道怎么做。我将尝试描述我想要的内容,但请记住,我可能会错误地使用术语。也许有比我认为我需要做的更好的方法来做我想做的事。

我的主要目标是:我有一张大约 250000 字节的图片,我想缩小文件大小。

请注意,原始图片是全亮度的,但我使用了 gimp(可能不正确)使它具有褪色的外观。我认为它现在有一个 "alpha channel" 和一些不透明度百分比值。所以我认为图片在 rgb 通道中存储为全亮度,并且还有另一个 alpha 通道描述图片的 "fadedness"。图像应该淡化为 "white" - 它将放置在白色背景上,上面会有深色文本 - 但我认为我还没有在图像中存储最后一点信息(还)。

所以这就是我试图到达那里的方法:我认为如果我只在 rgb 通道中指定褪色图片的实际像素值并取消 alpha 通道,图片可能会更小。此外,总体上应该有更少的颜色,我可以使用彩色贴图,使图片更小。褪色的图片褪色到足以让文字在上面书写时清晰可见 - 即它已经褪色 - 因此颜色应该比全亮度版本少很多。

但是我不知道该怎么做,也不知道在文档中查找什么。我尝试了几个 "compression" 程序,得到的最佳压缩率约为 2.5%。显然我没有在正确的地方寻找,因为我认为它应该压缩到比那个小得多。

这是 imagemagick "identify -verbose" 输出:

bjb@rhino:~/work/mojatatu/admin/2015/web/foo/img/work$ identify -verbose ../orig/joanrobins-penguins-snow-banner-faded.png
图片:../orig/joanrobins-penguins-snow-banner-faded.png
  格式:PNG(便携式网络图形)
  Class:直接Class
  几何:799x152+0+0
  分辨率:137.8x137.8
  打印尺寸:5.79826x1.10305
  单位:像素每厘米
  类型:TrueColorAlpha
  字节序:未定义
  色彩空间:sRGB
  深度:8 位
  渠道深度:
    红色:8 位
    绿色:8 位
    蓝色:8 位
    阿尔法:8 位
  渠道统计:
    红色的:
      分钟:0 (0)
      最大值:255 (1)
      均值:145.053 (0.568837)
      标准差:51.0466 (0.200183)
      峰度:0.897068
      偏度:-1.18367
    绿色的:
      分钟:0 (0)
      最大值:253 (0.992157)
      均值:152.236 (0.597003)
      标准差:53.6199 (0.210274)
      峰度:0.941151
      偏度:-1.2307
    蓝色的:
      分钟:0 (0)
      最大值:251 (0.984314)
      均值:164.608 (0.645521)
      标准偏差:56.552 (0.221772)
      峰度:1.13143
      偏度:-1.37866
    Α:
      最小值:84 (0.329412)
      最大值:84 (0.329412)
      均值:84 (0.329412)
      标准差:0 (0)
      峰态:0
      偏度:0
  图像统计:
    全面的:
      分钟:0 (0)
      最大值:255 (1)
      均值:158.224 (0.620487)
      标准差:46.5805 (0.182669)
      峰度:2.94443
      偏度:-1.70687
  渲染意图:感知
  伽马:0.454545
  色度:
    红色初级:(0.64,0.33)
    绿色初级:(0.3,0.6)
    蓝色初级:(0.15,0.06)
    白点:(0.3127,0.329)
  隔行扫描:None
  底色:白色
  边框颜色:srgba(223,223,223,1)
  哑光色:grey74
  透明色:none
  撰写:结束
  页面几何尺寸:799x152+0+0
  处置:未定义
  迭代次数:0
  压缩:邮编
  方向:未定义
  特性:
    date:create: 2015-03-21T19:32:58-04:00
    date:modify: 2015-03-21T19:32:58-04:00
    png:bKGD : 找到块(见上面的背景颜色)
    png:cHRM :找到块(参见上面的色度)
    png:gAMA : gamma=0.45454544(参见上面的 Gamma)
    png:IHDR.bit_depth : 8
    png:IHDR.color_type : 6 (RGBA)
    png:IHDR.interlace_method: 0(非交错)
    png:IHDR.宽度,高度: 799, 152
    png:pHYs : x_res=13780, y_res=13780, 单位=1
    png:sRGB : intent=0(见渲染意图)
    签名:6ceec80b4c3c05a631de400d74928ca4cb86bd9f304676ecd4a475b874a71cfc
  神器:
    文件名:../orig/joanrobins-penguins-snow-banner-faded.png
    详细:真实
  被污染:错误
  文件大小:248KB
  像素数:121K
  每秒像素数:0B
  用户时间:0.000u
  经过时间:0:01.000
  版本:ImageMagick 6.7.7-10 2014-03-08 Q16 http://www.imagemagick.org

我查看了一些 ImageMagick 文档并尝试了以下大部分工具(我还不得不缩小 .jpg 并发现 jpegoptim 效果很好)。

  Setting up advancecomp (1.15-1) ...       advpng -z4 file.png.  didn't see any compression
  Setting up jpegoptim (1.2.3-2+b2) ...     two thumbs up - easy and effective
  Setting up optipng (0.6.4-1) ...
  Setting up pngcrush (1.7.9-1) ...
  Setting up pngnq (1.0-2) ...
  Setting up pngquant (1.0-4.1) ...
  Setting up trimage (1.0.5-1) ...


  imagemagic convert

  convert
    -clut (apply a color lookup table to the image)
    -hald-clut
    -unique-colors
    -quantize colorspace  <- reduce colors in this colorspace
    -posterize levels  <- reduce  the image to a limited number of color levels
    -modulate value  <- vary the brightness, saturation, and hue
    -layers method       optimize or compare image layers
    -fuzz distance       colors within this distance are considered equal

    -depth value         image depth


    -alpha remove
  on, activate, off, deactivate, set, opaque, copy", transparent, extract, background, or shape the alpha channel
    -background  white


    - colors value   preferred number of colors in the image
    - colorspace type   set image colorspace

我也试过将图片转换为 jpg 然后再转换回 png,希望它能做我想做的,但是它将全亮度版本保存为 jpg 并再次保存为 png,可能丢失了 alpha频道信息。

pngcrush -brute 尝试了 100 多种压缩技术并选择了最好的一种,即提供大约 2.5% 最佳压缩率的一种。但是,考虑到我完全愿意丢失信息(对保留原始亮度信息不感兴趣),这张图片肯定可以压缩得更多?

不太确定您真正想要什么,但也许这会让您朝着正确的方向前进。如果你想要一个“褪色的外观”,你通常可以通过降低图像的对比度来实现——这样黑色变得比黑色更灰,白色变得比白色更灰,或者通过降低饱和度来降低颜色强度,使图片不那么鲜艳或更倾向于黑白。

因此,您可以执行以下操作以放弃 alpha 通道(透明度)并降低对比度并减少图像中的颜色数量。文件大小从 250kB 下降到 62kB - 但它可能不是你想要的...

convert yourPengy.png -alpha off +level 65%,95% -colors 256 myPengy.png

或者这可能更接近您想要的,饱和度降低到 80%,为 62kB

convert yourPengy.png -alpha off -modulate 100,80 +level 55%,95% -colors 256 myPengy.png

要在 png bKGD 块的白色背景下合成透明图像,使用您创建的 alpha 通道,您可以这样做

convert rgba.png -flatten -alpha off rgb-flattened.png

然后优化压缩并删除一些辅助块 ImageMagick 插入,

pngcrush -reduce -brute -rem alla rgb-flattened.png rgb.png

请注意选项“-alpha off”和“-flatten”的顺序很重要。 如果您先关闭“-alpha”,则在展平过程中不会使用 alpha 通道,您最终会得到原始的未褪色图像。

编辑:为了进一步优化,使用 -colors 255 将图像从 RGBA-PNG 减少为索引 PNG:

convert rgba.png -flatten -alpha off -colors 255 indexed-flattened.png
pngcrush -reduce -brute -rem alla indexed-flattened.png indexed.png