-2

So I created gif file from 5 png files with using MagickCoalesceImages call and store it on disk. How I can read these files back from gif file ? MagickReadImage does not help

Narek yan
  • 37
  • 6

1 Answers1

0

Hard to help without seeing the code, but I can assume you created 5 images with something like...

MagickWand
  * gif2png;

gif2png = NewMagickWand();
MagickReadImage(gif2png, "input.gif");
MagickWriteImages(gif2png, "output_%02d.png", MagickFalse);
gif2png = DestroyMagickWand(gif2png);

How I can read these files back from gif file?

You would use MagickReadImage to decode the image from the file, and MagickAddImage to append the decoded image onto a image-stack.

MagickWand
  * png2gif,
  * temp;

// Create a blank image-stack.
png2gif = NewMagickWand();
char filename[PATH_MAX];  // PATH_MAX provided by limits.h

// Iterate over images to append.
for (int i = 0; i < 5; ++i) {
  sprintf(filename, "output_%02d.png", i);
  // Read image from disk.
  temp = NewMagickWand();
  MagickReadImage(temp, filename);
  // Add "frame" to stack.
  MagickAddImage(png2gif, temp);
  temp = DestroyMagickWand(temp);
}
MagickWriteImages(png2gif, "output.gif", MagickTrue);
png2gif = DestroyMagickWand(png2gif);

Warning: The above example omits basic error handling, and assumes the filename names are a sequential series.


Update

From the comments, if you wish to extract a single frame as a PNG file, there are a few ways.

Fastest way is to use MagickWriteImages

MagickWriteImages(img, "output_%02d.png", MagickFalse);

Or use the image stack iterators.

for (MagickSetFirstIterator(img); MagickHasNextImage(img); MagickNextImage(img)) {
  MagickWriteImage(img, "output_%02d.png");
}

Or, if the PNG filenames are defined, and you need to map them.

const char * filenames[5] = {
  "first.png",
  "second.png",
  "third.png",
  "forth.png",
  "fifth.png"
};
for (int i = 0; i < 5; ++i) {
  MagickSetIteratorIndex(img, i);
  MagickWriteImage(img, filenames[i]);
}

Without seeing the code, we can't offer much help, and can only guess what an acceptable solution would be.

emcconville
  • 23,800
  • 4
  • 50
  • 66