/* 图片路径 */
const char file_path[] = "D:/studyplace/workplace/cpp/resource/9.gif";
const char result_path[] = "D:/studyplace/workplace/cpp/resource/tmp.gif";
/* gif图片pad(对图片进行缩放,然后再在外围用指定颜色填充,类似于阿里的m_pad) */
int magick_gif_pad()
{
int rc = 0;
MagickWand* magick_wand = NULL;
int size = 0;
size_t num_frames = 0;
MagickWand** frame_wands = NULL;
MagickWand* magick_wand_cav = NewMagickWand();
PixelWand* color_wand = NewPixelWand();
PixelSetColor(color_wand, "#C3D22D");
// 初始化ImageMagick库
MagickWandGenesis();
// 创建MagickWand对象
magick_wand = NewMagickWand();
// 读取图片文件
if (MagickReadImage(magick_wand, file_path) == MagickFalse) {
printf("Failed to read image\n");
rc = -1;
goto l_e_free;
}
// 获取GIF文件中的帧数
num_frames = MagickGetNumberImages(magick_wand);
size = num_frames * sizeof(MagickWand*);
// 创建MagickWand对象数组,用于存储每一帧
frame_wands = (MagickWand**)malloc(size);
if (frame_wands == NULL) {
printf("Failed to allocate memory\n");
rc = -1;
goto l_e_free;
}
// 分离每一帧并旋转
for (size_t i = 0; i < num_frames; i++) {
// 选择当前帧
if (MagickSetIteratorIndex(magick_wand, i) == MagickFalse) {
printf("Failed to set iterator index\n");
rc = -1;
goto l_e_free_wands;
}
frame_wands[i] = MagickGetImage(magick_wand); // 克隆原始wand
if (MagickResizeImage(frame_wands[i], 100, 100, LanczosFilter) == MagickFalse) {
printf("Failed to resize GIF frame\n");
rc = -1;
goto l_e_free_wands;
}
MagickNewImage(magick_wand_cav, 150, 100, color_wand);
MagickSetImageDelay(magick_wand_cav, MagickGetImageDelay(magick_wand));
MagickSetImageFormat(magick_wand_cav, MagickGetImageFormat(magick_wand)); // 设置图像格式为 PNG
MagickSetImageDepth(magick_wand_cav, MagickGetImageDepth(magick_wand)); // 设置图像深度为 8 位
MagickSetImageColorspace(magick_wand_cav, MagickGetImageColorspace(magick_wand)); // 设置颜色空间为 RGB
MagickCompositeImage(magick_wand_cav, frame_wands[i], CopyCompositeOp, MagickTrue, 25, 0);
}
// 重构一个wand
magick_wand = DestroyMagickWand(magick_wand);
//magick_wand = NewMagickWand();
magick_wand = CloneMagickWand(magick_wand_cav);
// 优化输出GIF
MagickOptimizeImageLayers(magick_wand);
// 保存缩放后的图片
if (MagickWriteImages(magick_wand, result_path, MagickTrue) == MagickFalse) {
printf("Failed to write image\n");
rc = -1;
goto l_e_free_wands;
}
// 释放资源
for (size_t i = 0; i < num_frames; i++) {
frame_wands[i] = DestroyMagickWand(frame_wands[i]);
}
free(frame_wands);
frame_wands = NULL;
magick_wand_cav = DestroyMagickWand(magick_wand_cav);
magick_wand = DestroyMagickWand(magick_wand);
color_wand = DestroyPixelWand(color_wand);
l_out:
MagickWandTerminus();
return rc;
l_e_free_wands:
for (size_t i = 0; i < num_frames; i++) {
frame_wands[i] = DestroyMagickWand(frame_wands[i]);
}
free(frame_wands);
frame_wands = NULL;
l_e_free:
magick_wand_cav = DestroyMagickWand(magick_wand_cav);
magick_wand = DestroyMagickWand(magick_wand);
color_wand = DestroyPixelWand(color_wand);
goto l_out;
}
int main() {
magick_gif_pad();
return 0;
}
ImageMagick gif图片resize加填充
最新推荐文章于 2024-10-12 00:54:53 发布