代码之家  ›  专栏  ›  技术社区  ›  Mark T

使用c删除jpeg图像的exif数据中除两个字段以外的所有字段#

  •  0
  • Mark T  · 技术社区  · 6 年前

    我正在使用C和ImageFactory库(来自imageprocessor.org)来大幅修改JPG图像。它可以进行矫直、裁剪、阴影细节增强等。

    它正在完全工作,并成功地将新映像写入文件。 但是这个文件包含原始的exif数据,其中大部分现在是不正确的或不相关的。

    我肯定需要在exif数据中保留方向标志,因为它需要正确地定位修改后的图像。我想保留日期时间。但所有其他的exif数据都应该消失。

    我可以找到在图像元数据中添加或修改exif属性项的方法,但无法删除。

         using (ImageFactory ifact = new ImageFactory()) {
            ifact.PreserveExifData = true;
            ifact.Load(edat.ImageFilename);
    
            // save the image in a bitmap that will be manipulated
            //ifact.PreserveExifData = false;  // tried this but b1 still had EXIF data
            Bitmap b1 = (Bitmap)ifact.Image;
    
            //lots of processsing here...
    
            // write the image to the output file
            b1.Save(outfilename, ImageFormat.Jpeg);
          }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Abstract    6 年前

    这个怎么样:

    Bitmap bmp = new Bitmap("C:\\Test\\test.jpg");
    
    foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems)
    {
        if (item.Id == 0x0112 || item.Id == 0x0132)
            continue;
    
        System.Drawing.Imaging.PropertyItem modItem = item;
        modItem.Value = new byte[]{0};
        bmp.SetPropertyItem(modItem);
    }
    
    bmp.Save("C:\\Test\\noexif.jpg");
    

    这是身份证表供参考: https://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.id(v=vs.110).aspx

    0x0112 -方向

    0x0132 -日期/时间

        2
  •  0
  •   Mark T    6 年前

    我终于想出了如何移除 全部的 不需要的exif标签。

    剩下的也可以修改。

      // remove unneeded EXIF data
      using (ImageFactory ifact = new ImageFactory()) {
        ifact.PreserveExifData = true;
        ifact.Load(ImageFilename);
        // IDs to keep: model, orientation, DateTime, DateTimeOriginal
        List<int> PropIDs = new List<int>(new int[] { 272, 274, 306, 36867 });
        // get the property items from the image
        ConcurrentDictionary<int, PropertyItem> EXIF_Dict = ifact.ExifPropertyItems;
        List<int> foundList = new List<int>();
        foreach (KeyValuePair<int, PropertyItem> kvp in EXIF_Dict) foundList.Add(kvp.Key);
        // remove EXIF tags unless they are in the PropIDs list
        foreach (int id in foundList) {
          PropertyItem junk;
          if (!PropIDs.Contains(id)) {
            // the following line removes a tag
            EXIF_Dict.TryRemove(id, out junk);
          }
        }
        // change the retained tag's values here if desired
        EXIF_Dict[274].Value[0] = 1;
        // save the property items back to the image
        ifact.ExifPropertyItems = EXIF_Dict;
      }