2009-11-23 19 views
7

Có cách nào để vẽ một metafile emf (đã xuất thành một công cụ vẽ) với tính năng chống răng cưa được kích hoạt không? Các công cụ tôi đã thử không có khả năng xuất các tập tin emf bị tổn hại vì vậy tôi tự hỏi liệu tôi có thể bật lại nó theo cách thủ công khi vẽ emf trong ghi đè OnPaint của các Điều khiển của tôi không.Vẽ emf antialiased

Nếu bất kỳ ai có thể xác nhận về mặt kỹ thuật có thể tạo tệp EMF chống răng cưa, giải pháp khác sẽ là sử dụng công cụ vẽ có thể xuất sang EMF chống răng cưa hoặc chuyển đổi bên thứ ba thực hiện việc này sau. Nếu có ai biết một công cụ như vậy, hãy cho tôi biết.

CHỈNH SỬA: Khi nhìn vào emf instructions, dường như chính emf đó thực sự có thể lưu trữ thông tin cho dù thông tin đó có được hiển thị chống răng cưa hay không. Ít nhất tôi không thể tìm thấy bất cứ điều gì. Nó có nhiều khả năng rằng các antialiasing được thực hiện bởi các công cụ phát lại. Ví dụ khi tôi mở một emf trong Word 2007 nó được trả về antialiased. Nhưng không phải khi tôi vẽ nó với GDI + "công cụ phát lại" (Graphics.DrawImage(...)). hoặc khi tôi xem trình xem hình ảnh cửa sổ chuẩn. Điều này làm cho tôi tin rằng một số công cụ thực sự có công cụ phát lại emf của riêng mình. Vì vậy, có thể có thư viện .NET miễn phí (tốt nhất là với mã nguồn) cung cấp cho tôi một mô hình đối tượng của các lệnh emf được lưu trữ trong tệp emf được phân tích cú pháp để tôi có thể phát lại nó thay vì sử dụng Graphics.DrawImage(...)?

+2

Nếu mọi thứ khác không thành công, bạn có thể vẽ nó ở kích thước gấp bốn lần và sau đó xuống dưới mẫu. – Joey

+0

Tôi đã thử điều này, ở kích thước nhỏ này vẫn trông xấu xí Cũng sử dụng cách tiếp cận này có proably một chi phí bộ nhớ xấu xí. (Tôi sẽ hiển thị rất nhiều UserControls như vậy cùng một lúc). – bitbonk

+0

Trùng lặp: http://stackoverflow.com/questions/1422949/emf-with-forced-antialiasing – liori

Trả lời

9

Chúng tôi gặp sự cố tương tự trong dự án DirectX. Upscaling và downscaling làm việc ở một mức độ nhất định, nhưng nó giả mạo nó. Nếu đó là một cái gì đó bạn cần phải làm hơn và hơn, bạn có thể có thể phân tích các hồ sơ của WMF và vẽ chúng với GDI + antialiased.

Các chủ đề sau này trở lại lên (nhưng chúng từ năm 2005 mọi thứ có thể đã thay đổi):

http://www.dotnet247.com/247reference/msgs/28/144605.aspx

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-sdk/1127/Graphics-DrawImage-metafile-no-antialiasing

[Edit:]

Ba chương trình có thể thực hiện công việc cho bạn: Tôi giả sử bạn đồng ý với việc thực hiện nó bằng tay:

http://emf-to-vector-converter-command-line-ser.smartcode.com/info.html

http://www.verypdf.com/pdf-editor/index.html

http://www.ivanview.com/converter/emf-batch-converter.html

[Chỉnh sửa II:]

Vâng, đây là một chương trình mà sẽ cho phép bạn kiểm tra một EMF theo những cách khác nhau:

http://download.cnet.com/windows/3055-2383_4-10558240.html?tag=pdl-redir

... và đây là phần mềm miễn phí thư viện sẽ cho phép bạn phân tích cú pháp 122 của các lệnh EMF và xuất chúng trong GDI +. Đó có lẽ nên làm các trick:

http://www.codeproject.com/KB/GDI-plus/emfexplorer.aspx?msg=2359423

