如何使用ImageMagick将PNG转换为BGR 565格式

如何使用ImageMagick将PNG转换为BGR 565格式,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我正在尝试使用Image Magick将PNG文件转换为BGR 565位图图像。我做了大量的研究,还没有找到答案。有人能帮我吗?编译此C程序并将其作为rgbtobgr565安装在搜索路径中 /* rgbtobgr565 - convert 24-bit RGB pixels to 16-bit BGR565 pixels Written in 2016 by Glenn Randers-Pehrson <glennrp@users.sf.net> To the exten

我正在尝试使用Image Magick将PNG文件转换为BGR 565位图图像。我做了大量的研究,还没有找到答案。有人能帮我吗?

编译此C程序并将其作为rgbtobgr565安装在搜索路径中

/* rgbtobgr565 - convert 24-bit RGB pixels to 16-bit BGR565 pixels

  Written in 2016 by Glenn Randers-Pehrson <glennrp@users.sf.net>

  To the extent possible under law, the author has dedicated all copyright
  and related and neighboring rights to this software to the public domain
  worldwide. This software is distributed without any warranty.
  See <http://creativecommons.org/publicdomain/zero/1.0/>. 

  Use with ImageMagick or GraphicsMagick to convert 24-bit RGB pixels
  to 16-bit BGR565 pixels, e.g.,

      magick file.png -depth 8 rgb:- | rgbtobgr565 > file.bgr565

  Note that the 16-bit pixels are written in network byte order (most
  significant byte first), with blue in the most significant bits and
  red in the least significant bits.

  ChangLog:
  Jan 2017: changed bgr565 from int to unsigned short (suggested by
             Steven Valsesia)
*/

#include <stdio.h>
int main()
{
    int red,green,blue;
    unsigned short bgr565;
    while (1) {
        red=getchar(); if (red == EOF) return (0);
        green=getchar(); if (green == EOF) return (1);
        blue=getchar(); if (blue == EOF) return (1);
        bgr565 = (unsigned short)(red * 31.0 / 255.0) |
                 (unsigned short)(green * 63.0 / 255.0) << 5 |
                 (unsigned short)(blue * 31.0 / 255.0) << 11;
            putchar((bgr565 >> 8) & 0xFF);
            putchar(bgr565 & 0xFF);
        }
    }
为完整起见,以下是将bgr565像素转换回rgb的程序:

/* bgr565torgb - convert 16-bit BGR565 pixels to 24-bit RGB pixels

  Written in 2016 by Glenn Randers-Pehrson <glennrp@users.sf.net>

  To the extent possible under law, the author has dedicated all copyright
  and related and neighboring rights to this software to the public domain
  worldwide. This software is distributed without any warranty.
  See <http://creativecommons.org/publicdomain/zero/1.0/>. 

  Use with ImageMagick or GraphicsMagick to convert 16-bit BGR565 pixels
  to 24-bit RGB pixels, e.g.,

      bgr565torgb < file.bgr565 > file.rgb
      magick -size WxH -depth 8 file.rgb file.png 
*/

#include <stdio.h>
int main()
{
    int rgbhi,rgblo,red,green,blue;
    while (1) {
        rgbhi=getchar(); if (rgbhi == EOF) return (0);
        rgblo=getchar(); if (rgblo == EOF) return (1);
        putchar((rgblo & 0x1F) << 3 | (rgblo & 0x14) >> 3 );
        putchar((rgbhi & 0x07) << 5 |
                (rgblo & 0xE0) >> 3 |
                (rgbhi & 0x06) >> 1);
        putchar((rgbhi & 0xE0) | (rgbhi >> 5) & 0x07);
    }
}

编译此C程序并将其作为rgbtobgr565安装在搜索路径中

/* rgbtobgr565 - convert 24-bit RGB pixels to 16-bit BGR565 pixels

  Written in 2016 by Glenn Randers-Pehrson <glennrp@users.sf.net>

  To the extent possible under law, the author has dedicated all copyright
  and related and neighboring rights to this software to the public domain
  worldwide. This software is distributed without any warranty.
  See <http://creativecommons.org/publicdomain/zero/1.0/>. 

  Use with ImageMagick or GraphicsMagick to convert 24-bit RGB pixels
  to 16-bit BGR565 pixels, e.g.,

      magick file.png -depth 8 rgb:- | rgbtobgr565 > file.bgr565

  Note that the 16-bit pixels are written in network byte order (most
  significant byte first), with blue in the most significant bits and
  red in the least significant bits.

  ChangLog:
  Jan 2017: changed bgr565 from int to unsigned short (suggested by
             Steven Valsesia)
*/

