2016-04-05 8 views
0

ich diesen Code einen Hintergrund und Text zu einem einzigen Bild hier:ein Bild zusammenfassen, fand

Private _BackgroundColours As New List(Of String)() From { _ 
    "339966", _ 
    "3366CC", _ 
    "CC33FF", _ 
    "FF5050" _ 
} 

Public Function GenerateRactangle(firstName As String, lastName As String) As MemoryStream 
    Dim imgSize() As Integer = {800, 800} 
    Dim avatarString As String = String.Format("{0}{1}", firstName(0), lastName(0)).ToUpper() 
    Dim bgColour = _BackgroundColours(New Random().[Next](0, _BackgroundColours.Count - 1)) 
    Dim bmp As Bitmap = New Bitmap(imgSize(0), imgSize(1)) 
    Dim sf As StringFormat = New StringFormat() 
    Dim ms As MemoryStream = New MemoryStream() 
    Dim font As Font = New Font("Arial", 172, FontStyle.Bold, GraphicsUnit.Pixel) 
    Dim graphics__1 As Graphics = Nothing 

    sf.Alignment = StringAlignment.Center 
    sf.LineAlignment = StringAlignment.Center 

    graphics__1 = Graphics.FromImage(bmp) 
    graphics__1.Clear(DirectCast(New ColorConverter().ConvertFromString("#" + bgColour), Color)) 
    graphics__1.SmoothingMode = SmoothingMode.AntiAlias 
    graphics__1.TextRenderingHint = TextRenderingHint.AntiAliasGridFit 
    graphics__1.DrawString(avatarString, font, New SolidBrush(Color.WhiteSmoke), New RectangleF(0, 0, imgSize(0), imgSize(1)), sf) 
    graphics__1.Flush() 
    bmp.Save(ms, ImageFormat.Png) 

    Return ms 
End Function 

Auf stackoverflow und es funktioniert super. Ich benötige jedoch ein transparentes PNG-Bild im Hintergrund mit der farbändernden Hintergrundfarbe.

Was es sieht derzeit wie:

enter image description here

Was ich suche es aussehen:

enter image description here

Mit dem PNG-Bild dieses sein, das hinzugefügt wurde:

enter image description here

Ich hoffe, dass jemand mit mehr Wissen über die Grafik-Calls mich wissen lassen kann, wie man das macht.

+0

Verwenden [ 'Graphics.DrawImage()'] (https://msdn.microsoft. com/de-de/library/system.drawing.graphics.drawimage (v = vs.110) .aspx). –

+0

Wenn Sie die Silhouette zeichnen, um ein Bild zu zeichnen, wird es die Buchstaben abdecken. Für das gewünschte Ergebnis benötigen Sie das erste Bild als 2: eins für die BG und einmal für die Buchstaben - Sie können die Silhouette nicht zwischen den 2 Ebenen einfügen. Wenn der eine Teil immer Buchstaben ist, könnten Sie sie einfach zeichnen. – Plutonix

+0

@Plutonix Kann ich das Avatar-Bild nicht einfügen und dann eine Hintergrundfarbe auf dem transparenten Teil des PNGs erstellen? Dann kann ich den Text zu allem hinzufügen? – StealthRT

Antwort

1

Die Methode, die Sie gefunden haben, lässt zumindest die Font und Grahics Objekte nicht disponiert, also wenn es als eine Fabrik verwendet wird, um zahlreiche Bilder zu verarbeiten, wird es undicht. Dinge wie die Auswahl einer zufälligen Hintergrundfarbe könnten besser dem aufrufenden Code überlassen werden, und ein memstream scheint eine ungerade Rückgabetypwahl zu sein.

Eine allgemeine Methode, einen Hintergrund zu erstellen, ein PNG-Overlay und den Text gelten:

Private Function CreateLabeledAvatar(av As Image, bg As Color, text As String) As Image 

    ' fixed size? 
    Dim bmp As New Bitmap(250, 250) 
    Using g As Graphics = Graphics.FromImage(bmp) 
     Using br As New SolidBrush(bg) 
      g.FillRectangle(br, 0, 0, bmp.Width, bmp.Height) 
     End Using 
     g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
     g.CompositingQuality = CompositingQuality.HighQuality 
     g.TextRenderingHint = TextRenderingHint.AntiAlias 
     g.SmoothingMode = SmoothingMode.HighQuality 
     g.DrawImage(av, 0, 0, bmp.Width, bmp.Height) 

     ' lastly the text, centred on the new image 
     ' could also draw to the AV passed to center on IT 
     Using fnt As New Font("Arial", 32, FontStyle.Bold, GraphicsUnit.Pixel) 
      TextRenderer.DrawText(g, text, fnt, New Rectangle(0, 0, 250, 250), 
        Color.WhiteSmoke, 
        TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter) 
     End Using 

    End Using 

    Return bmp 
End Function 

Verwendungsbeispiel:

Dim av = Image.FromFile("C:\temp\maleAV.png") 
Dim bg = Color.FromArgb(62, 103, 207) 

Dim newImg = CreateLabeledAvatar(av, bg, "BB") 
pb1.Image = newImg 

av.Dispose() 

Wenn Ihr Code mit ihm geschehen ist, newImg auch sollten entsorgt werden.

Es gibt andere Parameter, die Sie übergeben oder einstellen möchten, wie die gewünschte Größe, Schriftgröße und vielleicht sogar die Textfarbe. Es gibt aber noch mehr, und ich würde es zu einer Klasse machen, wenn also eine Menge davon verarbeitet wird, könnten viele Parameter einmal gesetzt werden.

Ergebnis:

enter image description here

Das Bild erstellt wurde 250.250, es in einem 150x150 PBox angezeigt

+0

Danke für das Beispiel! Würde ich auch ** System.Drawing.Drawing2D.GraphicsPath ** verwenden, um dem Rechteck gekrümmte Ecken zu geben? – StealthRT

+0

Abgerundet wie im bläulichen Teil? Was wäre dahinter, transparent? – Plutonix

+1

@StealthRT Ja, anstatt "FillRectangle" zu verwenden, würden Sie einen 'GraphicsPath' mit 4 Zeilen und 4 Bögen erstellen und dann' FillPath' für diesen Pfad verwenden. –