2010-12-11 27 views
0

Ich habe eine Picturebox mit einem PNG drin. Aber selbst wenn ich BackColor auf Transparent setze, ist es nicht transparent. Irgendwelche Ideen, was könnte falsch sein? :)C#, wie macht man einen Bildhintergrund transparent?

alt text

Dank!

+0

Der Screenshot ist vom Designer - passiert das auch beim Ausführen der Anwendung? – Oded

+0

ja, tut es. :) – Rob

+0

Es sieht so aus, als ob ein Farbverlauf in diesem Bild ist. Selbst wenn Sie die richtige Farbe für den Alpha-Kanal finden, wird dieser Farbverlauf als Sünde hässlich sein. – kenny

Antwort

4

Ich habe auch das Problem in Bezug auf transparente Bilder konfrontiert.

müssen Sie es durch Code zeichnen. Siehe meine Frage A PictureBox Problem

EDIT:

In Paint-Ereignis (Control enthält Hintergrundbild) schreiben Dieser

//If added your image in project's resources get from there OR your Image location 
    Image img = yourNamespace.Properties.Resources.yourPicture; 
    e.Graphics.DrawImage(img,50,50,100,100); 
+0

Ihr Bild wurde nicht angezeigt. Jetzt Upadated –

2

Ihre PNG-Datei sollte auch den transparenten Hintergrund haben. Dies kann beim Erstellen der Bilddateien (PNG) erfolgen.

+0

Die PNG hat einen transparenten Hintergrund. Wenn ich andere Farben als BackColor einstelle, wird die Farbe gesehen. Daher das Png selbst wenn ok. – Rob

+0

Ich habe ein wenig gesucht und sieht aus, als ob andere Leute auch dieses Problem hatten. Jemand schlug vor, anstelle von PictureBox ein Panel-Steuerelement zu verwenden. Ist das eine Option für dich? – Hps

-1

Von dem, was ich gelernt habe, kann ich es nicht innerhalb einer Windows-Form tun, da es keine Schichten für die Bilder hat. Also rate muss es als WPF machen. :)

0

Wie haben Sie schaffen den Hintergrund? Wird das durch Setzen der Form.BackgroundImage eingestellt? Wenn dieser Hintergrund (das papierähnliche Bild) ein Container-Steuerelement ist, sollte die Transparenz einfach funktionieren. Wenn Sie jedoch zwei PictureBox Objekte übereinander legen, funktioniert das nicht. Der transparente Bereich nimmt die Farbe seines übergeordneten Objekts an. Wenn Sie zwei PictureBox Objekte haben, haben beide die Form als ihre Eltern. Wenn dies Ihre Situation ist, können Sie dies beheben, indem Sie die Eigenschaft Parent des transparenten Bildes als Hintergrundbild festlegen.

private void Form1_Load(object sender, EventArgs e) 
    { 
     transparentPictureBox.Parent = backgroundPictureBox; 
    } 

Beim Wechsel der Parent Eigenschaft, die Location des tranparentPictureBox wird auf seiner neuen Mutter relativiert. Sie müssten die x- und y-Koordinaten des Hintergrundbildes vom transparenten Bild subtrahieren. Sehen Sie meine Antwort auf A PictureBox Question für ein Beispiel mit einem Screenshot.

AFAIK, können Sie nicht die Parent im Designer, nur in Code. Daher wird der Designer immer noch nicht ein transparentes Bild anzeigen, aber zur Laufzeit sollte es. Das gleiche Problem tritt auf, wenn Sie ein transparentes Objekt Label auf ein PictureBox Objekt setzen.

1

Sie müssen es wirklich durch Code zeichnen. Platzieren Sie eine PictureBox auf Ihrem Formular, stellen Sie sizeMode und Docking ein, wie Sie möchten.Dann können Sie die folgende Funktion auf dem Paint-Ereignis des PictureBox Feuer:

public void LogoDrawTransparent(PaintEventArgs e) 
    { 
     // Create a Bitmap object from an image file. 
     Image myImg; 
     Bitmap myBitmap; 
 try 
     { 
      myImg = cls_convertImagesByte.GetImageFromByte(newImg); 
      myBitmap = new Bitmap(myImg); // @"C:\Temp\imgSwacaa.jpg"); 

      // Get the color of a background pixel. 
      Color backColor = myBitmap.GetPixel(0, 0); // GetPixel(1, 1); 
      Color backColorGray = Color.Gray; 
      Color backColorGrayLight = Color.LightGray; 
      Color backColorWhiteSmoke = Color.WhiteSmoke; 
      Color backColorWhite = Color.White; 
      Color backColorWheat = Color.Wheat; 

      // Make backColor transparent for myBitmap. 
      myBitmap.MakeTransparent(backColor); 
        // OPTIONALLY, you may make any other "suspicious" back color transparent (usually gray, light gray or whitesmoke) 
      myBitmap.MakeTransparent(backColorGray); 
      myBitmap.MakeTransparent(backColorGrayLight); 
      myBitmap.MakeTransparent(backColorWhiteSmoke); 

      // Draw myBitmap to the screen. 
      e.Graphics.DrawImage(myBitmap, 0, 0, pictureBox1.Width, pictureBox1.Height); //myBitmap.Width, myBitmap.Height); 
     } 
     catch 
     { 
      try { pictureBox1.Image = cls_convertImagesByte.GetImageFromByte(newImg); } 
      catch { } //must do something 
     } 
    } 

Das ist meine Klasse, die in der obigen Funktion verwiesen wird:

class cls_convertImagesByte 
{ 

    public static Image GetImageFromByte(byte[] byteArrayIn) 
    { 
     MemoryStream ms = new MemoryStream(byteArrayIn); 
     Image returnImage = Image.FromStream(ms); 
     return returnImage; 
    } 

    public static byte[] GetByteArrayFromImage(System.Drawing.Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
     return ms.ToArray(); 
    } 
} 

Dank. Chagbert.

Verwandte Themen