我一直在使用这种方法使用 MagickWand API 导出像素:
MagickExportImagePixels
但是,这似乎不遵守图像中的方向 exif 数据。有没有办法以正确的方向提取像素,所以我可以用不同的格式写出来(不使用MagickWriteImage
)?基本上,我想要转换的自动定向选项的行为。
谢谢!
我一直在使用这种方法使用 MagickWand API 导出像素:
MagickExportImagePixels
但是,这似乎不遵守图像中的方向 exif 数据。有没有办法以正确的方向提取像素,所以我可以用不同的格式写出来(不使用MagickWriteImage
)?基本上,我想要转换的自动定向选项的行为。
谢谢!
我是 ImageMagick 的开发人员之一,似乎我们忘记将此方法添加到 Wand。ImageMagick 的下一个版本(6.8.9-9)将包括以下可用于自动定位图像的方法:
MagickAutoOrientImage(magick_wand);
当 ImageMagick 的 6.8.9+ 版本MagickAutoOrientImage()
不可用时,我使用以下代码自动定位图像:
void auto_orient_image(MagickWand* image) {
PixelWand* pwand=0;
switch(MagickGetImageOrientation(image))
{
case UndefinedOrientation:
case TopLeftOrientation:
default:
break;
case TopRightOrientation:
MagickFlopImage(image);
break;
case BottomRightOrientation:
pwand=NewPixelWand();
MagickRotateImage(image, pwand, 180.0);
case BottomLeftOrientation:
MagickFlipImage(image);
break;
case LeftTopOrientation:
MagickTransposeImage(image);
break;
case RightTopOrientation:
pwand=NewPixelWand();
MagickRotateImage(image, pwand, 90.0);
break;
case RightBottomOrientation:
MagickTransverseImage(image);
break;
case LeftBottomOrientation:
pwand=NewPixelWand();
MagickRotateImage(image, pwand, 270.0);
break;
}
if (pwand) DestroyPixelWand(pwand);
MagickSetImageOrientation(image, TopLeftOrientation);
}
可能需要添加错误处理。
看起来这样做的唯一方法是通过获取图像方向并相应地旋转图像来伪手动。这并不难,但我希望 API 中内置了一个更简洁的解决方案。一个不完整的例子如下:
OrientationType t = MagickGetImageOrientation(magick_wand);
if (t == RightTopOrientation) {
MagickRotateImage(mw, pw, 90);
}
...