none
дата съемки и формат картинки C# RRS feed

  • Вопрос

  • Подскажите как узнать дату съемки изображения и его размеры/формат(например 3000х4000).

    пробовал 

    System.Windows.Media.Imaging.BitmapDecoder decoder = System.Windows.Media.Imaging.BitmapDecoder.Create(new Uri(file.FullName), System.Windows.Media.Imaging.BitmapCreateOptions.IgnoreColorProfile, System.Windows.Media.Imaging.BitmapCacheOption.Default); //"распаковали" снимок и создали объект decoder
    System.Windows.Media.Imaging.BitmapMetadata TmpImgEXIF = (System.Windows.Media.Imaging.BitmapMetadata)decoder.Frames[0].Metadata.Clone(); //считали и сохранили метаданные
    string DateOfShot = Convert.ToDateTime(TmpImgEXIF.DateTaken).ToString("dd.MM.yyyy");

    но работает очень медленно если файлов много.

    пробовал 

    System.Drawing.Image myImg = System.Drawing.Image.FromFile(fi.FullName);
    System.Drawing.Imaging.PropertyItem p = myImg.GetPropertyItem(0x0131);
    но тоже не особо
    • Изменено Dobrii 20 февраля 2013 г. 14:19
    20 февраля 2013 г. 14:19

Ответы

  • Есть еще один способ получить метаданные фотографии (или любого другого файла).
    Способ заключается в использовании объекта Shell.

    1. Добавляем ссылку на сборку: Shell32 (Microsoft Shell Controls And Automation 1.0);

    2. Пишем код:

    using System;
    using System.Text;
    using Shell32;
    
    namespace ConsoleApplication1
    {
    	class Program
    	{
    		static void Main()
    		{
    			Shell shell = new Shell();
    			Folder folder = shell.NameSpace("C:\\");
    			FolderItem item = folder.ParseName("2012.JPG");
    
    			for (int i = 0; i < 100; i++)
    			{
    				string propValue = folder.GetDetailsOf(item, i);
    				if (propValue != "")
    				{
    					Console.WriteLine("{0,4}:  {1,20}:   {2}", i, folder.GetDetailsOf(null, i), propValue);
    				}
    			}
    			
    			Console.ReadKey();
    		}
    	}
    }
    

    3. Результат:

    Не могу сказать точно на сколько этот подход работает быстрее или медленнее, но думаю, что должен работать быстрее тех что описаны автором топика.

    • Предложено в качестве ответа Abolmasov Dmitry 22 февраля 2013 г. 7:43
    • Отменено предложение в качестве ответа Dobrii 25 февраля 2013 г. 7:43
    • Помечено в качестве ответа Dobrii 25 февраля 2013 г. 7:44
    22 февраля 2013 г. 7:00
  • Привет,

    Посмотрите на проект ExifLib - A Fast Exif Data Extractor for .NET 2.0+ он работает на порядок быстрее, чем стандартный метод. Думаю он должен вам подойте.

    Если ответ решит вашу проблему - не забудьте его отметить, спасибо.


    Для связи [mail]

    • Помечено в качестве ответа Dobrii 25 февраля 2013 г. 7:44
    21 февраля 2013 г. 11:33

Все ответы

  • Обрабатывайте параллельно, к примеру, через Parallel.ForEach.

    А зачем вы именно клонируете метаданные?

    21 февраля 2013 г. 7:33
  • Привет,

    Посмотрите на проект ExifLib - A Fast Exif Data Extractor for .NET 2.0+ он работает на порядок быстрее, чем стандартный метод. Думаю он должен вам подойте.

    Если ответ решит вашу проблему - не забудьте его отметить, спасибо.


    Для связи [mail]

    • Помечено в качестве ответа Dobrii 25 февраля 2013 г. 7:44
    21 февраля 2013 г. 11:33
  • Есть еще один способ получить метаданные фотографии (или любого другого файла).
    Способ заключается в использовании объекта Shell.

    1. Добавляем ссылку на сборку: Shell32 (Microsoft Shell Controls And Automation 1.0);

    2. Пишем код:

    using System;
    using System.Text;
    using Shell32;
    
    namespace ConsoleApplication1
    {
    	class Program
    	{
    		static void Main()
    		{
    			Shell shell = new Shell();
    			Folder folder = shell.NameSpace("C:\\");
    			FolderItem item = folder.ParseName("2012.JPG");
    
    			for (int i = 0; i < 100; i++)
    			{
    				string propValue = folder.GetDetailsOf(item, i);
    				if (propValue != "")
    				{
    					Console.WriteLine("{0,4}:  {1,20}:   {2}", i, folder.GetDetailsOf(null, i), propValue);
    				}
    			}
    			
    			Console.ReadKey();
    		}
    	}
    }
    

    3. Результат:

    Не могу сказать точно на сколько этот подход работает быстрее или медленнее, но думаю, что должен работать быстрее тех что описаны автором топика.

    • Предложено в качестве ответа Abolmasov Dmitry 22 февраля 2013 г. 7:43
    • Отменено предложение в качестве ответа Dobrii 25 февраля 2013 г. 7:43
    • Помечено в качестве ответа Dobrii 25 февраля 2013 г. 7:44
    22 февраля 2013 г. 7:00
  • как поменять дату съемки файла?
    • Изменено Dobrii 27 мая 2013 г. 11:48
  • можно устанавливать метаданные используя 
    System.IO.FileStream Foto = System.IO.File.Open("путь к файлу", System.IO.FileMode.Open, System.IO.FileAccess.Read); // открыли файл по адресу для чтения
                            System.Windows.Media.Imaging.BitmapDecoder decoder = System.Windows.Media.Imaging.JpegBitmapDecoder.Create(Foto, System.Windows.Media.Imaging.BitmapCreateOptions.IgnoreColorProfile, System.Windows.Media.Imaging.BitmapCacheOption.Default); //"распаковали" снимок и создали объект decoder
                            System.Windows.Media.Imaging.BitmapMetadata TmpImgEXIF = (System.Windows.Media.Imaging.BitmapMetadata)decoder.Frames[0].Metadata.Clone(); //считали и сохранили метаданные
    
                            TmpImgEXIF.SetQuery("/app1/ifd/gps/{ushort=1}", "N");
    интересует где брать расположение метаданных(первый аргумент ф-ции SetQuery) в частности нужно расположение данных о дате съемки