2012-08-23 66 views
6

Tôi có một tệp EMF. Tôi muốn thay đổi kích thước nó nhỏ hơn.Làm cách nào để thay đổi kích thước (thu nhỏ) EMF (Metafile) trong .Net?

Làm cách nào để thực hiện điều này trong .net (hoặc với bất kỳ công cụ nào) mà không bị mờ hình ảnh?

Hình ảnh được định lại kích thước sẽ được chuyển đổi sang định dạng khác (png/jpg/bất kỳ), tôi có thể xử lý (tôi nghĩ).

Tôi chưa tìm thấy ví dụ rõ ràng trong .Net (hoặc bất kỳ nền tảng ngôn ngữ nào cho vấn đề) đề cập đến emf/metafiles.

Tôi đã xem trong Lập trình đồ họa với GDI + nhưng nó chỉ giới thiệu Siêu dữ liệu.

Tôi đã thử Image Magick nhưng bạn phải chuyển sang định dạng khác (mà tôi cần làm) và kết quả bị mờ (khi bị thu nhỏ và chuyển thành png chẳng hạn).

Tôi đã thử Inkscape, nhưng bạn chỉ có thể nhập tệp EMF và Inkscape nhập khẩu lộn ngược và tỷ lệ phần trăm thành bản vẽ hiện có.

Ngoài ra, (không cười) Tôi đã mở nó trong Window's Paint (một trong số ít các chương trình phần mềm chỉnh sửa hình ảnh sẽ mở emf) và thay đổi kích cỡ bản vẽ, lại bị mờ.

Cập nhật: Đây là mã tôi đang sử dụng để đổi kích thước.

Tác phẩm này, nhưng hình ảnh kết quả bị mờ. Mã này chỉ là một thói quen hình ảnh tái định cỡ chung chung, không cụ thể cho EMF của

private static Image resizeImage(Image imgToResize, Size size) 
{ 
    int sourceWidth = imgToResize.Width; 
    int sourceHeight = imgToResize.Height; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)size.Width/(float)sourceWidth); 
    nPercentH = ((float)size.Height/(float)sourceHeight); 

    if (nPercentH < nPercentW) 
     nPercent = nPercentH; 
    else 
     nPercent = nPercentW; 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap b = new Bitmap(destWidth, destHeight); 
    Graphics g = Graphics.FromImage((Image)b); 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
    g.Dispose(); 

    return (Image)b; 
} 

Nguồn: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

+0

Tôi sẽ hỏi bạn đang vẽ EMF ở đâu. Nhưng, những gì Magnus vừa đăng tải sẽ bao gồm mọi thứ bạn muốn làm. –

Trả lời

5

Im sử dụng đoạn mã sau (tương tự như những gì bạn có sau khi chỉnh sửa) để tái định cỡ một hình ảnh emf. Nó dường như không bị mờ.

var size = new Size(1000, 1000); 

using(var source = new Metafile("c:\\temp\\Month_Calendar.emf")) 
using(var target = new Bitmap(size.Width, size.Height)) 
using(var g = Graphics.FromImage(target)) 
{ 
    g.DrawImage(source, 0, 0, size.Width, size.Height); 
    target.Save("c:\\temp\\Month_Calendar.png", ImageFormat.Png); 
} 
+0

Magnus, Có điều này hoạt động tốt để tăng kích thước. Tuy nhiên khi bạn thu nhỏ nó (giảm kích thước), bạn sẽ nhận được một hình ảnh mờ. So sánh điều này để tải một EMF trong Word hoặc Visio. Bạn có thể thu nhỏ hình ảnh mà không làm giảm chất lượng. Khi bạn làm như vậy với phương pháp của bạn (hoặc phương pháp của tôi ở trên) bạn bị mất chất lượng. –

+0

@ChrisWeber bạn có thể cân nhắc sử dụng [Thư viện MFRasterizer] (http://wmf.wholegroup.com/) – Magnus

+1

Hóa ra chất lượng này đủ tốt cho mục đích của tôi. Mã trong câu hỏi của tôi làm việc cho tôi b/c nó giữ hình ảnh theo tỷ lệ. –

1

Net có thể tải và vẽ EMF:

Metafile myMetafile = new Metafile("SampleMetafile.emf"); 
graphics.DrawImage(myMetafile, 100, 100); 

Nếu hình ảnh kết quả là mờ, hãy xem xét save as PNG/GIF trong đó có nén lossless, hoặc trả cho một hình ảnh lớn hơn.

Nếu kết quả vẫn chưa đủ tốt, thì bạn cần sử dụng GDI32 để tải và hiển thị.

+0

Tôi có thể tải nó tốt. Sự cố đang thay đổi kích thước. –

+1

Có ba nguyên nhân gây mờ: 1) kích thước hình ảnh, 2) nén hình ảnh, 3) hiển thị. Khi GDI + biểu hiện EMF, nó sẽ hiển thị với kết xuất chống nhiễu, điều này có thể gây ra mờ. –

0

Thay đổi kích thước EMF có thể khá phức tạp. Bạn có thể rasterize hình ảnh trong một bitmap nhỏ hơn, nhưng kết quả không phải là luôn luôn những gì bạn mong đợi. Dưới đây là kết quả của một chiến lược xem:

3 different strategies

Đối với dự án riêng của tôi, tôi quyết định sử dụng chiến lược cuối cùng: thổi lên EMF trong một bitmap 4x kích thước của EMF, lưu nó vào PNG và sau đó lưu PNG trong một tệp nhỏ hơn.

Tôi đã viết blog về chủ đề: Rasterizing EMF files with .Net/C#. Và tôi đã tạo ra một class on GitHub giúp thay đổi kích thước của EMF, nhưng nó là một cách phức tạp hơn một chút để làm việc (với một hộp giới hạn).

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