#include <stdio.h>
int main()
{
    int red,green,blue;
    unsigned short bgr565;
    while (1) {
        red=getchar(); if (red == EOF) return (0);
        green=getchar(); if (green == EOF) return (1);
        blue=getchar(); if (blue == EOF) return (1);
        bgr565 = (unsigned short)(red * 31.0 / 255.0) |
                 (unsigned short)(green * 63.0 / 255.0) << 5 |
                 (unsigned short)(blue * 31.0 / 255.0) << 11;
            putchar((bgr565 >> 8) & 0xFF);
            putchar(bgr565 & 0xFF);
        }
    }
为完整起见,以下是将bgr565像素转换回rgb的程序:

/* bgr565torgb - convert 16-bit BGR565 pixels to 24-bit RGB pixels

  Written in 2016 by Glenn Randers-Pehrson <glennrp@users.sf.net>

  To the extent possible under law, the author has dedicated all copyright
  and related and neighboring rights to this software to the public domain
  worldwide. This software is distributed without any warranty.
  See <http://creativecommons.org/publicdomain/zero/1.0/>. 

  Use with ImageMagick or GraphicsMagick to convert 16-bit BGR565 pixels
  to 24-bit RGB pixels, e.g.,

      bgr565torgb < file.bgr565 > file.rgb
      magick -size WxH -depth 8 file.rgb file.png 
*/

#include <stdio.h>
int main()
{
    int rgbhi,rgblo,red,green,blue;
    while (1) {
        rgbhi=getchar(); if (rgbhi == EOF) return (0);
        rgblo=getchar(); if (rgblo == EOF) return (1);
        putchar((rgblo & 0x1F) << 3 | (rgblo & 0x14) >> 3 );
        putchar((rgbhi & 0x07) << 5 |
                (rgblo & 0xE0) >> 3 |
                (rgbhi & 0x06) >> 1);
        putchar((rgbhi & 0xE0) | (rgbhi >> 5) & 0x07);
    }
}


也许用一个更具体的问题发布你到目前为止尝试过的东西会有所帮助。老实说,我没有尝试过任何能让我接近的东西,也没有太多的图像转换经验,这就是为什么我故意把它放在一边。我认为大量不同的答案不仅有助于解决我的问题,而且还可以让我更好地了解转换的工作原理。下面的答案有助于澄清实际发生的情况。我建议阅读帮助中心,了解您的问题被搁置的原因。在发布Stack Overflow(堆栈溢出)并尝试自己的东西之前,投入一些精力进行自己的研究总是一个好主意。像他一样,很难找到一个能够进行这种翻译的软件:RGB 888->BGR 565。所以我在10分钟内制作了一个小软件,从格伦·兰德斯·佩尔森的答案开始。在这里查看:@user2629409谢谢。但是,请看,也许用一个更具体的问题发布您到目前为止所做的尝试会有所帮助。老实说,我没有尝试过任何能让我接近的东西,也没有多少图像转换方面的经验,这就是为什么我故意将其放在较宽的范围内。我认为大量不同的答案不仅有助于解决我的问题,而且还可以让我更好地了解转换的工作原理。下面的答案有助于澄清实际发生的情况。我建议阅读帮助中心,了解您的问题被搁置的原因。在发布Stack Overflow(堆栈溢出)并尝试自己的东西之前,投入一些精力进行自己的研究总是一个好主意。像他一样,很难找到一个能够进行这种翻译的软件:RGB 888->BGR 565。所以我在10分钟内制作了一个小软件,从格伦·兰德斯·佩尔森的答案开始。在这里查看:@user2629409谢谢。但是我喜欢你的答案,即使其他人不喜欢这个问题-谢谢,这给了我们很多清晰。是否可以在一个convert命令中执行此操作,而不使用管道到另一个方法?尽管这个答案很可靠,但在服务器中使用ImageMagick库很难实现这一点。它需要对ImageMagick进行修改,修改的代码量与此处所示的代码量类似。或者,也可以在服务器上作为代理安装rgbtobgr565程序;我会调查的。@user2629429我同意bgr565应该是无符号短的。红色、绿色、蓝色、rgbhi和rgblo必须为int,因此getchar将正确返回EOF。我已经相应地更新了程序;查看嵌入的变更日志。我喜欢你的答案,即使其他人不喜欢这个问题-谢谢,这给了我们很多清晰。是否可以在一个convert命令中执行此操作,而不使用管道到另一个方法?尽管这个答案很可靠,但在服务器中使用ImageMagick库很难实现这一点。它需要对ImageMagick进行修改,修改的代码量与此处所示的代码量类似。或者,也可以在服务器上作为代理安装rgbtobgr565程序;我会调查的。@user2629429我同意bgr565应该是无符号短的。红色、绿色、蓝色、rgbhi和rgblo必须为int,因此getchar将正确返回EOF。我已经相应地更新了程序;请参阅嵌入的变更日志。