【问题标题】:C/C++ library to blend PNG (including Alpha) with raw ARGB buffer用于将 PNG(包括 Alpha)与原始 ARGB 缓冲区混合的 C/C++ 库
【发布时间】:2011-09-06 04:51:13
【问题描述】:

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

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

我看过一些,包括:

  • libGD
  • libPNG
  • openCV
  • ImageMagick
  • CxImage
  • 英特尔集成性能基元 (IPP)

但似乎没有一个能够处理加载 PNG、调整 PNG 图像大小、将 alpha 混合到图像数据中以及处理 ARGB 格式(而不是 RGBA)的所有要求。

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

有谁知道任何可以提供帮助的图书馆,或者我是否遗漏了上述任何一项?

【问题讨论】:

  • 我想知道为什么 ImageMagick 做不到。它非常强大,也许能够做到。查看即时消息convert
  • @Cobra_Fast:我不认为 ImageMagick 支持 ARGB 作为原生格式。见studio.imagemagick.org/discourse-server/…。这确实为使用 CLI 提供了一些提示,但我不太确定它是如何映射到 Magick++ 接口的。
  • 为什么不能放弃ARGB要求?在我看来,您要么是动态生成此图像,在这种情况下,您可以按您喜欢的任何字节顺序执行它,或者您是从某个外部源加载它,在这种情况下,重新排序字节的开销fly 让你的图像处理库高兴将完全被加载操作的 I/O 开销所淹没。

标签: c++ c linux image-processing png


【解决方案1】:

您可以通过使用SDL_gfxSDL_Image 对SDL 执行此操作。

// 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 );

【讨论】:

    【解决方案2】:

    您需要将文件格式库(libPNG 或 ImageMagick)与图像处理库配对。 Boost.GIL 在这里会很好。如果可以将 ARGB 缓冲区(每像素 4 个字节)加载到内存中,则可以使用 interleaved_view 创建 GIL 图像,并将缓冲区指针重新解释为 boost::gil::argb32_ptr_t

    【讨论】:

      【解决方案3】:

      使用ImageMagick,使用appendImages 函数很容易做到。

      像这样:

      #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;
      } 
      

      【讨论】:

      • -1:OP 要求对两个图像进行 alpha 混合,产生一个结果图像,而不是将两个图像放入一个文件中。
      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2010-12-24
      相关资源
      最近更新 更多