Есть ли дешевый способ получить размеры изображения (jpg, png, ...)? Лучше всего добиться этого, используя только стандартную библиотеку классов (из-за ограничений хостинга). Я знаю, что читать заголовок изображения и самому разбирать его должно быть относительно легко, но похоже, что что-то подобное уже должно быть там. Кроме того, я подтвердил, что следующий фрагмент кода читает все изображение (что мне не нужно):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Ян Зич
источник
источник
Ответы:
Лучше всего, как всегда, найти хорошо протестированную библиотеку. Однако вы сказали, что это сложно, поэтому вот какой-то хитроумный, в основном непроверенный код, который должен работать в изрядном количестве случаев:
Надеюсь, код довольно очевиден. Чтобы добавить новый формат файла, вы добавляете его
imageFormatDecoders
с ключом, представляющим собой массив «волшебных битов», которые появляются в начале каждого файла данного формата, а значение - функцией, которая извлекает размер из потока. Большинство форматов достаточно просты, единственная неприятность - это jpeg.источник
throw e;
а простоthrow;
вместо этого. В вашем XML-документе комментарии ко второму изображениюGetDimensions
также отображаютсяpath
вместоbinaryReader
validateImageData
набор дляfalse
предотвращает GDI + от выполнения дорогостоящего анализа данных изображения, таким образом , существенно уменьшая время загрузки. Этот вопрос проливает больше света на эту тему.источник
new Bitmap()
.Вы пробовали использовать классы WPF Imaging?
System.Windows.Media.Imaging.BitmapDecoder
, и т.д.?Я считаю, что некоторые усилия были предприняты для того, чтобы эти кодеки считывали только подмножество файла, чтобы определить информацию заголовка. Стоит проверить.
источник
Несколько месяцев назад я искал нечто подобное. Я хотел узнать тип, версию, высоту и ширину изображения в формате GIF, но не смог найти в Интернете ничего полезного.
К счастью, в случае с GIF вся необходимая информация находилась в первых 10 байтах:
PNG немного сложнее (ширина и высота по 4 байта):
Как упоминалось выше, wotsit - хороший сайт для подробных спецификаций форматов изображений и данных, хотя спецификации PNG в pnglib гораздо более детализированы. Однако я думаю, что лучше всего начать с статьи в Википедии о форматах PNG и GIF .
Вот мой исходный код для проверки GIF, я также кое-что придумал для PNG:
источник
На основании полученных ответов и некоторого дополнительного поиска кажется, что в библиотеке классов .NET 2 для нее нет функциональности. Поэтому я решил написать свое. Вот его очень грубая версия. На данный момент мне это нужно было только для JPG. Таким образом, он завершает ответ, опубликованный Аббасом.
Здесь нет проверки ошибок или какой-либо другой проверки, но в настоящее время она мне нужна для ограниченной задачи, и ее можно легко добавить. Я тестировал его на некотором количестве изображений, и обычно он не считывает более 6K с изображения. Я думаю, это зависит от количества данных EXIF.
источник
Я сделал это для файла PNG
источник
Да, вы можете это сделать, и код зависит от формата файла. Я работаю на поставщика изображений ( Atalasoft ), и наш продукт предоставляет GetImageInfo () для каждого кодека, который делает минимум для определения размеров и некоторых других простых для получения данных.
Если вы хотите создать свой собственный, я предлагаю начать с wotsit.org , который имеет подробные спецификации практически для всех форматов изображений, и вы увидите, как идентифицировать файл, а также где можно найти в нем информацию.
Если вам комфортно работать с C, то для получения этой информации также можно использовать бесплатный jpeglib. Готов поспорить, что вы можете сделать это с помощью .NET-библиотек, но я не знаю как.
источник
new AtalaImage(filepath).Width
делает что-то подобное?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Обновлен ответ ICR для поддержки прогрессивных jPegs и WebP :)
источник
Это будет зависеть от формата файла. Обычно они указывают это в первых байтах файла. И, как правило, хорошая реализация чтения изображений учитывает это. Однако я не могу указать вам на один для .NET.
источник