2014-12-05 12 views
5

Ho un'immagine PNG inviata da un DrawingView in Android a un servizio WCF. L'immagine viene inviata come 32 bit e ha uno sfondo trasparente. Voglio sostituire lo sfondo di colore trasparente (per mancanza di una parola migliore) con il bianco. Finora il mio codice assomiglia a questo:Sostituzione dello sfondo trasparente con il colore bianco nelle immagini PNG

// Converting image to Bitmap object 
Bitmap i = new Bitmap(new MemoryStream(Convert.FromBase64String(image))); 
// The image that is send from the tablet is 1280x692 
// So we need to crop it 
Rectangle cropRect = new Rectangle(640, 0, 640, 692); 
//HERE 
Bitmap target = i.Clone(cropRect, i.PixelFormat); 
target.Save(string.Format("c:\\images\\{0}.png", randomFileName()), 
System.Drawing.Imaging.ImageFormat.Png); 

Quanto sopra funziona bene, tranne che le immagini hanno sfondo trasparente. Ho notato che in Paint.NET puoi semplicemente impostare il formato PNG su 8 bit e impostare lo sfondo su bianco. Tuttavia, quando ho provato a utilizzare:

System.Drawing.Imaging.PixelFormat.Format8bppIndexed 

tutto quello che ho ottenuto era un'immagine completamente nera.

Q: Come sostituire lo sfondo trasparente con il bianco in png?

PS. L'immagine è in scala di grigi.

+0

C'è un motivo per cui hai provato il formato indicizzato? Hai provato uno dei 24 formati bpp? –

+0

Dovresti essere in grado di creare una bitmap bianca e disegnare l'immagine su di essa, quindi salvare come qualsiasi .. – TaW

+0

@NicoSchertler Hmm .. Ho provato la maggior parte di loro, non penso tutto. Format24bppRgb dà lo stesso risultato. –

risposta

11

Questo attirerà su di un determinato colore:

Bitmap Transparent2Color(Bitmap bmp1, Color target) 
{ 
    Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height); 
    Rectangle rect = new Rectangle(Point.Empty, bmp1.Size); 
    using (Graphics G = Graphics.FromImage(bmp2)) 
    { 
     G.Clear(target); 
     G.DrawImageUnscaledAndClipped(bmp1, rect); 
    } 
    return bmp2; 
} 

Questo rende l'uso del G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;, che è il default. Mescola l'immagine disegnata con lo sfondo in base al canale alfa dell'immagine disegnata.

Problemi correlati