0

ここでこのコードを見つけました:

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

スタックオーバーフローで、うまく機能します。ただし、背景色が変化する背景に透明なPNG画像を使用する必要があります。

現在の外観:

ここに画像の説明を入力

私はそれがどのように見えるかを探しています:

ここに画像の説明を入力

PNG画像が追加されたのは次のとおりです。

ここに画像の説明を入力

グラフィックス コールについて詳しい方が、これを行う方法を教えてくれることを願っています。

4

1 に答える 1

1

あなたが見つけたメソッドは、少なくともFontGrahicsオブジェクトを未処理のままにしているため、多数の画像を処理するためのファクトリとして使用すると、リークします。ランダムな背景色の選択などは、呼び出し元のコードに任せたほうがよいかもしれません。また、memstream は奇妙な戻り値の選択のようです。

背景を作成し、PNG をオーバーレイし、それにテキストを適用する一般的な方法:

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

使用例:

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()

コードが完成したら、newImg破棄する必要があります。

必要なサイズ、フォント サイズ、さらにはテキストの色など、渡したり設定したりしたいパラメータが他にもあります。ただし、これ以上渡すと、それをクラスにするので、それらを大量に処理するために使用する場合、多くのパラメーターを一度に設定できます。

結果:

ここに画像の説明を入力

作成された画像は 250,250 で、150x150 PBox に表示されます

于 2016-04-05T17:28:21.150 に答える