コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: cer12u/ExeWorker
            /// <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);
            }
コード例 #2
0
ファイル: MainWindow.xaml.cs プロジェクト: cer12u/ExeWorker
            /// <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);
            }
コード例 #3
0
ファイル: MainWindow.xaml.cs プロジェクト: cer12u/ExeWorker
            /// <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);
            }