Сентябрь 27, 2011 Опубликовал: Vader
Понадобилось мне давеча узнать формат изображений хранящихся в базе данных. Никаких опознавательных знаков к этим изображениям не прилагалось - просто блобы с кучей непонятных байтов. Первое, что пришло в голову - сохранить эти блобы на диск, и открывая их по очереди блокнотом определять формат по сигнатуре в начале файла. В принципе, идея оказалась вполне жизнеспособной, только очень уж невесело было просматривать многомегабайтные файлы в notepad'е. После надцатого файла я решил, что так дело не пойдет, и написал небольшую утилиту на C#, которая справляется с этой задачей куда лучше блокнота. Собственно, вот она:
- using System;
- using System.Drawing;
- namespace ImageFormatVerifier
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- Image image = Image.FromFile(args[0]);
- var imageFormat = "";
- if (System.Drawing.Imaging.ImageFormat.Bmp.Equals(image.RawFormat))
- {
- imageFormat = "BMP";
- }
- if (System.Drawing.Imaging.ImageFormat.Emf.Equals(image.RawFormat))
- {
- imageFormat = "EMF";
- }
- if (System.Drawing.Imaging.ImageFormat.Gif.Equals(image.RawFormat))
- {
- imageFormat = "GIF";
- }
- if (System.Drawing.Imaging.ImageFormat.Icon.Equals(image.RawFormat))
- {
- imageFormat = "ICON";
- }
- if (System.Drawing.Imaging.ImageFormat.Jpeg.Equals(image.RawFormat))
- {
- imageFormat = "JPEG";
- }
- if (System.Drawing.Imaging.ImageFormat.Png.Equals(image.RawFormat))
- {
- imageFormat = "PNG";
- }
- if (System.Drawing.Imaging.ImageFormat.Tiff.Equals(image.RawFormat))
- {
- imageFormat = "TIFF";
- }
- if (System.Drawing.Imaging.ImageFormat.Wmf.Equals(image.RawFormat))
- {
- imageFormat = "WMF";
- }
- if (imageFormat.Length == 0){
- imageFormat = "Unknown";
- }
- Console.WriteLine(imageFormat);
- }
- catch
- {
- Console.WriteLine("Unable to load image from file");
- Environment.Exit(0);
- }
- }
- }
- }
Использовать утилиту совсем не сложно:
C:\>ImageFormatVerifier.exe myimagefile.whatever PNG C:\>
Все.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии и скачивать файлы


Предложение рефактора
Я если честно не профи в C#, но немножко погуглив вроде нашёл что вместо многочисленной серии if можно написать как-то так:
imageFormat = image.RawFormat.ToString
RawFormat возвращает обект типа ImageFormat, а на нём переписан метод ToString. Хотя может где-то и ошибаюсь.
Я тоже не то чтобы профи в
Я тоже не то чтобы профи в шарпе, так что ничего страшного.
Так как вы предлагаете, я тоже пытался сделать, но дело в том, что
image.RawFormat.ToString()возвращает GUID, а точнее строку типа такой:
, а как расшифровать гуиды я так и не нашел.
Хотя, я, конечно, балбес. Только что погуглил по самому GUID'у и сразу же обнаружил кучу разных сайтов с расшифровкой, так что желающие могут сами сделать что-то вроде:
Возможно, получится несколько красивее и короче моего варианта.
Красиво не получается. :(
Ну да. Красиво не получается.
Единственное что, вроде тогда можно чтоб не искать Guid использовать ImageFormat.Jpeg
В никсах есть программа file, которая определяет тип файла
В никсах есть программа file, которая определяет тип файла. Наверняка имеется порт под винду.
bash$ file common/src/web/markerTransparent.png
common/src/web/markerTransparent.png: PNG image data, 20 x 34,
8-bit/color RGBA, non-interlaced
bash$ file common/src/web/banner.gif
common/src/web/banner.gif: GIF image data, version 89a, 644 x 41
Знаю о такой, она, вроде бы,
Знаю о такой, она, вроде бы, и в Cygwin'е есть. Но писать в тест кейсах - "поставьте Linux или Cygwin" не комильфо
Под винду есть ещё TrID
http://mark0.net/soft-trid-e.html
Спасибо за ссылку. Неплохая
Спасибо за ссылку.
Неплохая программулина, правда есть забавные моменты, например, так в ее понимании выглядит JPG файл:
И еще есть один не очень приятный момент: