首页 > 解决方案 > Magick++ 合成算法中的内存泄漏

问题描述

我有一个程序可以在 Linux 中模拟 Windows 10 背景渐变过渡。最初我是通过System()调用 ImageMagickcomposite -blend命令来完成此操作的,但是为了消除System()调用,我编写了以下函数来模拟 ImageMagick 命令:

                A=Image(newpic);
                B=Image(picpath+".cache/resizeOld"+to_string(S)+".jpg");

                if(i<=steps)
                {
                    stream<<std::hex<<int(i*(255/steps));
                    streambuffer=stream.str();
                    if(streambuffer.length()==1)
                    {
                        streambuffer="0"+streambuffer;
                    }
                    color=streambuffer;
                    streambuffer="";
                    stream.str("");
                }
                else
                {
                    color="FF";
                }

                maskA=Image(Geometry(bgW,bgH),Color("#"+color+color+color));
                maskB=Image(Geometry(bgW,bgH),Color("#"+invertHex(color)+invertHex(color)+invertHex(color)));

                A.composite(maskA,0,0,Magick::CopyAlphaCompositeOp);
                B.composite(maskB,0,0,Magick::CopyAlphaCompositeOp);

                compResult=A;
                compResult.composite(B,0,0,Magick::BlendCompositeOp);
                compResult.write((picpath+".cache/transition"+to_string((int)i)+".jpg").c_str());

这是在一个for循环中获取所有必要的转换步骤。

上述算法的一般目的如下:

  1. 读入新的背景图片
  2. 读入旧背景图像
  3. 为新图像创建蒙版
  4. 为旧图像创建一个倒置蒙版
  5. 将各自的蒙版作为 Alpha 通道应用于各自的图像
  6. 将两个蒙版图像合成在一起
  7. 将生成的合成图像写入文件以供以后在程序中使用

我不确定是什么导致了内存泄漏,因为我明确地=为每个图像使用了一个运算符,我认为这可以防止泄漏,因为据我所知,没有任何东西会不断添加。

内置的composite -blendImageMagick 函数根本不会改变内存使用情况,所以它似乎是我的算法。

标签: c++memoryimagemagickmagick++

解决方案


推荐阅读