Rimuovi il contorno dall’immagine sulla forma trasparente

Sto cercando di trasferire il modulo della finestra in trasparente e farlo mostrare solo un object. Ma ha ancora una linea (tratto) intorno al mio object, non è proprio perfetto come volevo. Come posso eliminare la linea (tratto)? (In allegato un’immagine da confrontare.)

inserisci la descrizione dell'immagine qui

Ecco il mio codice:

private void Form1_Load(object sender, EventArgs e) { this.FormBorderStyle = FormBorderStyle.None; this.Width = this.pictureBox1.Width; this.Height = this.pictureBox1.Height; SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.BackColor = Color.Black; this.TransparencyKey = this.pictureBox1.BackColor; } 

La tua immagine ha pixel semitrasparenti. TransparencyKey renderà un solo colore trasparente. Quindi i pixel al limite mostreranno un mix del colore dell’immagine e il colore del controllo o della forma del Parent .

Ecco una funzione che elimina tutti i pixel semitrasparenti rendendoli completamente trasparenti:

 using System.Runtime.InteropServices; .. public static void UnSemi(Bitmap bmp) { Size s = bmp.Size; PixelFormat fmt = bmp.PixelFormat; Rectangle rect = new Rectangle(Point.Empty, s); BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, fmt); int size1 = bmpData.Stride * bmpData.Height; byte[] data = new byte[size1]; System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, data, 0, size1); for (int y = 0; y < s.Height; y++) { for (int x = 0; x < s.Width; x++) { int index = y * bmpData.Stride + x * 4; // alpha, threshold = 255 data[index + 3] = (data[index + 3] < 255) ? (byte)0 : (byte)255; } } System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length); bmp.UnlockBits(bmpData); } 

Nota che questo significa anche che il bello aspetto anti-alias diventerà piuttosto approssimativo, invece ..

Si noti inoltre che la routine assume un formato di pixel ARGB a 32 bit, come di solito hanno i PNGs .

Infine, nota che poiché l'immagine ha molto Black devi scegliere un colore diverso. Fuchsia è piuttosto rara in natura, ma forse non nel mondo dei draghi e tu vuoi scegliere un colore casuale ..

Inoltre: si desidera impostare pictureBox1.BackColor = Color.Transparent ..

Infine: a volte ha senso aggiungere un parametro di threshold alla firma della funzione per impostare un livello da cui triggersre o distriggersre alfa tutto.

Ecco un esempio di utilizzo:

 this.BackColor = Color.FromArgb(1,2,3,4); this.TransparencyKey = this.BackColor; UnSemi((Bitmap)this.pictureBox1.Image); 

inserisci la descrizione dell'immagine qui

Usa l’immagine Png che ha uno sfondo trasparente
imposta il colore di controllo / forma di sfondo e la chiave trasparente per il colore che non esiste nell’immagine