2009-07-28 4 views
7

Я хотел бы найти высоту/ширину изображения на диске, не открывая его, если это возможно (по соображениям производительности).Прочитайте расширенные свойства изображения в C#

Панель свойств Windows для изображений содержит информацию, такую ​​как ширина, высота, глубина бита и т. Д., Что заставляет меня думать, что он где-то хранит метаданные в файле. Как я могу получить доступ к этой информации?

+0

Возможный дубликат [Как получить данные EXIF ​​из файла с помощью C#] (http: // stackoverflow.com/questions/58649/how-to-get-the-exif-data-from-a-file-using-c) – jgauffin

ответ

3

Есть некоторые StackOverflow вопросы о том, как читать информацию EXIF ​​из изображений, таких как: How to get the EXIF data from a file using C#

+0

Данные EXIF ​​хранятся внутри файла, поэтому требуется его открытие. Что не соответствует критериям OP - не говоря, что критерии OP имеют какой-то смысл :) –

+0

Я думаю, что требование OP больше в том направлении, в котором он хочет пропустить декомпрессию изображения и памяти распределения для данных растрового изображения. Если это так, доступ к метаданным является прекрасным. –

+0

ИМО означает, что не загружать фактические данные изображения, метаданные открытия и чтения должны быть точными. В противном случае нет способов проверить этот файл. Реальное «узкое место» будет загружать данные изображения, а не метаданные. – huseyint

3

Самый простой способ добиться этого - предположить, что изображение является квадратным, чтобы взять размер файла в байтах и ​​взять квадратный корень. Это будет ваша ширина и высота.

256 bytes = 16px x 16px 

:-)

Или, вы можете попробовать считывают информацию EXIF ​​на изображение, используя этот codeplex library

+1

Большое предположение, что изображения квадратные. – SteveM

+2

Я всегда задавался вопросом, как Windows рассчитала это так быстро! – Brandon

+2

Вау! Изображения могут быть не квадратными. Хмммммм, это бросает в него ключ! ;) –

2

Windows не хранит (это) метаданные в любом специальном месте в файловой системе; окно «Свойства» просто считывает их из самого файла изображения.

Я не думаю, что .NET предлагает любые функции для чтения только метаданных с изображения без загрузки всего изображения. Если вы имеете дело с ограниченным числом различных форматов изображений (например, только JPEG, PNG и GIF), вам не следует слишком сильно читать размер изображения из заголовка изображения самостоятельно.

Если, с другой стороны, вам нужно иметь дело со многими форматами изображений, возможно, вы можете взглянуть на исходный код Unix file utility. Он умеет обнаруживать размер многих, разных форматов изображений и невероятно быстро загружается.

2

Чтобы получить ширину и высоту изображения (по существу, как вы выразились, метаданные), вы должны : открыть файл, разобрать какую-то информацию заголовка и получить то, что вы хотите.

Вам не нужно будет считывать всю информацию о цвете/растровой картинке, только заголовок.

Точно так же Windows может загружать значки из файлов приложений, фактически не выполняя их.

0

Для чтения свойств, отображаемых на Windows Explorer, вы можете использовать управления Microsoft Shell и автоматизации компонент. Преимущество этого в том, что вам не нужна сторонняя библиотека (COM-объект уже существует) или дополнительный код для разбора заголовка изображения и что он будет работать с различными форматами.

Пример кода можно найти в ответе на вопрос related question.

4

Используйте класс System.Drawing.Image.

 Image img = Image.FromFile(fileName); 
     ImageFormat format = img.RawFormat; 
     Console.WriteLine("Image Type : "+format.ToString()); 
     Console.WriteLine("Image width : "+img.Width); 
     Console.WriteLine("Image height : "+img.Height); 
     Console.WriteLine("Image resolution : "+(img.VerticalResolution*img.HorizontalResolution)); 

     Console.WriteLine("Image Pixel depth : "+Image.GetPixelFormatSize(img.PixelFormat)); 
     Console.WriteLine("Image Creation Date : "+creation.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Creation Time : "+creation.ToString("hh:mm:ss")); 
     Console.WriteLine("Image Modification Date : "+modify.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Modification Time : "+modify.ToString("hh:mm:ss")); 

 Смежные вопросы

  • Нет связанных вопросов^_^