PrintDocument_PrintPage & Graphics.DrawImage размер в дюймах - PullRequest
1 голос
/ 16 августа 2010

Я пытаюсь напечатать изображение размером 2x2 дюйма. Создана функция преобразования (в дюймах в пиксели) на основе разрешения. Тем не менее, результат далек от 2x2 дюйма, печать дает изображение, которое едва умещается на весь лист! Я что-то не так делаю?

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

    Dim graph = e.Graphics
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality


    Dim photo = Image.FromFile("C:\Users\Public\Pictures\Sample Pictures\Koala.jpg")
    graph.DrawImage(photo, New RectangleF(0, 0, InchToPx(graph.DpiX, 2), InchToPx(graph.DpiY, 2)))

End Sub


Private Function InchToPx(ByVal dpi As Single, ByVal inches As Single) As Single

    Return (inches * dpi)

End Function

1 Ответ

3 голосов
/ 16 августа 2010

Да, это не правильный способ сделать это. Graphics.Dpix возвращает разрешение принтера, обычно 600 точек на дюйм. Но то, что вы рисуете, не зависит от разрешения. Так что вам не нужно делать ничего особенного, когда пользователь выбирает другой принтер, скажем, с разрешением 300 точек на дюйм. Важно, потому что в противном случае ваш документ будет в два раза больше и больше не будет соответствовать бумаге.

Независимое от разрешения отображение определяется Graphics.PageUnit. По умолчанию используется дисплей, который составляет один пиксель 0,01 дюйма. Другими словами, чтобы получить распечатку размером 2 на 2 дюйма, вы просто используете прямоугольник 200 x 200. Вы можете изменить PageUnit, если вы действительно хотите, Inches - одна из настроек. Затем вы бы использовали прямоугольник 2х2. Тогда вам, конечно, придется использовать перегрузки метода Graphics, которые принимают PointF и RectangleF, целочисленные версии не будут хорошо работать.

По умолчанию (Дисплей) удобно, потому что он делает то, что вы рисуете на экране, примерно того же размера, что и на принтере. Поскольку общее разрешение для дисплея составляет 96 точек на дюйм, достаточно близко к 1 пикселю == 0,01 ". Это позволяет повторно использовать код, который рисует материал на экране, а также на принтере.

...