Библиотека C / C ++ для смешивания PNG (включая Alpha) с необработанным буфером ARGB - PullRequest
6 голосов
/ 01 июня 2011

У меня есть PNG с закодированным альфа-каналом, который я хочу смешать с необработанным ARGB-изображением в памяти, которая хранится с чередованием.Разрешение PNG отличается от разрешения для буфера изображения и требует соответствующего изменения размера (предпочтительно с интерполяцией).

Хотя я понимаю, что это не особенно сложно сделать вручную (после того, как изображение PNG загружено вподходящей структуры), я надеялся найти хорошую библиотеку обработки изображений с открытым исходным кодом, чтобы сделать эту работу за меня.

Я смотрел на несколько из них, включая:

  • libGD
  • libPNG
  • openCV
  • ImageMagick
  • CxImage
  • Интегрированные примитивы производительности Intel (IPP)

Но нетКажется, что он отвечает всем требованиям загрузки PNG, изменения размера изображения PNG, альфа-смешивания с данными изображения и обработки формата ARGB (в отличие от RGBA).

Производительность является проблемой, поэтому сокращение проходов поДанные изображения были бы полезны, особенно возможность хранить данные ARGB на месте, а не копировать их в другую структуру данных для выполнения смешивания.

Кто-нибудь знает о каких-либо библиотеках, которые могут помочь, или я что-то пропустил в одном из вышеперечисленных?

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Вы можете сделать это с SDL, используя SDL_gfx и SDL_Image .

// 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 );
1 голос
/ 21 июня 2011

Вам необходимо связать библиотеку форматов файлов (libPNG или ImageMagick) с библиотекой манипулирования изображениями. Boost.GIL было бы хорошо здесь. Если вы можете загрузить буфер ARGB (4 байта на пиксель) в память, вы можете создать GIL-изображение с interleaved_view и повторно интерпретировать указатель буфера на boost :: gil :: argb32_ptr_t

0 голосов
/ 01 июня 2011

С 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;
} 
...