2009-08-05 65 views
5

Cách tốt nhất để thay đổi kích thước hình ảnh bằng .NET là gì, mà không làm mất dữ liệu EXIF? Tôi đồng ý với việc sử dụng các lớp .NET 2 System.Drawing. *, Các lớp WPF hoặc các thư viện mã nguồn mở. Cách đơn giản nhất mà tôi thấy để xử lý tất cả bây giờ là sử dụng Graphics.FromImage (.NET 2) để thực hiện thay đổi kích thước và ghi lại dữ liệu EXIF ​​với thư viện OpenSource theo cách thủ công (mỗi phần dữ liệu). từng cái một).Thay đổi kích cỡ hình ảnh bằng .NET mà không làm mất dữ liệu EXIF ​​

+0

Tôi đã thêm một dự án trên CodePlex, tính năng thay đổi kích thước mà không làm mất dữ liệu EXIF: http://tidytinypics.codeplex.com/ – TigrouMeow

Trả lời

3

Đề xuất trích xuất dữ liệu EXIF ​​trước khi thay đổi kích thước và sau đó chèn lại dữ liệu EXIF ​​có vẻ như một giải pháp tốt.

Dữ liệu EXIF ​​chỉ có thể được xác định cho các định dạng như JPEG và TIFF - khi bạn tải hình ảnh đó vào đối tượng Đồ họa để thay đổi kích thước, về cơ bản, bạn chuyển hình ảnh thành bitmap thông thường. Do đó, bạn bị mất dữ liệu EXIF.

Chuỗi có liên quan một chút về khai thác EXIF ​​bằng C# here.

+0

Được rồi tôi giữ giải pháp của tôi sau đó, nó làm việc khá tốt, nó chỉ là rất nhiều mã cho không có gì nhưng nó đủ nhanh :) – TigrouMeow

+0

Chỉ có một lựa chọn khác mà tôi biết là ImageMagick - Tôi hiểu bạn có thể thực hiện các phép biến đổi mà không làm mất dữ liệu EXIF. làm điều tương tự bạn đã làm, chỉ có khả năng nhanh hơn. –

2

tôi đã sử dụng Magick .NET và tạo ra 2 phương pháp khuyến nông:

public static byte[] ToByteArray(this Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     return ms.ToArray(); 
    } 

    public static Image AttachMetadData(this Image imgModified, Image imgOriginal) 
    { 
     using (MagickImage imgMeta = new MagickImage(imgOriginal.ToByteArray())) 
     using (MagickImage imgModi = new MagickImage(imgModified.ToByteArray())) 
     { 
      foreach (var profileName in imgMeta.ProfileNames) 
      { 
       imgModi.AddProfile(imgMeta.GetProfile(profileName)); 
      } 
      imgModified = imgModi.ToImage(); 
     } 
     return imgModified; 
    } 
Các vấn đề liên quan