PDFSharp - jpg auf Seite skalieren

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    PDFSharp - jpg auf Seite skalieren

    Hallo zusammen,

    ich habe das Problem, dass ich Bilder nicht auf die Seite skaliert bekomme. Folgenden Code habe ich:

    Quellcode

    1. Dim doc As New PdfDocument()
    2. Dim pdfPage As New PdfPage()
    3. pdfPage.Size = PdfSharp.PageSize.A4
    4. pdfPage.Orientation = PageOrientation.Landscape
    5. doc.Pages.Add(pdfPage)
    6. Dim xgr As XGraphics = XGraphics.FromPdfPage(doc.Pages(0))
    7. Dim img As XImage = XImage.FromFile(source)
    8. '###########
    9. 'Center the image in the page
    10. Dim leftOffset As Double = (xgr.PageSize.Width / 2.0) - (img.PointWidth / 2.0)
    11. Dim topOffset As Double = (xgr.PageSize.Height / 2.0) - (img.PointHeight / 2.0)
    12. 'Write the image to PDF
    13. xgr.DrawImage(img, leftOffset, topOffset)
    14. '############
    15. 'xgr.DrawImage(img, 0, 0)
    16. doc.Save(destinaton)
    17. doc.Close()


    Ist es möglich die Seite automatisch auf Hoch- bzw. Querformat je nach Abmessungen des Bildes einzustellen?

    Vielen Dank für Eure Hilfe

    Goof

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Goof“ ()

    Kurz gesagt, willst du eine .jpg Datei beschneiden?
    Wenn ja, sie dir mal folgendes an:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Diese Funktion gibt einen bestimmten Ausschnitt aus einem Bild zurück
    3. ''' </summary>
    4. ''' <param name="SourceImage">Das Bild aus dem der Ausschnitt gelesen werden soll</param>
    5. ''' <param name="Region">Die Position, Größe und Breite des Ausschnitts</param>
    6. Public Function GetPicturePart(ByVal SourceImage As Image, ByVal Region As Rectangle) As Bitmap
    7. Dim ImagePart As Bitmap = New Bitmap(Region.Width, Region.Height)
    8. Using G As Graphics = Graphics.FromImage(ImagePart)
    9. Dim TargetRect As Rectangle = New Rectangle(0, 0, Region.Width, Region.Height)
    10. Dim SourceRect As Rectangle = Region
    11. G.DrawImage(SourceImage, TargetRect, SourceRect, GraphicsUnit.Pixel)
    12. End Using
    13. Return ImagePart
    14. End Function
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Grundsätzlich musst du doch nur abfragen, ob das Bild von der Größe her auf die Seite passt.
    Anschließend kannst du es skalieren.
    z.B.

    VB.NET-Quellcode

    1. Private Function ResizeImage(ByVal image As Image, _
    2. ByVal size As Size, Optional ByVal preserveAspectRatio As Boolean = True) As Image
    3. Dim newWidth As Integer
    4. Dim newHeight As Integer
    5. If preserveAspectRatio Then
    6. Dim originalWidth As Integer = image.Width
    7. Dim originalHeight As Integer = image.Height
    8. Dim percentWidth As Single = CSng(size.Width) / CSng(originalWidth)
    9. Dim percentHeight As Single = CSng(size.Height) / CSng(originalHeight)
    10. Dim percent As Single = If(percentHeight < percentWidth,
    11. percentHeight, percentWidth)
    12. newWidth = CInt(originalWidth * percent)
    13. newHeight = CInt(originalHeight * percent)
    14. Else
    15. newWidth = size.Width
    16. newHeight = size.Height
    17. End If
    18. Dim newImage As Image = New Bitmap(newWidth, newHeight)
    19. Using graphicsHandle As Graphics = Graphics.FromImage(newImage)
    20. graphicsHandle.InterpolationMode = InterpolationMode.HighQualityBicubic
    21. graphicsHandle.DrawImage(image, 0, 0, newWidth, newHeight)
    22. End Using
    23. Return newImage
    24. End Function
    25. Private Function CheckImage(img As Image, maxWidth As Integer, maxHeight As Integer) As Image
    26. If img.Width >= maxWidth Or img.Height >= maxHeight Then
    27. Return ResizeImage(img, New Size(maxWidth, maxHeight))
    28. Else
    29. Return img
    30. End If
    31. End Function
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Zeichne einfach das Bild mit: xgr.DrawImage(img, leftOffset, topOffset) dort hin wo dus haben willst. Und Davor überprüfst du noch die img Variable, und passt sie an deine maximale Breite an:
    xgr.DrawImage(CheckImage(img, 500, 250), leftOffset, topOffset). Ich weiß hald nicht was die ist, das musst du natürlich auch zuerst anpassen :)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    kann es sein, dass hier die Bitmap eiglich garnet zu skalieren ist? (Also in dem Sinne, dass eine neue, größere oder kleinere Bitmap entstünde)
    Sondern die Bitmap soll nur verzerrungsfrei und möglichst groß in die XGraphics gezeichnet werden?

    Ich kenne XGraphics nicht, aber ich vermute, wie Graphics verfügen die über eine ZeichenRoutine
    .DrawImage(img As Image, srcRect, destRect), mit dem man ein Rechteck vom Image in ein Rechteck der XGraphics zeichnet.

    Verzerrungsfrei wird das, wenn beide Rechtecke dasselbe Seitenverhältnis aufweisen.

    Ausserdem will Goof

    Goof schrieb:

    ...soll das Format von Hoch- auf Querformat gedreht werden.
    Wessen Format? Das der pdf-Seite oder das der Bitmap?

    Ansonsten - wenn ich das Problem richtig verstanden habe - handelt es sich einzig um eine Umrechnerei von Rechtecken.
    Letztendlich eine Methode, der man das Ziel-Rechteck auf dem Pdf übergibt sowie die Size der Bitmap, und zurückgegeben wird ein Rechteck, wohin diese Bitmap dann optimal gezeichnet werden kann.

    VB.NET-Quellcode

    1. public Function GetDestRectangle(rctPdf As Rectangle, szBitmap As Size) As Rectangle
    2. '...