2014-07-13 24 views
5

Đối với ứng dụng Desktop Vista + xử lý hình ảnh và được viết bằng C#, công nghệ nào sau đây (hoặc các kết hợp_ sẽ bạn đề xuất: System.Drawing (GDI +) vs System.Windows.Media vs Direct2D + DirectWrite + WIC. Xử lý hình ảnh sẽ bao gồm tất cả các loại bản vẽ nguyên gốc, điền, làm việc với văn bản, xoay, dịch, chia tỷ lệ, làm việc với dữ liệu pixel trực tiếp sử dụng Nói chung, các công nghệ trên hoạt động tốt như thế nào để thao tác bitmap?System.Drawing (GDI +) vs System.Windows.Media (WPF) vs Direct2D + DirectWrite + WIC

Ngoài ra, nếu có ai biết biểu đồ so sánh chi tiết và tốt sẽ liệt kê các tính năng và tương đương khác nhau, cũng như những gì không được hỗ trợ Ví dụ, có ColorMatrix tương đương trong WP F và Direct2D? Sau khi điều tra việc triển khai DirectDD của SharpDX, ví dụ, tôi đã để lại ấn tượng rằng mặc dù Microsoft đặt nó như một sự thay thế hoàn toàn cho GDI +, tôi không thể tìm thấy tất cả chức năng của GDI + trong Direct2D. Ngoài ra, xem xét đó là năm 2014, bạn sẽ nói rằng ít nhất là để thao tác hình ảnh (nếu không phải là một phần giao diện của sự vật, nơi WPF có vẻ là một lựa chọn tốt hơn nhiều), GDI + sẽ là ok cho 5 tiếp theo hoặc lâu hơn năm? Hay tôi thực sự nên cân nhắc sử dụng tất cả 3 công nghệ trong đó mỗi công nghệ hoạt động tốt nhất?

Cảm ơn bạn.

+0

Bạn thiếu gì trong GDI + trong Direct2D? –

+0

GDI + không phải là xử lý hình ảnh, nó chỉ là một trình bao bọc xung quanh Win32 GDI hỗ trợ chủ yếu cho việc hiển thị giao diện người dùng (không phải hình ảnh). Vì vậy, các tính năng khá hạn chế. Tôi nghĩ bạn nên tìm kiếm một số thư viện hình ảnh cho .NET, với các thư viện như vậy bạn có thể thực hiện bất kỳ thao tác nào (trên một hình ảnh) mà bạn thích, chẳng hạn như thực hiện một số biến đổi phức tạp, ... Đồ họa trong WPF tốt hơn nhiều so với Winforms. nó cũng định hướng giao diện người dùng thay vì tập trung vào hình ảnh. –

+0

@WaltRitscher Ví dụ: HatchBrush, ColorMatrix, PathGradientBrush để đặt tên một vài. –

Trả lời

1

Tôi hiện đang làm việc trong một dự án C#/WPF chuyên sâu bằng hình ảnh và đã thực hiện một số tính năng hấp dẫn với xử lý hình ảnh bằng Python.

Với mục đích sử dụng của bạn, tôi sẽ sử dụng phương pháp sau đây:

  • Sử dụng WPF không gian tên càng nhiều càng tốt, có nghĩa là, System.Windows.Media. Theo như tôi biết, System.Drawing và GDI + nói chung sử dụng tài nguyên không được quản lý và điều đó có thể tạo ra các vấn đề không mong muốn, có thể tránh được;
  • Sử dụng, càng đúng càng tốt, kiến ​​trúc MVVM. Tức là, bạn có một lớp Chế độ xem được sử dụng chỉ để hiển thị thông tin và các lớp Mô hình và ViewModel chứa logic nghiệp vụ. Mặc dù một số người có thể nói rằng nội dung hình ảnh không thuộc lớp ViewModel, nếu ứng dụng của bạn giao dịch với thao tác hình ảnh thì Business Logic của bạn là Xem liên quan theo định nghĩa (đã mất một thời gian dài để tìm ra điều này).
  • Khi nghi ngờ, hãy thực hiện xử lý hình ảnh bằng các mảng đa chiều (trong Model/ViewModel) và liên kết các mảng đó với khung nhìn (thông qua DataBinding sử dụng một ValueConverter).

Bằng cách đó, ví dụ, bạn có thể có một lớp ImageLayerViewModel để đại diện cho một lớp, với một tài sản Data (hoặc Value hay PixelArray hoặc Raster, bất cứ điều gì) là một double[height,width,depth].

Tôi có thể giải thích một số chi tiết, nhưng tôi không chắc chắn là bạn đang đi đúng hướng để trả lời câu hỏi của bạn, vì vậy hãy viết bất kỳ bình luận nào nếu bạn muốn.

+0

Cảm ơn bạn đã đăng bài! Tuy nhiên, tôi quan tâm hơn đến khía cạnh xử lý hình ảnh hơn là giao diện người dùng. Đối với UI, tôi có lẽ sẽ chuyển từ WinForms sang WPF. Tuy nhiên điều đó không thực sự ảnh hưởng đến phần xử lý hình ảnh, vì lý tưởng đó nên độc lập với giao diện người dùng và thậm chí có thể chạy trong ngữ cảnh của một Dịch vụ (mà cả GDI + lẫn WPF đều không thể). –

+0

Vâng, sau đó đề xuất của tôi thậm chí còn THÊM về việc không sử dụng không gian tên 'System.Windows.Media [.Imaging]' cho nội dung hình ảnh và hình ảnh REPRESENT. Bạn có thể có thuộc tính ViewModel của bạn thuộc bất kỳ kiểu nào thuận tiện hơn cho bạn (tôi thấy mảng đôi để là lựa chọn tốt nhất cho việc sắp xếp số), và chỉ sử dụng vùng tên đã nói cho các hình ảnh HIỆN TẠI, thông qua bộ chuyển đổi dữ liệu và giá trị. Nếu bạn có đủ kiến ​​thức, bạn có thể tự thực hiện các thuật toán xử lý hình ảnh, thay vì tùy thuộc vào các phương thức thường bị hạn chế do các không gian tên ảnh .Net cung cấp. Hi vọng điêu nay co ich! – heltonbiker

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