C++ C/C++;将PNG(包括Alpha)与原始ARGB缓冲区混合的库

C++ C/C++;将PNG(包括Alpha)与原始ARGB缓冲区混合的库,c++,c,linux,image-processing,png,C++,C,Linux,Image Processing,Png,我有一个带有编码alpha通道的PNG,我想将它与内存中交错存储的原始ARGB图像混合。PNG与图像缓冲区的分辨率不同,需要相应地调整大小(最好使用插值) 虽然我知道手工完成这项工作并不特别困难(一旦PNG图像加载到适当的结构中),但我希望找到一个好的开源图像处理库来为我完成这项工作 我看了一些,包括: libGD libPNG openCV ImageMagick CxImage 英特尔集成性能原件(IPP) 但是,它们似乎都不能满足加载PNG、调整PNG图像大小、将alpha混合到图像数

我有一个带有编码alpha通道的PNG,我想将它与内存中交错存储的原始ARGB图像混合。PNG与图像缓冲区的分辨率不同,需要相应地调整大小(最好使用插值)

虽然我知道手工完成这项工作并不特别困难(一旦PNG图像加载到适当的结构中),但我希望找到一个好的开源图像处理库来为我完成这项工作

我看了一些,包括:

  • libGD
  • libPNG
  • openCV
  • ImageMagick
  • CxImage
  • 英特尔集成性能原件(IPP)
但是,它们似乎都不能满足加载PNG、调整PNG图像大小、将alpha混合到图像数据以及处理ARGB格式(与RGBA相反)的所有要求

性能是一个问题,因此减少对图像数据的传递将是有益的,尤其是能够将ARGB数据保持在适当的位置,而不必将其复制到不同的数据结构以执行混合

是否有人知道有哪些库可以提供帮助,或者我是否遗漏了上述某个库中的某些内容?

使用此函数非常容易

像这样:

#include <list>
#include <Magick++.h>
using namespace std;
using namespace Magick;

int main(int /*argc*/,char **/*argv*/)
{
   list<Image> imageList;
   readImages( &imageList, "test_image_anim.gif" );

   Image appended;
   appendImages( &appended, imageList.begin(), imageList.end() );
   appended.write( "appended_image.miff" );
   return 0;
} 
#包括
#包括
使用名称空间std;
使用名称空间Magick;
int main(int/*argc*/,char**/*argv*/)
{
列表图像列表;
readImages(&imageList,“test_image_anim.gif”);
图像附加;
appendImages(&appended,imageList.begin(),imageList.end());
写入(“added_image.miff”);
返回0;
} 

您可以使用和对SDL执行此操作


您需要将文件格式库(libPNG或ImageMagick)与图像处理库配对。吉尔在这里会很好。如果您可以将ARGB缓冲区(每像素4字节)加载到内存中,就可以创建一个具有交错视图的GIL图像,并重新解释将缓冲区指针转换为boost::GIL::argb32_ptr_t

我想知道ImageMagick为什么做不到这一点。它的功能非常强大,也许可以做到。看看IMs
convert
@Cobra\u Fast:我认为ImageMagick不支持ARGB作为本机格式。看见这确实为使用CLI提供了一些提示,但我不太确定它如何映射到Magick++接口?在我看来,你要么在运行中生成这个图像,在这种情况下,你可以按照你喜欢的任何字节顺序来做,要么从外部源加载它,在这种情况下,动态重新排序字节以使您的图像处理库满意的开销将完全被加载操作的I/O开销所淹没。-1:OP要求对两个图像进行alpha混合,生成单个结果图像,而不是将两个图像放入单个文件中。
// load images using SDL_Image
SDL_Surface *image1, image2;
image1=IMG_Load("front.png");
image2=IMG_Load("back.png");

// blit images onto a surface using SDL_gfx
SDL_gfxBlitRGBA ( image1, rect, screen, rect ); 
SDL_gfxBlitRGBA ( image2, rect, screen, rect );