2014-07-13 14 views
5

Per un'applicazione desktop Vista + che elabora le immagini e deve essere scritta in C#, quale delle seguenti tecnologie (o combinazioni_ si consiglia: System.Drawing (GDI +) vs System.Windows.Media vs Direct2D + DirectWrite + WIC L'elaborazione delle immagini coinvolgerà tutti i tipi di disegno primitivo, riempiendo, lavorando con testo, rotazioni, traslazioni, ridimensionamento, lavorando con i dati dei pixel direttamente usando In generale, quanto sono valide le tecnologie sopra descritte per manipolare le bitmap?System.Drawing (GDI +) vs System.Windows.Media (WPF) vs Direct2D + DirectWrite + WIC

Inoltre, se qualcuno conosce una tabella di confronto valida e dettagliata che elenca le funzionalità e gli equivalenti diversi fianco a fianco, nonché quello che non è supportato Sarebbe fantastico! Ad esempio, ci sono equivalenti ColorMatrix in WP F e Direct2D? Dopo aver esaminato l'implementazione di Direct2D da parte di SharpDX, ad esempio, mi è rimasta l'impressione che anche se Microsoft la posizionasse come alternativa completa a GDI +, non avrei potuto trovare tutte le funzionalità di GDI + in Direct2D.

Inoltre, considerando che è il 2014, diresti che almeno per la manipolazione delle immagini (se non la parte dell'interfaccia utente delle cose, dove WPF sembra essere una scelta molto migliore), GDI + sarebbe ok per i prossimi 5 o così anni? O dovrei davvero considerare l'utilizzo di tutte e 3 le tecnologie in cui ognuna funziona meglio?

Grazie.

+0

Quali caratteristiche in GDI + mancano in Direct2D? –

+0

GDI + non è l'elaborazione di immagini, è solo un wrapper su Win32 GDI che supporta principalmente per il rendering dell'interfaccia utente (non immagini). Quindi le funzionalità sono abbastanza limitate. Penso che dovresti cercare una libreria di immagini per .NET, con tali librerie puoi fare qualsiasi operazione (su un'immagine) che ti piace, ad esempio eseguire trasformazioni complicate, ... La grafica in WPF è molto meglio che in Winforms, tuttavia è anche orientato all'interfaccia utente piuttosto che focalizzato sull'immagine. –

+0

@WaltRitscher Bene, ad esempio: HatchBrush, ColorMatrix, PathGradientBrush per citarne alcuni. –

risposta

1

Attualmente lavoro in un progetto C#/WPF ad alta intensità visiva e ho fatto un po 'di hacking con l'elaborazione delle immagini in Python.

Con la vostra destinazione d'uso, vorrei utilizzare il seguente approccio:

  • Usa WPF namespace, per quanto possibile, cioè, System.Windows.Media. Per quanto ne so, System.Drawing e GDI + in generale utilizzano risorse non gestite e questo potrebbe creare problemi indesiderati ed evitabili;
  • Utilizzare, nel modo più rigoroso possibile, l'architettura MVVM. Ovvero, si dispone di un livello di visualizzazione utilizzato solo per visualizzare le informazioni e di livelli Model e ViewModel che contengono la logica aziendale. Anche se alcuni potrebbero dire che le cose visive non appartengono al livello ViewModel, se la tua applicazione riguarda la manipolazione delle immagini, la tua Business Logic è View-related per definizione (mi ci è voluto molto tempo per capirlo).
  • In caso di dubbio, eseguire l'elaborazione delle immagini utilizzando matrici multidimensionali (nel modello/ViewModel) e associare tali matrici alla vista (tramite DataBinding utilizzando un ValueConverter).

In questo modo, per esempio, si potrebbe avere una classe ImageLayerViewModel per rappresentare un livello, con una proprietà Data (o Value o PixelArray o Raster, a prescindere) essendo un double[height,width,depth].

Potrei elaborare un altro po ', ma non sono sicuro di essere sulla buona strada per rispondere alla tua domanda, quindi scrivi qualsiasi commento se vuoi.

+0

Grazie per la pubblicazione! Tuttavia, sono più preoccupato per l'aspetto dell'elaborazione delle immagini piuttosto che per l'interfaccia utente. Per l'interfaccia utente, probabilmente passerò da WinForms a WPF. Tuttavia ciò non influisce in modo significativo sulla parte di elaborazione dell'immagine, poiché idealmente dovrebbe essere indipendente dall'interfaccia utente e possibilmente anche essere eseguita nel contesto di un servizio (che né GDI + né WPF possono). –

+0

Bene, allora il mio suggerimento è ANCORA PIÙ in termini di non utilizzo dello spazio dei nomi 'System.Windows.Media [.Imaging]' per l'immagine e il contenuto dell'immagine RAPPRESENTA. È possibile che le proprietà ViewModel siano di qualsiasi tipo sia più conveniente per te (trovo che gli array di doppi siano la scelta migliore per il numbercrunching) e utilizzare detto spazio dei nomi solo per le immagini PRESENT visivamente, tramite i convertitori di dati e di valori. Se si dispone di conoscenze sufficienti, è possibile implementare autonomamente gli algoritmi di elaborazione delle immagini, anziché dipendere dai metodi spesso limitati forniti dagli spazi dei nomi di imaging .Net. Spero che questo ti aiuti! – heltonbiker