VB.NET Рисование двухпиксельной прозрачной рамки вокруг созданного на лету png-изображения?
Я довольно новичок в программировании графики, тем более с VB, поэтому я бегу к стене здесь. Я сделал в основном весь код, все, что мне не хватает, это добавить несколько пикселей прозрачного отступа / рамки вокруг изображения, и я застрял. Я оглянулся, но примеры, которые я видел, казались чрезвычайно сложными и выглядели для меня как излишнее (страницы на страницах кода).
Любые указатели или простые для понимания учебники / примеры будут чрезвычайно цениться.
Добавлен текущий код ниже:
Текущий код
Dim img As Image = New Bitmap(100, 100)
Dim Drawing As Graphics = Graphics.FromImage(img)
Dim rand As New Random
Dim bgcolor As Color = Color.FromArgb(rand.Next(64, 196), rand.Next(64, 196), rand.Next(64, 196))
Dim family As FontFamily = Nothing
Dim fontName As String = "Lucida Sans Typewriter"
Dim fontSize As Single = 42
Using fontTester As New Font(fontName, fontSize, FontStyle.Regular, GraphicsUnit.Pixel)
If fontTester.Name = fontName Then
family = New FontFamily("Lucida Sans Typewriter")
Else
Try
Dim privateFonts As New System.Drawing.Text.PrivateFontCollection()
privateFonts.AddFontFile(HttpContext.Current.Server.MapPath("~/") + "\styles\fonts\LTYPE.ttf")
Dim font As New System.Drawing.Font(privateFonts.Families(0), 42)
family = font.FontFamily
Catch ex As Exception
family = New FontFamily("Arial")
End Try
End If
End Using
Dim FontText As Font = New Font(family, 42, FontStyle.Regular)
Drawing.Clear(bgcolor)
Dim textBrush As Brush = New SolidBrush(Color.White)
Drawing.DrawString(initials, FontText, textBrush, 7, 16)
Drawing.Save()
textBrush.Dispose()
Drawing.Dispose()
2 ответа
Вы можете сделать это, очистив изображение до прозрачного, а затем нарисовав фоновый прямоугольник, который на 2 пикселя меньше, чем изображение в каждом направлении:
Drawing.Clear(Color.Transparent)
Drawing.FillRectangle(New SolidBrush(bgcolor), 2, 2, 96, 96)
'Draw text ...
Следующий код является примером изменения одного пикселя вокруг черного шрифта на прозрачный. Должно быть легко расширить код, чтобы рассмотреть более одного пикселя. Этот код работает, если ваше изображение не имеет прямоугольной формы, как текстовая строка, как показано в вашем примере кода. Даже при установке цвета шрифта на черный, есть некоторые пиксели, которые не являются чисто черными, у них есть некоторые оттенки, поэтому в моем примере я проверяю, является ли компонент Red 255 для учета оттенков серого.
Dim bmp As New Bitmap(width, height)
Dim g As Graphics = Graphics.FromImage(bmp)
Dim rand As New Random
Dim bgcolor As Color = Color.Red
g.Clear(bgcolor)
Dim FontText As Font = New Font("Arial", 42, FontStyle.Regular)
Dim textBrush As Brush = New SolidBrush(Color.Black)
g.DrawString("Teste", FontText, textBrush, 7, 16)
For i As Integer = 0 To Width - 1
For j As Integer = 0 To Height - 1
If bmp.GetPixel(i, j).R < 255 Then
If (bmp.GetPixel(i - 1, j).R = 255 And bmp.GetPixel(i - 1, j).G = 0 And bmp.GetPixel(i - 1, j).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i + 1, j).R = 255 And bmp.GetPixel(i + 1, j).G = 0 And bmp.GetPixel(i + 1, j).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i, j - 1).R = 255 And bmp.GetPixel(i, j - 1).G = 0 And bmp.GetPixel(i, j - 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i, j + 1).R = 255 And bmp.GetPixel(i, j + 1).G = 0 And bmp.GetPixel(i, j + 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i + 1, j + 1).R = 255 And bmp.GetPixel(i + 1, j + 1).G = 0 And bmp.GetPixel(i + 1, j + 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i - 1, j - 1).R = 255 And bmp.GetPixel(i - 1, j - 1).G = 0 And bmp.GetPixel(i - 1, j - 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i + 1, j - 1).R = 255 And bmp.GetPixel(i + 1, j - 1).G = 0 And bmp.GetPixel(i + 1, j - 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
If (bmp.GetPixel(i - 1, j + 1).R = 255 And bmp.GetPixel(i - 1, j + 1).G = 0 And bmp.GetPixel(i - 1, j + 1).B = 0) Then
bmp.SetPixel(i, j, Color.Transparent)
End If
End If
Next
Next
textBrush.Dispose()
g.Dispose()
bmp.Save("TESTE.png", System.Drawing.Imaging.ImageFormat.Png)