代码之家  ›  专栏  ›  技术社区  ›  haxti

将多个PNG转换为BMP,从标准输入到标准输出

  •  0
  • haxti  · 技术社区  · 7 年前

    我需要 和他们一起工作,我也需要这样做 通过管道

    Chrome设置为只将图像投影到stdout,这很好,但我似乎无法让imagemagick转换工具完成我需要的任务。

    cat foo.png | convert PNG:- BMP:-
    

    似乎适用于一个输入图像(输出以“BM”开头,表示BMP二进制垃圾),

    cat foo.png bar.png | convert PNG:- BMP:-
    

    也只返回一个图像,这似乎是第一个图像。

    如何将通过stdin读取的每个文件的输出转换为“覆盖”?


    chrome-headless | *solution* | bmpreader
    

    正如fmw42和Mark指出的那样,这似乎不可能用现成的imagemagick实现。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Mark Setchell    7 年前

    ImageMagick

    “分块” Wikipedia PNG Specification ,每个块都有一个类型,例如 IHDR (标题), PLTE (调色板), IDAT (图像数据), IEND (文件结束标记)以及关键的长度(以字节为单位)。

    IEND公司 ImageMagick GD公司 枕头 正在阅读并让 ImageMagick 转换文件。然后将累积的(PNG)字符串归零,并开始读取下一个文件。

    chrome-cast | demultiplex
    

    哪里 demultiplex 可能是:

    while not error
       clear accumulated string of PNG data
       done = false
       while not done
          read chunk type and length of chunk
          read whole chunk and append to accumulated string of PNG data
          if chunk = IEND
             pass accumulated PNG string to ImageMagick to make BMP
             done = true
          endif
       end
    end
    

    “理解” 所有区块类型或其内容-只需识别区块长度和 IEND公司


    请注意,您可能喜欢跑步 pngcheck pngsplit here . 事实上 PNG分裂 无论如何,我可以做你想做的事。

    下面是一个示例 PNG检查 实际操作:

    pngcheck -v file.png
    
    File: file.png (462308 bytes)
      chunk IHDR at offset 0x0000c, length 13
        800 x 468 image, 32-bit RGB+alpha, non-interlaced
      chunk gAMA at offset 0x00025, length 4: 0.45455
      chunk cHRM at offset 0x00035, length 32
        White x = 0.3127 y = 0.329,  Red x = 0.64 y = 0.33
        Green x = 0.3 y = 0.6,  Blue x = 0.15 y = 0.06
      chunk bKGD at offset 0x00061, length 6
        red = 0x00ff, green = 0x00ff, blue = 0x00ff
      chunk pHYs at offset 0x00073, length 9: 3779x3779 pixels/meter (96 dpi)
      chunk tIME at offset 0x00088, length 7:  2 Oct 2017 21:34:26 UTC
      chunk IDAT at offset 0x0009b, length 32768
        zlib: deflated, 32K window, maximum compression
      chunk IDAT at offset 0x080a7, length 32768
      chunk IDAT at offset 0x100b3, length 32768
      chunk IDAT at offset 0x180bf, length 32768
      chunk IDAT at offset 0x200cb, length 32768
      chunk IDAT at offset 0x280d7, length 32768
      chunk IDAT at offset 0x300e3, length 32768
      chunk IDAT at offset 0x380ef, length 32768
      chunk IDAT at offset 0x400fb, length 32768
      chunk IDAT at offset 0x48107, length 32768
      chunk IDAT at offset 0x50113, length 32768
      chunk IDAT at offset 0x5811f, length 32768
      chunk IDAT at offset 0x6012b, length 32768
      chunk IDAT at offset 0x68137, length 32768
      chunk IDAT at offset 0x70143, length 3115
      chunk tEXt at offset 0x70d7a, length 37, keyword: date:create
      chunk tEXt at offset 0x70dab, length 37, keyword: date:modify
      chunk IEND at offset 0x70ddc, length 0
    No errors detected in file.png (24 chunks, 69.1% compression).
    

    我在Perl中完成了PNG分块的基本版本,以获得另一个答案,请快速查看 here

        2
  •  0
  •   fmw42    7 年前

    我不认为你可以做到这一点与管道有多个图像在同一时间。您可以在每个png图像上循环并使用管道。管道将保持图像显示png后缀,但实际上是bmp文件。但这似乎让我困惑。

    在Imagemagick中,如果您想将文件夹中的文件从一种格式转换为另一种格式,那么您应该只使用mogrify。假设您的图像位于folder1中,并希望将其保存到已经存在的folder2中。然后,您可以将目录更改为folder1,然后执行以下操作:

    mogrify -format bmp -path path2/folder2 *.png
    

    这将保留输入名称,但在转换为该后缀类型时更改后缀。

    convert image1.png image2.png ... imageN.png newimage.suffix
    

    但是,您可以在脚本循环中执行。但莫格里菲更容易。