Graphics 从多个JPG生成通用调色板的图形程序

Graphics 从多个JPG生成通用调色板的图形程序,graphics,imagemagick,gimp,Graphics,Imagemagick,Gimp,gimp能够从加载的图像生成调色板。我希望所有图像(我不一定是这些图片的作者)共享一个通用调色板,因为这样可以更容易地在LCD屏幕上显示它们 有这样的程序吗?或者是gimp或imagemagick中的一些脚本?有几种方法可以做到这一点: 使用抖动 使用设计用于抖动的调色板,如默认VGA或WEB调色板。我是这样做的: convert palette.png txt: # ImageMagick pixel enumeration: 3,1,65535,srgb 0,0: (65535,0,0)

gimp能够从加载的图像生成调色板。我希望所有图像(我不一定是这些图片的作者)共享一个通用调色板,因为这样可以更容易地在LCD屏幕上显示它们


有这样的程序吗?或者是gimp或imagemagick中的一些脚本?

有几种方法可以做到这一点:

  • 使用抖动

    使用设计用于抖动的调色板,如默认VGAWEB调色板。我是这样做的:

    convert palette.png txt:
    
    # ImageMagick pixel enumeration: 3,1,65535,srgb
    0,0: (65535,0,0)  #FF0000  red
    1,0: (65535,65535,0)  #FFFF00  yellow
    2,0: (0,65535,65535)  #00FFFF  cyan
    
    关于如何做到这一点。也有更复杂的方法来实现这一点,只是谷歌的抖动

  • 将所有图像合并到单个马赛克中

    并使用您现在使用的工具计算包含所有所需图像的大图像调色板。之后,只需对每个原始图像使用此调色板(或在马赛克上,然后取消马赛克)

  • 自己计算调色板

    您需要计算所有图像的直方图,然后使用某种聚类来减少颜色的数量。要包含更多图像,只需计算所有图像的直方图(不要在图像之间重置直方图),其余图像与单个图像相同。因此,如果你能访问你的颜色量化代码,那么只需更改直方图部分。。。通过在所有需要的图像中添加循环(并清除第一幅图像的直方图)

    下面是我如何进行颜色量化的示例:


  • 我不使用gimp,也不使用imagemagick,所以我无法帮助您,但现在您至少知道在他们的文档中要查找什么…

    我不确定您尝试的操作是否适用于JPEG图像,因为它们没有调色板。但是,在命令行中使用ImageMagick的一种可能的技术是将所有图像放在一起,将颜色的数量减少到您想要的数量,然后将其保存(最小化/消除重复)为“调色板”,您可以将其应用于其他图像

    因此,第一步是提取一个通用调色板,例如250种颜色:

    magick image1.jpg image2.jpg ... +append -colors 250 -unique-colors palette.png
    
    现在,在显示任何图像之前,请将其映射到该调色板:

    magick image.jpg -remap palette.png result.png
    
    您还可以通过以下方式禁用抖动:

    magick +dither image.jpg -remap palette.png result.png
    
    由于JPEG调色板的问题,我一直使用
    PNG
    而不是JPEG,但是您可以使用相同的命令尝试使用JPEG。我绝对建议您至少使用GIF、PNG或NetPBM PPM格式来存储调色板信息


    为了好玩,让我们用白宫的照片来试试:

    让我们用三种颜色——红色、黄色和青色——制作一个非常糟糕的调色板:

    convert xc:red xc:yellow xc:cyan +append palette.png
    

    并以抖动的方式应用它:

    convert whitehouse.jpg -remap palette.png dither.png
    

    同样没有:

    convert whitehouse.jpg +dither -remap palette.png undither.png
    

    正如@Spektre在下面的注释中指出的,您可能正在以某种字节数组或类似查找表的形式将该调色板传递给LCD。如果是这种情况,您可以看到调色板中的human/ASCII术语如下:

    convert palette.png txt:
    
    # ImageMagick pixel enumeration: 3,1,65535,srgb
    0,0: (65535,0,0)  #FF0000  red
    1,0: (65535,65535,0)  #FFFF00  yellow
    2,0: (0,65535,65535)  #00FFFF  cyan
    
    你们可以得到一个9字节的R,G,B值的二进制文件,如下所示-我选择在之后以十六进制转储它,这样你们就可以看到它了:

    convert palette.png -depth 8 rgb:palette.bin
    
    xd palette.bin
    00000000: ff00 00ff ff00 00ff ff                   .........
    

    在Gimp中,您可以:1)将所有JPEG加载为层2)使用Gimp_image_convert_index()对它们进行抖动3)可能会导出调色板4)迭代/保存每个层。但文件的数量取决于可用内存,调色板最大为256色,而LCD可以显示256色以上?输出很可能不是JPG格式,而是LCD的某个字节数组,具有某些索引颜色格式。。。但你是对的,如果他需要存储子结果JPG是不可能的。。。除非LCD本身进行转换,但效果不太好,并且转换为普通颜色具有更好的视觉质量…@Spektre感谢您的见解-我对LCD不太熟悉,因此我将添加一些可能有用的更多信息,现在您已经解释了字节数组。再次感谢。我只是猜测这里,但我有低水平的硬件背景液晶显示器的包括,所以这是一个有根据的猜测。。。