2010-08-15 5 views
3

Я использую следующий код для печати изображения из PictureBox. Все работает отлично, за исключением масштабирования изображений, если они больше, чем страница печати. Есть ли способ, который мне не хватает для этого?Масштабирование изображения для печати

Скриншот, большое изображение вне бумажными рамки:

http://a.yfrog.com/img46/63/problemsh.png http://a.yfrog.com/img46/63/problemsh.png

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    AddHandler PrintDocument1.PrintPage, AddressOf OnPrintPage 

    With PageSetupDialog1 
     .Document = PrintDocument1 
     .PageSettings = PrintDocument1.DefaultPageSettings 

     If PictureEdit1.Image.Height >= PictureEdit1.Image.Width Then 
      PageSetupDialog1.PageSettings.Landscape = False 
     Else 
      PageSetupDialog1.PageSettings.Landscape = True 
     End If 

    End With 

    PrintDialog1.UseEXDialog = True 
    PrintDialog1.Document = PrintDocument1 

    If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 
     PrintPreviewDialog1.Document = PrintDocument1 
     If PrintPreviewDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 

      PrintDocument1.DefaultPageSettings = PageSetupDialog1.PageSettings 
      PrintDocument1.Print() 

     End If 
    End If 
End Sub 

Private Sub OnPrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) 
    Dim img As Image = PictureEdit1.Image 

    Dim sz As New SizeF(100 * img.Width/img.HorizontalResolution, 100 * img.Height/img.VerticalResolution) 
    Dim p As New PointF((e.PageBounds.Width - sz.Width)/2, (e.PageBounds.Height - sz.Height)/2) 
    e.Graphics.DrawImage(img, p) 
End Sub 

ответ

5

Заменить:

Dim sz As New SizeF(100 * img.Width/img.HorizontalResolution, 100 * img.Height/img.VerticalResolution) 

С чем-то вроде этого, чтобы поместить изображение на странице:

dim ScaleFac as integer = 100 
While (ScaleFac * img.Width/img.HorizontalResolution > e.PageBounds.Width or ScaleFac * img.Height/img.VerticalResolution > e.PageBounds.Height) and ScaleFac > 2 
    ScaleFac -= 1 
Wend 
Dim sz As New SizeF(ScaleFac * img.Width/img.HorizontalResolution, ScaleFac* img.Height/img.VerticalResolution) 

Вы можете использовать алгебру для решения для правильного scalefac, но у меня нет времени ее протестировать, и если вы не понимаете, что я сделал, вам было бы намного сложнее отладить. Довольно уверен, что вы увидите, что я пытаюсь сделать здесь только из кода! С уважением.

+0

прекрасно работает и делает Sence да - Scalefac :) – madlan

2
Dim img As Image = PictureEdit1.Image 
e.Graphics.DrawImage(img, 0, 0, 
        e.PageBounds.Width, e.PageBounds.Height) 

это все, что вам нужно будет решить

+0

Это будет соответствовать изображение на странице, но будет растянуть изображение в обоих направлениях. Он не поддерживает одинаковое соотношение сторон и искажает изображение. В большинстве случаев это нежелательно. –

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