Привести изображение в форму?

Я создал пользовательский элемент управления, который можно использовать как форму круга / квадрата / треугольника, элемент управления может рисовать границу (внешнюю) и заполнять то, что находится внутри этой границы (внутреннее)

Чтобы понять это:

введите описание изображения здесь

Граница черная, а внутренняя - красная.

Что ж, теперь я хотел бы добавить в свой элемент управления функцию для заполнения внутренней части формы с помощью изображения.

но когда я пытаюсь заполнить только это пространство с помощью изображения, также отображается внешняя область фигуры:

введите описание изображения здесь

Я не эксперт в использовании GDI +, как я могу это исправить?

Мне нужно сделать это с помощью круга, квадрата и треугольника, я не знаю, можно ли это остановить.

Это код, который я использую, чтобы заполнить круг изображением:

Public Property InnerImage As Image = Image.FromFile("C:\random.jpg")

''' <summary>
''' Draws a circle on the specified <see cref="System.Drawing.Graphics"/> object.
''' </summary>
''' <param name="g">The <see cref="System.Drawing.Graphics"/> object to draw.</param>
Private Sub DrawCircle(ByRef g As Graphics)

    With g

        Using pen As New Pen(Me._BorderColor, Me._BorderWidth)

            Dim rect As Rectangle = Me.GetFigueRectangle(pen)

            ' Fill the circle using the image.
            If Me.InnerImage IsNot Nothing Then
                .DrawImage(Me.InnerImage, rect)

            Else ' Fill the circle using a solid colour.
                If Not Me._InnerColor = Color.Transparent Then

                    Using brush As New SolidBrush(Me._InnerColor)
                        .FillEllipse(brush, rect)
                    End Using

                End If ' Not Me._InnerColor = Color.Transparent

            End If

            ' Draw the circle border.
            .DrawEllipse(pen, rect)

        End Using ' pen As New Pen(Me._BorderColor, Me._BorderWidth)

    End With ' g

End Sub

И функция GetFigueRectangle (которая используется как для круга, так и для квадрата и треугольника) такова:

''' <summary>
''' Gets a <see cref="System.Drawing.Rectangle"/> with the bounds fixed according to the specified <see cref="System.Drawing.Pen.Width"/>.
''' </summary>
''' <param name="pen">The <see cref="System.Drawing.Pen"/>.</param>
''' <returns>The <see cref="System.Drawing.Rectangle"/> with the bounds fixed.</returns>
Private Function GetFigueRectangle(ByVal pen As Pen) As Rectangle

    Return New Rectangle With
                {
                    .x = CInt(0.0F + (pen.Width / 2.0F)),
                    .y = CInt(0.0F + (pen.Width / 2.0F)),
                    .width = CInt(MyBase.Width - pen.Width),
                    .height = CInt(MyBase.Height - pen.Width)
                }

End Function

person ElektroStudios    schedule 10.11.2014    source источник
comment
возможный дубликат кругов на полях C # на изображении или растровом изображении   -  person CodeCaster    schedule 10.11.2014
comment
См. Предлагаемый дубликат. Вам нужно сделать наоборот: нарисовать желаемую форму (например, круг) с помощью кисти, сделанной из исходного растрового изображения.   -  person CodeCaster    schedule 10.11.2014
comment
Спасибо, попробую, но учтите, что у меня изображение растянуто ...   -  person ElektroStudios    schedule 10.11.2014


Ответы (1)


Вы можете использовать Graphics.SetClip, который принимает GraphicsPath, чтобы установить область отсечения. Дополнительная информация здесь: http://msdn.microsoft.com/en-us/library/0z994t06(v=vs.110).aspx

Это позволит вам обрезать рисунок до любой возможной формы, которую вы только можете придумать. Фактически будут отрисованы только пиксели внутри контура.

person Bradley Uffner    schedule 10.11.2014
comment
Спасибо, сработало отлично, просто небольшой вопрос: метод восстановления исходного клипа до каких-либо изменений - это «Resetclip» или другой метод (например, excludeclip или ...)? - person ElektroStudios; 10.11.2014
comment
.ResetClip очистит текущую область клипа, так что все пиксели будут отрисованы снова, как если бы регион клипа никогда не устанавливался. Если ранее был установлен регион клипа, который вы хотите восстановить, вам следует сохранить Graphics.Clip в переменной перед изменением клипа, а затем .SetClip обратно после того, как вы закончите рисовать. - person Bradley Uffner; 10.11.2014