... oh, và thông báo cũng nhận xét # 3 trên trang codeproject. Có vẻ như ai đó đã đập đầu vào tường trước đó. Hi vọng nó có thể giải quyết vấn đề của bạn.

+0

Các chương trình đó dường như chỉ chuyển đổi sang các định dạng tệp khác. Chúng tôi đã chọn EMF để hiển thị nghệ thuật véc tơ vì đây là dạng vector duy nhất mà GDI + có thể xử lý. Chúng ta cần vẽ nghệ thuật từ mã (do đó GDI +) bởi vì chúng ta sửa đổi nó một cách linh động khi chạy và làm động nó. Cũng hiển thị emf với GDI + rất có thể là cách thân thiện với CPU và bộ nhớ nhất để hiển thị nghệ thuật vector. Sử dụng định dạng khác mà emf không có vẻ hữu ích. Một giải pháp mát mẻ sẽ là có một Vectorgrafik (bất kỳ định dạng nào) để chuyển đổi công cụ C# GDI +. – bitbonk

+0

Trong trường hợp đó, tại sao bạn không sử dụng một hệ thống vẽ chế độ được giữ lại và bỏ qua EMF alltogether? Về lý thuyết bạn có thể lưu trữ các hình ảnh EMF và sử dụng một thư viện tùy chỉnh để trích xuất từng hình dạng và vẽ lại chúng bằng GDI (+). Tuy nhiên, từ mô tả của bạn về vấn đề, tôi đã tạo ra một định dạng độc quyền chỉ * mô tả * các hình ảnh bằng cách sử dụng các đối tượng, sau đó đưa nó lên bất kỳ bề mặt nào được đề cập. Một cách tiếp cận khác có thể là sử dụng swf, được hỗ trợ tốt hơn, được tài liệu tốt và IMO linh hoạt hơn. – Pedery

+0

Chúng ta không thể sử dụng định dạng propietary vì chúng ta cần vẽ nghệ thuật bằng phần mềm vẽ thông thường (illustrator, inkscape, coreldraw ... một trong số đó). – bitbonk

4

EMF đang sử dụng các lệnh GDI, chứ không phải GDI +, vì vậy nó không có khái niệm về khử răng cưa. Tôi nghi ngờ rằng khi bạn yêu cầu GDI + hiển thị tệp, nó sẽ gửi nó tới GDI và chỉ sao chép bitmap kết quả.

Nhân đôi mã này sẽ giống như reimplementing GDI, vì vậy nó không khả thi một cách khủng khiếp. Không phải không thể, chỉ là một công việc lớn hơn lợi ích sẽ biện minh. Nếu có một tiện ích nguồn mở có thể mở các tệp EMF bên ngoài Windows, bạn có thể xem xét mã nguồn.

Đoán của tôi là Word đang sử dụng mẹo gỡ xuống.

3

Tệp EMF là danh sách các lệnh GDI. Vì vậy, nó sẽ không được chống aliaised, ngay cả khi theo GDI +, bạn đặt một cuộc gọi SmoothingMode() trước khi vẽ. Bạn sẽ phải liệt kê các lệnh GDI, sau đó dịch nó thành các lệnh GDI +.

Trong Vista/Seven, bạn có thể sử dụng hàm GDI + 1.1 có tên là GdipConvertToEmfPlus/ConvertToEmfPlus. Nếu bạn muốn chương trình của bạn làm việc với XP, bạn nên viết liệt kê của riêng bạn, sau đó chuyển đổi sang lệnh GDI +.

Điều tra GDI sau đó chuyển đổi thành GDI + là có thể được thực hiện bởi emfexplorer, nhưng tôi đã viết some code perhaps more easy to follow, ngay cả khi được viết bằng Delphi.

Tôi đang đặt câu trả lời này ngay bây giờ (tôi trễ), vì tôi đã dành rất nhiều thời gian để tìm ra giải pháp bằng ConvertToEmfPlus và viết một số mã nguồn mở được điều chỉnh trong trường hợp phương pháp này không khả dụng.

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