Come ottenere i colori “reali” quando si esporta un disegno GDI a bmp
-
02-10-2019 - |
Domanda
sto sviluppando un gestore web ASP.Net che restituisce immagini facendo un System.Windows.Forms.Control
in-memory e quindi esporta il controllo reso come bitmap compressa in PNG, utilizzando il metodo DrawToBitmap()
. Le classi sono completamente funzionante ormai, tranne per un problema con l'assegnazione dei colori. Con l'esempio, questo è un indicatore generato dal gestore web.
I colori assegnati alle parti interne del calibro sono rossi (#FF0000
), giallo (#FFFF00
) e verde (#00FF00
), ma ho solo una versione ottusamente di ogni colore (#CB100F
per il rosso, #CCB70D
per il giallo e #04D50D
per il verde ).
Lo sfondo è un file BMP che contiene la sfumatura di colore. La perdita di colore avviene se lo sfondo è un gradiente come campione, una tela nera, una tela bianca, una tela trasparente, anche quando non v'è un insieme di sfondo.
- Con sfondo nero
- con sfondo trasparente
- Con uno sfondo bianco
- Senza un insieme di sfondo
- Con il formato di pixel in Format32bppArgb
Ho provato più profondità bitmap a colori, formati di output, il livello di compressione, ecc, ma nessuno di loro sembra funzionare. Tutte le idee?
Questo è un estratto del codice sorgente:
Bitmap bmp = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Image bgimage = (Image) HttpContext.GetGlobalResourceObject("GraphicResources", "GaugeBackgroundImage");
Canvas control_canvas = new Canvas(); //inherits from Control
....
//the routine that makes the gauge
....
control_canvas.DrawToBitmap(bmp, new Rectangle(0, 0, w, h));
Soluzione 4
Canvas era una classe fornito da una terza parte. Abbiamo trovato un bug nel loro pacchetto, che ha rilasciato una nuova versione, e il problema è stato finalmente risolto. Grazie comunque per il vostro tempo!
Altri suggerimenti
Quando si disegna i colori, verificare che il canale alfa è impostato correttamente pure. Se avete qualche alfa che si fondono con quello sfondo scuro e dare un colore più scuro.
Hai provato questo con solo PNG? Mi ha colpito questo problema con PNG o JPEG (?) In un browser molto tempo fa, ma IIRC GIF eliminato il problema:
Si noti che non sto dicendo GIF risolverà il vostro problema a lungo sbagliato ma può dire se il PNG di scrittura / lettura è il problema. Provate, provate BMP, provare qualcosa. Non credo che il PNG. Si potrebbe provare il dumping i r g valori di b ad un file di log (o su disco come prima e l'importazione in Photoshop e) vedere quello che i numeri sono prima di scrivere il bitmap. (Usa LockBits , ci sono tutorial per codice su come ottenere byte dentro e fuori di bitmap).
Ho appena capito che avete parti gialle davvero brillante su quel puntatore triangolo, quindi il problema è probabile che l'immagine di sfondo. Stai disegnando quei archi con primitive o il caricamento di una bitmap? Si potrebbe essere avere problemi di gamma, problemi di spazio colore, ecc a seconda del formato di input, supponendo che si sta utilizzando un'immagine per la parte misuratore di rosso / giallo / verde. Prova a disegnare quelle forme nel codice se si utilizza un'immagine. Qualunque sia il codice rende il triangolo giallo sta ottenendo i colori vivaci, in modo da utilizzare lo stesso formato di immagine o pennello o qualsiasi altra cosa rende il lavoro triangolo giallo.