Я нашел этот метод:
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 и т.д. числа. Кроме того, я должен был бы создать новый объект изображения каждый раз, когда я хочу найти разрешение изображения?
Я подаю заявку, которая перечисляет текущие изображения в данной папке, таким образом, любая справка ценилась бы.:)
«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
.
Для получения размера:
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, который содержит эту информацию, однако, не наткнулся на нее.
Конечно, вы ответили на свой вопрос, все просто:
Bitmap bmp = new Bitmap(@"winter.bmp");
Console.WriteLine("Image Width: " + bmp.Width);
Console.WriteLine("Image Height: " + bmp.Height);
Информация о DPI действительно полезна только при отображении или печати изображения. В примере кода это преобразование изображения в объект Graphics
, который можно использовать для вывода изображения на экран.
Чтобы ответить на 2-ю часть вопроса, можно разобрать заголовок JPEG-файла, чтобы найти информацию о ширине/высоте без фактической загрузки изображения. Но для этого Вам необходимо знать информацию о заголовке и формате файла для файлов JPEG.