【问题标题】:Convert 15-bit color space PNG image to text file将 15 位色彩空间 PNG 图像转换为文本文件
【发布时间】:2017-07-14 04:38:15
【问题描述】:

我不确定 imagemagick 是否能够做到这一点,或者我是否需要自己写一些东西;但我想将如下图所示的图像转换为文本文件,以便每行代表一个像素(从左到右,从上到下读取)并且每行有 15 位数据(R 为 5 位、G 和 B)。

例如,下面的图像将有 256x224 = 57,344 行 15 位。

imagemagick 有能力做到这一点吗?如果没有,还有其他资源吗?感谢任何帮助。

【问题讨论】:

    标签: imagemagick imagemagick-convert


    【解决方案1】:

    只需使用“.txt”输出格式:

    magick U4zI6.png U4zI6.txt
    

    这将为每一行提供更多信息,但您可以 使用“sed”等文本编辑器提取 RGB 值。

    $ head -6 U4Zi6.txt
    # ImageMagick pixel enumeration: 256,224,65535,srgb
    0,0: (28784,45232,53456)  #70B0D0  srgb(112,176,208)
    1,0: (28784,45232,53456)  #70B0D0  srgb(112,176,208)
    2,0: (28784,45232,53456)  #70B0D0  srgb(112,176,208)
    3,0: (28784,45232,53456)  #70B0D0  srgb(112,176,208)
    4,0: (28784,45232,53456)  #70B0D0  srgb(112,176,208)
    

    【讨论】:

    • 格伦,出于好奇,当我运行“magick U4zI6.png -depth 5 U4zI6d5.txt”时,我得到了 srgb(115,173,206),而我原本预计第一行是 srgb(14, 21,25)...我是否给出了错误的论点?我在 Excel 中做了自己的 8 位到 5 位转换器来处理位深度,但很好奇 Imagemagick 是否可以保存该步骤。
    • srgb 强度在 0:255 范围内(第一个三元组在 0:65535 范围内)。不,IM 没有内部 8 到 5 位转换器。如果您在此网站上搜索 RGB555 和 RGB565,您会发现许多相关问题。
    【解决方案2】:

    这应该做你想做的:

    convert U4zI6.png -depth 8 rgb: | perl -e '
          # Read file, 3 RGB bytes at a time
          {
             local $/ = \3;
             while(my $pixel=<STDIN>){
                my ($r,$g,$b) = unpack("CCC",$pixel);
                printf("In R/G/B: %d/%d/%d\n",$r,$g,$b);
                my $r = ($r >> 3) & 63;
                my $g = ($g >> 3) & 63;
                my $b = ($b >> 3) & 63;
                printf("Out R/G/B: %d/%d/%d\n",$r,$g,$b);
             }
          }
       '
    

    【讨论】:

    • 使用“my $r = (($r+4) >> 3) & 63;”等可以获得更准确的结果。实际上,这一轮而不是仅仅切碎组件。
    • @GlennRanders-Pehrson 感谢您一如既往的顶级建议。
    猜你喜欢
    • 2020-09-09
    • 2013-10-12
    • 2015-05-02
    • 1970-01-01
    • 2014-11-28
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多