【AVD】 FFmpeg 获取 JPG 图片旋转信息等 Exif 信息

前段时间写了篇 杀鸡用牛刀,FFmpeg API 加载存储图片,比 ImageMagic 和 stb_image 快多了,后来发现有个问题,有些 JPG 图片是带有旋转信息的,如果只解码,不获取它的旋转信息,将导致图片的方向错误。

av_dict_get

那如何才能用 FFmpeg 来获取 JPG 的旋转信息呢?查过很多资料,最后终于找到一种方法。由于再次查找时又要翻阅多篇文章,因此记录在此。答案就是使用 av_dict_get 这个方法。

首先,要完成使用 FFmpeg 对 JPG 图片的解码过程,得到解码后的帧图像 AVFrame,然后,在 AVFrame->metadata 中读取 Orientation 来获取旋转信息。其中 Orientation 的定义如下:

  /*
    1 = Horizontal (normal)
    2 = Mirror horizontal
    3 = Rotate 180
    4 = Mirror vertical
    5 = Mirror horizontal and rotate 270 CW
    6 = Rotate 90 CW
    7 = Mirror horizontal and rotate 90 CW
    8 = Rotate 270 CW
  */

整个功能的具体代码如下:

  AVDictionaryEntry *e = av_dict_get(frame_->metadata, "Orientation", nullptr, 0);
  if (e) {
    string s = e->value;
    if (s.find("6") != string::npos || s.find("7") != string::npos) {
      return 90;
    } else if (s.find("1") != string::npos || s.find("2") != string::npos) {
      return 0;
    } else if (s.find("8") != string::npos || s.find("5") != string::npos) {
      return 270;
    } else if (s.find("3") != string::npos || s.find("4") != string::npos) {
      return 180;
    }
  }

同理,可以通过将参数 Orientation 改为 EXIF 信息中的其他信息名称,来获取图片的其他 EXIF 信息。


版权声明:本文为u014248312原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。