6
votes

Bibliothèque C / C ++ pour mélanger PNG (y compris Alpha) avec tampon ARGB brut

J'ai un PNG avec un canal alpha codé que je veux mélanger avec une image ARGB brute dans la mémoire stockée entrelacée. Le PNG est d'une résolution différente de la mémoire tampon d'image et doit être redimensionnée en conséquence (de préférence avec une interpolation).

tandis que j'apprécie que ce n'est pas particulièrement difficile de le faire à la main (une fois que l'image PNG est chargée dans une structure appropriée), j'espérais trouver une bonne bibliothèque de traitement d'image open source pour faire le travail pour moi.

J'ai regardé quelques-uns, y compris:

  • libgd
  • libpng
  • opencv
  • ImageMagick
  • CXIMAGE
  • Primitives de performance intégrées Intel (IPP)

    Mais rien de semble gérer toutes les exigences de chargement de PNG, redimensionnement de l'image PNG, alpha mélange dans les données d'image et en manipulant le format ARGB (par opposition à RGBA).

    La performance est une préoccupation, ce qui réduirait les laissez-passer sur les données d'image serait bénéfique, en particulier pour pouvoir contenir les données ARGB en place plutôt que de devoir le copier dans une structure de données différente pour effectuer le mélange.

    Est-ce que quelqu'un connaît-il des bibliothèques pouvant pouvoir aider ou si j'ai raté quelque chose dans l'une des réponses ci-dessus?


3 commentaires

Je me demande pourquoi ImageMagick ne peut pas le faire. C'est très puissant et pourrait être capable de le faire. Regardez IMS convertir .


@Cobra_fast: Je ne pense pas que ImageMagick prend en charge Argb comme format natif. Voir studio.imagemagick.org/discourserver-server / ... . Cela donne quelques astuces pour utiliser le CLI mais je ne suis pas tout à fait sûr de savoir comment cette carte vers l'interface Magick ++.


Pourquoi ne pouvez-vous pas abandonner l'exigence Argb? Il me semble que vous générerez cette image à la volée, auquel cas vous pouvez le faire dans n'importe quel ordre d'octet que vous aimez, ou vous le charrez à partir d'une source externe, auquel cas la surcharge de la réorganisation des octets sur le Volez pour que votre bibliothèque de traitement d'image heureuse sera totalement submergée par la surcharge I / O de l'opération de charge.


3 Réponses :


0
votes

avec le ImageMagick C'est une chose très facile à faire en utilisant Appendimages fonction.

Comme ceci: p>

#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 commentaires

-1: L'OP demande un mélange alpha de deux images, produisant une seule image de résultat, ne pas mettre deux images dans un seul fichier.



2
votes

Vous pouvez le faire avec SDL en utilisant SDL_GFX A > et 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 );


0 commentaires

1
votes

Vous devez associer une bibliothèque de format de fichier (libpng ou ImageMagick) avec une bibliothèque de manipulation d'image. Boost.gil serait bien ici. Si vous pouvez charger le tampon Argb (4 octets par pixel) en mémoire, vous pouvez créer une image GIL avec interleusved_View et réinterpret_casting votre pointeur tampon à un boost :: gil :: argb32_ptr_t


0 commentaires