2016-03-24 17 views
1

Ich habe ein PictureBox-Steuerelement, das Hintergrundfarbe ist auf transparent festgelegt. Ich würde gerne ein Bild auf dieses Steuerelement zeichnen (Quelle: https://en.wikipedia.org/wiki/Seven-segment_display#/media/File:7-segment.svg), aber anstelle des transparenten Hintergrunds ist die Hintergrundfarbe weiß (leider unterstützt Farbe den Alpha-Kanal nicht).Zeichnung transparentes Bild funktioniert nicht

Hier ist, wie ich versuche, das Bitmap zu zeichnen:

private void DrawPictureBox() 
{ 
    pbScreen.Image = Update(); 
} 

private Bitmap CreateBackgroundBitmap() 
{ 
    Bitmap bitmap = (Bitmap)Properties.Resources.ResourceManager.GetObject("empty"); 
    bitmap.MakeTransparent(Color.White); 

    return bitmap; 
} 

private ImageAttributes GetImageAttributes() 
{ 
    float[][] matrixItems = { 
     new float[] {1, 0, 0, 0, 0}, 
     new float[] {0, 1, 0, 0, 0}, 
     new float[] {0, 0, 1, 0, 0}, 
     new float[] {0, 0, 0, Contrast, 0}, 
     new float[] {0, 0, 0, 0, 1}}; 

    ColorMatrix colorMatrix = new ColorMatrix(matrixItems); 

    ImageAttributes imageAtt = new ImageAttributes(); 
    imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 

    return imageAtt; 
} 

private void DrawSegment(ref Graphics g, Digit digit, int Position = 0) 
{ 
    if (digit == null) 
     return; 

    Bitmap buffer = digit.CreateBitmapFromFile(digit.CreateFileNameFromContent()); 
    buffer.MakeTransparent(Color.White); 

    g.DrawImage(buffer, new Rectangle(0 + Position * 43, 0, 43, 67), 0.0f, 0.0f, 43, 67, GraphicsUnit.Pixel, this.GetImageAttributes()); 

} 

public Bitmap Update() 
{ 
    Bitmap buffer = CreateBackgroundBitmap(); 

    Graphics g = Graphics.FromImage(buffer); 

    g.DrawImage(buffer, new Rectangle(0, 0, 301, 67), 0.0f, 0.0f, 301, 67, GraphicsUnit.Pixel, this.GetImageAttributes()); 

    if (State == Powerstate.on) 
    { 
     // Draw segments 
     for (int i = 0; i < digits.Count(); i++) 
     { 
      DrawSegment(ref g, digits[i], i); 

      if (digits[i]?.Dot == Dot.dot_on) 
      { 
       DrawPoint(ref g, digits[i], i); 
      } 
     } 
    } 

    return buffer; 
} 

die Segmente Zeichnung (Punkte Zeichnung ähnlich ist) funktioniert wie erwartet, aber der Hintergrund Zeichnung wird nicht die Transparenz akzeptieren, die von ‚GetImageAttributes erstellt wird gerade () ".

Eine weitere seltsame Sache ist, dass, wenn ich

g.Clear(color: Color.Black); 

vor

g.DrawImage(buffer, new Rectangle(0, 0, 301, 67), 0.0f, 0.0f, 301, 67, GraphicsUnit.Pixel, this.GetImageAttributes()); 

in der Update() -Methode meine Grapics 'g' einfach schwarz hinzuzufügen ist - egal, ob ich bleiben oder entfernen

bitmap.MakeTransparent(Color.White); 

in 'CreateBackgroundBitmap()', aber die Segmente über den schwarzen Hintergrund Zeichnung arbeitet als exp erkannt ?!

Kann jemand sehen, wo das Problem liegt? Was vermisse ich?

Vielen Dank :)

Antwort

0

Nun, ich habe es. Ich nehme an, ich habe nicht verstanden, wie ein Graphics-Objekt mit der Bitmap interagiert, aus der das Grafikobjekt besteht.

Hier ist, wie es geändert werden musste:

public Bitmap Update() 
{ 
    Bitmap background = new Bitmap(301, 67); 
    Graphics g = Graphics.FromImage(background); 

    g.Clear(color: Color.White); 

    Bitmap buffer = CreateBackgroundBitmap(); 

    g.DrawImage(buffer, new Rectangle(0, 0, 301, 67), 0.0f, 0.0f, 301, 67, GraphicsUnit.Pixel, this.GetImageAttributes()); 

    if (State == Powerstate.on) 
    { 
     for (int i = 0; i < digits.Count(); i++) 
     { 
      DrawSegment(ref g, digits[i], i); 

      if (digits[i]?.Dot == Dot.dot_on) 
      { 
       DrawPoint(ref g, digits[i], i); 
      } 
     } 
    } 

    return background; 
} 
Verwandte Themen