2013-12-18 2 views
4

Привет всем я пытаюсь получить мои изображения, чтобы выглядеть красиво и гладко (сглаживание) с помощью маски для того, чтобы сделать круглое изображение, как вы видите ниже:Vb.net изображение маски делает гладкой по краям

round image

Исходное изображение выглядит следующим образом:

org image

маска для изображения выше выглядит следующим образом (красный является цветом маски, чтобы вынуть):

mask image

Это работает, но это дает мне эти не очень приятные неровные края вокруг него. Маска является .png, а также само изображение является .png.

код я использую, чтобы сделать маску это:

picNextTopic1.Image = Image.FromStream(wc.OpenRead(anAPI.wallOrgPostImage(keying).Replace("{width}", "50").Replace("{height}", "50"))) 'Download the image from the website.     
picNextTopic1.Image = ApplyMask(New Bitmap(picNextTopic1.Image), New Bitmap(My.Resources.mask), Color.Red) 'Apply mask to the downloaded image above. 

Функция ApplyMask заключается в следующем:

Public Function ApplyMask(ByVal bImg As Bitmap, ByVal bMask As Bitmap, ByVal maskColor As Color) As Image 
    Dim wImg As Integer = bImg.Width 
    Dim hImg As Integer = bImg.Height 
    Dim wMask As Integer = bMask.Width 
    Dim hMask As Integer = bMask.Height 
    Dim intMask As Integer = maskColor.ToArgb 
    Dim intTransparent As Integer = Color.Transparent.ToArgb 

    Using fpImg As New FastPix(bImg) 
     Using fpMask As New FastPix(bMask) 
      Dim pixelsImg = fpImg.PixelArray 
      Dim pixelsMask = fpMask.PixelArray 

      For y As Integer = 0 To Math.Min(hImg, hMask) - 1 
       For x As Integer = 0 To Math.Min(wImg, wMask) - 1 
        Dim iImg As Integer = (y * wImg) + x 
        Dim iMask As Integer = (y * wMask) + x 

        If pixelsMask(iMask) = intMask Then 
         pixelsImg(iImg) = intTransparent 
        End If 
       Next 
      Next 
     End Using 
    End Using 

    Return bImg 
End Function 

который использует FastPix нашел here.

Любая помощь, чтобы сгладить это было бы здорово! Благодаря!

UPDATE код прозрачной форме, которая у меня есть:

Public Sub InitializeMyForm() 
    BackColor = Color.Plum 
    TransparencyKey = BackColor 
End Sub 
+0

Вместо бинарной маски, вы могли бы сделать альфа-маску, которая имеет плавный переход между разоблачены и замаскированы. – djv

ответ

0

Игра вокруг с этим, мне удалось сделать сглаженное изображение таким образом, используя TextureBrush:

Dim profile As Image = Image.FromFile("c:\...\profile.png") 

Protected Overrides Sub OnPaint(e As PaintEventArgs) 
    e.Graphics.Clear(Color.SteelBlue) 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias 
    Using tb As New TextureBrush(profile) 
    tb.TranslateTransform(120, 64) 
    Using p As New GraphicsPath 
     p.AddEllipse(120, 64, profile.Width, profile.Width) 
     e.Graphics.FillPath(tb, p) 
    End Using 
    End Using 
    MyBase.OnPaint(e) 
End Sub 

TranslateTransform и местоположение AddEllipse используют одну и ту же информацию о точке, чтобы соответствующим образом «центрировать» текстуру.

Результат:

enter image description here

+0

Получаете ли вы тот же результат, даже если окно формы прозрачно, как у меня? – StealthRT

+0

А также из вашего примера кажется, что вы используете только 1 изображение вместо маски? – StealthRT

+0

@StealthRT Исправить. Нет необходимости в маске. Прозрачный фон не будет работать, так как вам нужен фон для * псевдонима * с. Перед применением моего примера вам придется скопировать область источника. – LarsTech

Смежные вопросы