Как я могу получить разрешение изображения? (JPEG, GIF, PNG, JPG) - PullRequest
6 голосов
/ 05 февраля 2010

Я нашел этот метод:

Graphics g = e.Graphics;
Bitmap bmp = new Bitmap("winter.jpg");
g.DrawImage(bmp, 0, 0);
Console.WriteLine("Screen resolution: " + g.DpiX + "DPI");
Console.WriteLine("Image resolution: " + bmp.HorizontalResolution + "DPI");
Console.WriteLine("Image Width: " + bmp.Width);
Console.WriteLine("Image Height: " + bmp.Height);

SizeF s = new SizeF(bmp.Width * (g.DpiX / bmp.HorizontalResolution),
                    bmp.Height * (g.DpiY / bmp.VerticalResolution));

Console.WriteLine("Display size of image: " + s);

Но я не совсем понимаю, как получить то, что я ищу. Мне не интересен DPI, мне просто нужны цифры 1024x768, 1200x1024 и т. Д. Кроме того, придется ли мне создавать новый объект изображения каждый раз, когда я хочу найти разрешение изображения?

Я делаю приложение, которое отображает текущие изображения в данной папке, поэтому любая помощь будет оценена. :)

Ответы [ 3 ]

13 голосов
/ 05 февраля 2010

«1024x768» называют «разрешением» только в контексте настроек дисплея компьютера, и даже в этом случае это неудачное неправильное название. В изображении «1024x768» - это просто ширина & высота изображения, так что, как уже упоминали другие, вы уже показали код, который получает эти числа. Слегка подправлен:

var img = Image.FromFile(@"C:\image.jpg");
Console.WriteLine(img.Width + "x" + img.Height); // prints "1024x768" (etc)

Единственный встроенный метод для получения нужных вам чисел - это создание нового экземпляра (и, фактически, декодирование всего изображения), что будет крайне неэффективно, если вам нужно будет извлечь только эти числа для нескольких сотен изображений. Избежать этого сложно; вот отправная точка: Как надежно получить размеры изображения в .NET без загрузки изображения?


Когда вы говорите о «разрешении», вы обычно ссылаетесь на число точек или пикселей на дюйм . Класс Bitmap сохраняет это в свойствах HorizontalResolution / VerticalResolution, а класс Graphics - в DpiX / DpiY.

Этот расчет:

bmp.Width * (g.DpiX / bmp.HorizontalResolution)

можно изменить для ясности следующим образом:

(bmp.Width / bmp.HorizontalResolution) * g.DpiX

где часть в скобках вычисляет ширину изображения в дюймах. Умножение на g.DpiX дает количество пикселей в объекте Graphics, ширина которого в дюймах равна ширине изображения bmp.

.
3 голосов
/ 05 февраля 2010

Конечно, вы ответили на свой вопрос, это так просто:

Bitmap bmp = new Bitmap(@"winter.bmp");     
Console.WriteLine("Image Width: " + bmp.Width);
Console.WriteLine("Image Height: " + bmp.Height);

Информация о DPI действительно полезна только при отображении или печати изображения. В примере кода оно преобразует изображение в объект Graphics, который можно использовать для его рисования на экране.

Чтобы ответить на 2-ю часть вашего вопроса, вы можете проанализировать заголовок файла JPEG, чтобы найти информацию о ширине / высоте без фактической загрузки изображения. Но для этого вам нужно знать информацию заголовка и формат файла для файлов JPEG.

3 голосов
/ 05 февраля 2010

Чтобы получить размер:

string path = @"C:\winter.jpg";
Image img = Image.FromFile(path);
Console.WriteLine("Image Width: " + img.Width); //equals img.Size.Width
Console.WriteLine("Image Height: " + img.Height); //equals img.Size.Height

Вот полный список свойств System.Drawing.Image , если требуется отображать другие.

Я не уверен, есть ли более быстрый способ для всего каталога, в Windows Vista / 7 может быть более новый API, который содержит эту информацию, хотя я и не встречал его.

...