Nicomendox Ответов: 1

Почему fillpath отличается результатом в picturebox и printdocument ?


Я пытаюсь заполнить изображение в круглый угловой прямоугольник... Я исследовал интернет, нашел несколько кодов и модифицировал их. Я получаю то, что хочу, в PictureBoX FillPath.

Только различия есть ;
в PictureBox

Dim grpX As Graphics = PictureBox1.CreateGraphics 


и в PrintDocument

Dim grpX As Graphics = e.Graphics 


остальные все коды одинаковы. Но в PictureBox изображение вписалось идеально. другой на изображении объект printdocument только заполнить место, как площадь прямоугольника.

Как я могу заполнить прямоугольник в PrintDocument так же, как заполнен в PictureBox ?

Что я уже пробовал:

Public Function createRoundRect(ByVal R As Rectangle, ByVal radius As Integer) As GraphicsPath
        Dim gp As New GraphicsPath()
        Dim x As Integer, y As Integer, w As Integer, h As Integer
        x = R.X
        y = R.Y
        w = R.Width
        h = R.Height
        If radius = 0 Then
            gp.AddRectangle(New Rectangle(x, y, w, h))
        Else
            gp.AddLine(x + radius, y, x + w - radius, y)
            gp.AddArc(x + w - radius, y, radius, radius, 270, 90)
            gp.AddLine(x + w, y + radius, x + w, y + h - radius)
            gp.AddArc(x + w - radius, y + h - radius, radius, radius, 0, 90)
            gp.AddLine(x + w - radius, y + h, x + radius, y + h)
            gp.AddArc(x, y + h - radius, radius, radius, 90, 90)
            gp.AddLine(x, y + h - radius, x, y + radius)
            gp.AddArc(x, y, radius, radius, 180, 90)
            gp.CloseFigure()
        End If
        Return gp
    End Function

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Dim newImage As Image = Drawing.Image.FromFile("C:\Users\Yaman\Desktop\Frames\384.jpg")
        Dim imaj As Bitmap = New Bitmap("C:\Users\Yaman\Desktop\Frames\384.jpg")
        Dim grpX As Graphics = PictureBox1.CreateGraphics 

        Dim rectX As Rectangle = New Rectangle(CDec(10), CDec(10), CDec(200), CDec(100))
        Dim tg As Graphics = Graphics.FromImage(imaj) 
        tg.SmoothingMode = SmoothingMode.AntiAlias
        grpX.SmoothingMode = SmoothingMode.AntiAlias
        tg.DrawImage(newImage, CDec(10), CDec(10), CDec(200), CDec(100))
        Dim TBrush As New TextureBrush(imaj)
        Dim gp As New GraphicsPath
        gp = createRoundRect(rectX, 12)
        grpX.FillPath(TBrush, gp)

        End Sub

    Private Sub PrintDocument2_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument2.PrintPage

        Dim newImage As Image = Drawing.Image.FromFile("C:\Users\Yaman\Desktop\Frames\384.jpg")
        Dim imaj As Bitmap = New Bitmap("C:\Users\Yaman\Desktop\Frames\384.jpg")
        Dim grpX As Graphics = e.Graphics 

        Dim rectX As Rectangle = New Rectangle(CDec(10), CDec(10), CDec(200), CDec(100))
        Dim tg As Graphics = Graphics.FromImage(imaj) 
        tg.SmoothingMode = SmoothingMode.AntiAlias
        grpX.SmoothingMode = SmoothingMode.AntiAlias
        tg.DrawImage(newImage, CDec(10), CDec(10), CDec(200), CDec(100))        
 Dim TBrush As New TextureBrush(imaj)
        Dim gp As New GraphicsPath
        gp = createRoundRect(rectX, 12)
        grpX.FillPath(TBrush, gp)

    End Sub

CHill60

Пожалуйста, не удаляйте содержимое вашего поста таким образом. Если вы хотите удалить сообщение, то используйте значок "мусорная корзина", который появится, когда вы наведете курсор мыши на свой вопрос

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Что это за мусор повсюду валяется?

CDec(10)

Не делай этого. Вы можете указать десятичную константу в VB.NET добавляя D к значению: 10D 200D

Ваш код не учитывает поведение элемента управления PictureBox, которого нет в печатной копии, и не учитывает гораздо более высокое разрешение принтера над вашим монитором. Если ваше изображение 200х200 на экране, оно будет крошечным на принтере. Мониторы сегодня типично 96dpi или выше, где принтеры могут быть до 2400dpi.

Вам необходимо масштабировать значения кода чертежа, чтобы учесть различия.