Page 1 of 1

Small memory leaks when resizing gifs with MagickWand

Posted: 2012-07-08T03:43:19-07:00
by Cubbee
Hello. I`m trying to resize animated gifs with ImageMagick MagickWand, but get some small memory leaks. ~3 Mb per 400 gifs. I`m not 100% sure if I`m using MagickWand right.

Code: Select all

    MagickCore::MagickWand *magick_wand = NewMagickWand();
    MagickCore::MagickWand *magick_wand2 = NewMagickWand();
    for(std::vector<string>::iterator it = gifs.begin(); it != gifs.end(); ++it)
        inputFileName = "C:\\Projects\\gifs\\" + *it + ".gif";
        outputFileName = "C:\\Projects\\gifs\\out\\" + *it + ".gif";
        MagickReadImage(magick_wand, inputFileName.c_str());
        int width = MagickGetImageWidth (magick_wand);
        int height = MagickGetImageHeight (magick_wand);
        magick_wand2 = MagickCoalesceImages(magick_wand);
        if(width > THUMBNAIL_WIDTH)
            height = static_cast<int>(height * THUMBNAIL_WIDTH / width);
            width = 144;

        if(height > THUMBNAIL_HEIGHT)
            width = static_cast<int>(width * THUMBNAIL_HEIGHT / height);
            height = 144;

        while (MagickNextImage(magick_wand2) != MagickFalse)
            MagickResizeImage(magick_wand2, width, height, MitchellFilter, 1 );
        magick_wand = MagickOptimizeImageLayers(magick_wand2);
        MagickWriteImages(magick_wand, outputFileName.c_str(), MagickTrue);		        

I`ve tried to use one MagickWand instead of two, but then functions don`t work properly and leaks are even higher. I`ve also tried to initialize MagickWand inside the for-loop, but it didn`t help. With this code gifs are resized and optimized properly. Memory leaks where detected by _CrtDumpMemoryLeaks(). They are also noticable with Windows Task Manager.

Thank you for any assistance.

Re: Small memory leaks when resizing gifs with MagickWand

Posted: 2012-07-08T09:11:54-07:00
by el_supremo
The only thing I can suggest is to try replacing each occurrence of ClearMagickWand(w) with
w = NewMagickWand();

to see if it makes any difference.