Sto utilizzando le classi System.Drawing
per generare miniature e immagini con filigrana da foto caricate dall'utente. Gli utenti sono anche in grado di ritagliare le immagini utilizzando jCrop dopo aver caricato l'originale. Ho preso in mano questo codice da qualcun altro e sto cercando di semplificarlo e ottimizzarlo (viene utilizzato su un sito Web ad alto traffico).Gestione efficiente delle immagini in C#
Il precedente aveva metodi statici che hanno ricevuto un bitmap come parametro e ne ha restituito uno, allocando e smaltendo internamente un oggetto Graphics
. La mia comprensione è che un'istanza Bitmap
contiene l'intera immagine in memoria, mentre Graphics
è fondamentalmente una coda di operazioni di disegno e che è idempotente.
Il processo attualmente funziona come segue:
- ricevere l'immagine e conservarla in un file temporaneo.
- Ricevi le coordinate di ritaglio.
- Carica la bitmap originale in memoria.
- Creare una nuova bitmap dall'originale, applicando il ritaglio.
- Regolazione della luminosità assurda sulla nuova bitmap, forse (?) Restituire una nuova bitmap (preferirei non toccarla, l'aritmetica del puntatore abbonda!), Chiamarla A.
- Creare un'altra bitmap da la risultante uno, applicando la filigrana (consente di chiamare questo B1)
- Creare un bitmap 175x175 da anteprima A.
- Creare un bitmap 45x45 da anteprima A.
questo mi sembra un sacco di allocazioni di memoria; la mia domanda è questa: è una buona idea riscrivere parti del codice e riutilizzare le istanze Graphics
, creando in effetti una pipeline? In effetti, ho solo bisogno di 1 immagine in memoria (il caricamento originale), mentre il resto può essere scritto direttamente su disco. Tutte le immagini generate avranno bisogno delle trasformazioni di ritaglio e luminosità e una singola trasformazione che è unica per quella versione, creando effettivamente un albero di operazioni.
Qualche idea o idea?
Oh, e dovrei probabilmente dire che questa è la prima volta che sto lavorando con .NET, quindi se qualcosa che dico sembra confuso, per favore, sopportami e datemi qualche suggerimento.
È un po 'sfortunato che questa sia la tua prima interazione con .NET. Il modello IDisposable è la mia unica vera frustrazione duratura con la struttura. Questo business 'uso' è la caratteristica più usata regolarmente esoterica - la maggior parte delle cose è molto semplice. – overslacked
Buona domanda, dico! +1 – Cerebrus
Ho dovuto cercare "idempotente" ... buona parola. – JasonRShaver