/// <summary> /// 画像からEXIF情報を取得する /// 保持していたEXIFタグリストは破棄する /// </summary> /// <param name="filePath">JPGファイルパス</param> /// <returns>0 or エラー値</returns> public int GetExifByImage(string filePath) { if (string.IsNullOrEmpty(filePath)) { return((int)ErrorNumber.ArgumentsNull); } if (!System.IO.File.Exists(filePath)) { return((int)ErrorNumber.FileNotFound); } System.Drawing.Bitmap bmp = null; try { bmp = new System.Drawing.Bitmap(filePath); TagList.Clear(); foreach (System.Drawing.Imaging.PropertyItem pi in bmp.PropertyItems) { EXIF_TAGS te = new EXIF_TAGS(); te.tag = pi.Id; te.type = pi.Type; te.data = new byte[pi.Value.Length]; pi.Value.CopyTo(te.data, 0); TagList.Add(te); } } catch { return((int)ErrorNumber.Unknown); } finally { bmp.Dispose(); } return((int)ErrorNumber.NoError); }
/// <summary> /// タグ番号からタグを検索し、見つかれば値を返却する /// </summary> /// <param name="tagId">EXIFタグ番号</param> /// <param name="parsedValue">取得したデータ</param> /// <param name="exifType">取得したEXIFのTYPE</param> /// <returns>検索がHitすればTrue/無ければFalse</returns> public bool TryGetValue(int tagId, out dynamic parsedValue, ref int exifType) { parsedValue = null; EXIF_TAGS et = null; foreach (EXIF_TAGS etag in TagList) { if (tagId != etag.tag) { continue; } et = etag; } if (et is null) { return(false); } switch ((ExifType)Enum.ToObject(typeof(ExifType), et.type)) { case ExifType.BYTE: if (et.data.Length > 0) { parsedValue = et.data[0]; } break; case ExifType.ASCII: parsedValue = System.Text.Encoding.ASCII.GetString(et.data).TrimEnd('\0'); break; case ExifType.SHORT: if (et.data.Length >= 2) { parsedValue = BitConverter.ToUInt16(et.data, 0); } break; case ExifType.LONG: if (et.data.Length >= 4) { parsedValue = BitConverter.ToUInt32(et.data, 0); } break; case ExifType.RATIONAL: if (et.data.Length >= 8) { parsedValue = Tuple.Create(BitConverter.ToUInt32(et.data, 0), BitConverter.ToUInt32(et.data, 4)); } break; case ExifType.UNDEFINED: parsedValue = new byte[et.data.Length]; et.data.CopyTo(parsedValue, 0); break; case ExifType.SLONG: if (et.data.Length >= 4) { parsedValue = BitConverter.ToInt32(et.data, 0); } break; case ExifType.SRATIONAL: if (et.data.Length >= 8) { parsedValue = Tuple.Create(BitConverter.ToInt32(et.data, 0), BitConverter.ToInt32(et.data, 4)); } break; } return(parsedValue != null); }
/// <summary> /// EXIFリストに値をセットする /// タグがある場合は置換、ない場合は追加する /// </summary> /// <param name="tagId">EXIFタグ番号</param> /// <param name="value">セットする値</param> /// <param name="rewriteTag">タグのマニュアル指定</param> /// <returns>セットの成功可否</returns> public bool SetValue(int tagId, dynamic value, int rewriteTag = -1) { int InsMarker = -1; EXIF_TAGS ee = new EXIF_TAGS() { tag = tagId }; foreach (EXIF_TAGS et in TagList) { if (tagId != et.tag) { continue; } ee = et; InsMarker = TagList.IndexOf(et); TagList.Remove(et); break; } Type type = value.GetType(); if (type == typeof(System.String)) { ee.data = System.Text.Encoding.ASCII.GetBytes(value); ee.type = (int)ExifType.ASCII; } else if (type == typeof(Tuple <Int32, Int32>)) { Tuple <Int32, Int32> tp = value; ee.data = new byte[8]; BitConverter.GetBytes(tp.Item1).CopyTo(ee.data, 0); BitConverter.GetBytes(tp.Item2).CopyTo(ee.data, 4); ee.type = (int)ExifType.SRATIONAL; } else if (type == typeof(Tuple <UInt32, UInt32>)) { Tuple <UInt32, UInt32> tp = value; ee.data = new byte[8]; BitConverter.GetBytes(tp.Item1).CopyTo(ee.data, 0); BitConverter.GetBytes(tp.Item2).CopyTo(ee.data, 4); ee.type = (int)ExifType.RATIONAL; } else { ee.data = BitConverter.GetBytes(value); if (rewriteTag >= 0) { } //処理不要時のNOP else if (type == typeof(byte)) { ee.type = (int)ExifType.BYTE; } else if (type == typeof(ushort)) { ee.type = (int)ExifType.SHORT; } else if (type == typeof(byte[])) { ee.type = (int)ExifType.UNDEFINED; } else if (type == typeof(UInt32)) { ee.type = (int)ExifType.LONG; } else if (type == typeof(int)) { ee.type = GetExifTypeById(value); } } if (rewriteTag >= 0) { ee.type = rewriteTag; } if (InsMarker < 0) { TagList.Add(ee); } else { TagList.Insert(InsMarker, ee); } return(true); }