C++ 如何使用Magick++;没有动画损失
下面是调整图像大小的代码:C++ 如何使用Magick++;没有动画损失,c++,image-processing,imagemagick,gif,C++,Image Processing,Imagemagick,Gif,下面是调整图像大小的代码: Image image; image.read( imagePath.toStdString() ); Geometry newSize = Geometry(m_newSize.width(), m_newSize.height()); newSize.aspect(true); image.resize(newSize); image.write(newImagePath.toStdString()); 此代码适用于非gif文件。对于gif文件,我将丢失动画:
Image image;
image.read( imagePath.toStdString() );
Geometry newSize = Geometry(m_newSize.width(), m_newSize.height());
newSize.aspect(true);
image.resize(newSize);
image.write(newImagePath.toStdString());
此代码适用于非gif文件。对于gif文件,我将丢失动画:
如何在不丢失动画的情况下调整gif文件的大小?您必须使用readImages和animateImages将动画的所有帧读取到图像列表中,并将它们添加到动画中 请看下面的示例:
#包括
#包括
使用名称空间std;
使用名称空间Magick;
int main(int/*argc*/,char**/*argv*/)
{
列表图像列表;
readImages(&imageList,“test_image_anim.gif”);
图像附加;
appendImages(&appended,imageList.begin(),imageList.end());
写入(“added_image.miff”);
返回0;
}
唯一的问题是,文档中说,动画图像只能在X11下工作,我找到了一个解决方案!感谢MofX的正确指导
Geometry newSize = Geometry(m_newSize.width(), m_newSize.height());
newSize.aspect(true);
list<Image> frames;
readImages(&frames, imagePath.toStdString());
for (auto& image : frames)
image.resize(newSize);
writeImages(frames.begin(), frames.end(), newImagePath.toStdString());
Geometry newSize=Geometry(m_newSize.width(),m_newSize.height());
newSize.aspect(true);
列出框架;
readImages(&frames,imagePath.toStdString());
用于(自动和图像:帧)
图像。调整大小(新闻大小);
WriteImage(frames.begin()、frames.end()、newImagePath.TostString());
我试过这个。这不管用。我得到了所有帧都是水平序列的图像,但我需要gif动画。你不应该只是复制示例代码。。。在我指路之后,我希望你自己做一点工作。您必须使用animateImages而不是appendImages使其工作,然后将其保存为gif而不是miffI。例如,您不知道如何使用animateImages。此函数将列表迭代器作为参数并返回void。我怎样才能得到动画的效果并写出这个?coalesceImages方法也有同样的问题。据我在源代码中看到的,动画是在第一幅图像中生成的。因此,imageList[0]。write(“animation.gif”)应该创建动画文件。
Geometry newSize = Geometry(m_newSize.width(), m_newSize.height());
newSize.aspect(true);
list<Image> frames;
readImages(&frames, imagePath.toStdString());
for (auto& image : frames)
image.resize(newSize);
writeImages(frames.begin(), frames.end(), newImagePath.toStdString());