2010-02-05 23 views
6

tôi thấy phương pháp này:Tôi làm cách nào để có được độ phân giải của hình ảnh? (JPEG, GIF, PNG, JPG)

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); 

Nhưng tôi thực sự không hiểu làm thế nào để lấy những gì tôi đang tìm kiếm. Tôi không quan tâm đến DPI, tôi chỉ cần số 1024x768, 1200x1024 etc. Ngoài ra, tôi có phải tạo một đối tượng hình ảnh mới mỗi lần tôi muốn tìm độ phân giải của hình ảnh không?

Tôi đang tạo một ứng dụng liệt kê các hình ảnh hiện tại trong một thư mục nhất định, vì vậy mọi trợ giúp sẽ được đánh giá cao. :)

Trả lời

11

"1024x768" chỉ được gọi là "độ phân giải" trong bối cảnh cài đặt hiển thị của máy tính, và thậm chí sau đó nó là một từ sai không may. Trong hình ảnh "1024x768" chỉ đơn giản là chiều rộng chiều rộng & chiều cao của hình ảnh, như những người khác đã đề cập, bạn đã hiển thị mã truy xuất những con số này. Tinh chỉnh một chút:

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

duy nhất được xây dựng trong phương pháp để có được những con số bạn đang sau là bằng cách tạo ra một trường hợp mới (và, trên thực tế, giải mã toàn bộ hình ảnh) - đó là sẽ được đánh giá cao hiệu quả nếu bạn chỉ cần lấy những con số này cho hàng trăm hình ảnh. Tránh điều này là khó; đây là một điểm khởi đầu: How do I reliably get an image dimensions in .NET without loading the image?


Khi bạn nói về "độ phân giải" bạn thường tham khảo các số dots, or pixels, per inch. Lớp Bitmap lưu trữ số này trong thuộc tính HorizontalResolution/VerticalResolution, trong khi lớp Đồ họa ở DpiX/DpiY.

tính này:

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

có thể được sắp xếp lại cho rõ ràng như sau:

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

nơi phần trong ngoặc vuông tính chiều rộng của hình ảnh theo đơn vị inch.Nhân với g.DpiX sau đó cung cấp cho bạn số pixel trong đối tượng Graphics có cùng chiều rộng bằng inch làm hình ảnh bmp.

2

Để có được kích thước:

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 

Dưới đây là một full list of System.Drawing.Image properties, nếu trường hợp muốn hiển thị những người khác.

Tôi không chắc chắn nếu có một cách nhanh hơn cho toàn bộ thư mục, với Windows Vista/7 có thể có một API mới hơn có chứa thông tin này, đã không đi qua nó mặc dù.

2

Chắc chắn bạn đã trả lời câu hỏi của riêng bạn, nó cũng đơn giản như thế này:

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

Thông báo thông tin Sở KH & ĐT là thực sự chỉ hữu ích khi bạn đang hiển thị hoặc in hình ảnh. Trong mã mẫu nó đang chuyển đổi hình ảnh thành một đối tượng Graphics có thể được sử dụng để vẽ nó vào màn hình.

Để trả lời câu hỏi thứ 2 của bạn, bạn có thể phân tích cú pháp tiêu đề tệp JPEG để tìm thông tin chiều rộng/chiều cao mà không thực sự tải trong hình ảnh. Nhưng để làm điều này, bạn cần phải biết thông tin tiêu đề và định dạng tệp cho các tệp JPEG.

Các vấn đề liên quan