2010-05-15 8 views
8

Ich versuche, ein Bild in der Größe von einer Bitmap zu erstellen, eine neue Höhe/Breite und eine neue Auflösung festzulegen und in PNG zu speichern. Ich kann dies entweder von direkt A) Image.FromFile(filename) oder B) New Bitmap(imageSource) die die Ein Bitmap zu erstellen, um B weitergegeben werden. Beide arbeiten in Ordnung schmokay, aber A mir nicht erlauben, eine neue Breite/Höhe zu setzen bei der Erstellung (aber es erlaubt mir Werte mit useIcm=True zu erhalten) und B mir nicht erlauben Werten preseve.Beibehaltung der Bitmap-Werte beim Erstellen einer neuen Bitmap aus System.Drawing.Image

Okay, nun an einigen Code und Beispiele:

  1. Dim sourceBitmap As New Bitmap(imagePath & myImage1Name) < -keine gut auf allen (# 1 Überlast). Nicht beibehalten Dinge wie HorizontalResolution oder PixelFormat auf .Save

  2. Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True) < -keine gut (# 5 Überlast). es tut Dinge bewahren wie HorizontalResolution oder PixelFormat auf .Save, aber es nicht erlauben Sie mir Bild mit einer neuen Größe zu initialisieren.

  3. Dim targetBitmap As New Bitmap(sourceBitmap2, newWidth, newHeight) < -nicht gut. Obwohl sourceBitmap2 (siehe # 2 oben) war mit useIcm=True initialisiert, es nicht einmal egal, ich habe es übergeben in als Quelle in targetBitmap.

Grundsätzlich bin ich nach einer Möglichkeit, sowohl mit etwas eine neue Bitmap contruct wie useIcm=Trueund Legen Sie die Breite/Höhe zur gleichen Zeit (Width/Height sind schreibgeschützte Eigenschaften, sobald sie erstellt wird) .

Ich bin die Graphics.DrawImage Route auch runtergegangen und es ist das gleiche - Graphics.FromImage(sourceBitmap) behält keine Werte.

Warum müssen diese Werte beibehalten werden? Weil ich diese Bilder in PNG (für Dateigröße) mit einer neuen Auflösung umwandeln muss und die gleichen physischen Maße (w/h in Zoll) für das Drucken behalten muss. Ich kenne die neue Pixelbreite/-höhe, die benötigt wird, basierend auf den Auflösungswerten, die ich mit .SetResolution(xDpi,yDpi) übergeben werde, um physische Abmessungen zu erhalten, so dass das nicht das Problem ist. Das Problem ist, Dinge wie die PixelFormatSize müssen unverändert bleiben (ja, ich habe versucht EncoderParameters - sie funktionieren nicht. Ich kann Ihnen die blutigen Details geben, wenn Sie möchten, aber es genügt zu sagen, sie tun es einfach nicht Arbeit).

Puh, das hab ich kaputt! Okay, wer weiß wirklich wie das alles funktioniert?

EDIT: Dateitypen benötigt, um in PNG konvertieren: BMP, TIF, GIF, WMF, EMF.

+0

Reflektor kann Ihr Freund hier sein. Sie können möglicherweise eine genaue Kombination aus Konstruktor und API ermitteln, die Ihnen das liefert, was Sie möchten. –

+0

Danke Mark. Reflector kenne ich nicht, aber ich schaue nach. Klingt vielversprechend. –

Antwort

3

Warum nicht einfach Dim targetBitmap As New Bitmap(Image.FromFile(imagePath & myImage1Name, True), newWidth, newHeight)?

+0

Perfekt, weiß nicht, wie ich das verpasst habe! –

3

Wie wäre es mit etwas wie dem folgenden Code: Sie können die Bitmap auf einem NEWGraphic zeichnen. Sie können dann mit der Größe umgehen, wenn Sie es neu zeichnen.

Dim NewGraphic As Graphics = Nothing 
     Dim OutBMP As Bitmap 

     Using bmp As New Bitmap(3264, 4224) 
      Try 

       NewGraphic = Graphics.FromImage(bmp) 
       NewGraphic.FillRectangle(New SolidBrush(Color.White), 0, 0, 3264, 4224) 
       NewGraphic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
       NewGraphic.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
       NewGraphic.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality 
       NewGraphic.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
       NewGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit 

       NewGraphic.DrawImage(MetaFileToConvert, 0, 0, 3264, 4224) 

       OutBMP = CType(FFConvertToBitonal(CType(bmp, Bitmap)), Bitmap) 
       OutBMP.SetResolution(385, 385) 

       OutImage = DirectCast(OutBMP, Image) 

      Catch ex As Exception 
       Throw ex 
      Finally 
       NewGraphic.Dispose() 

      End Try 

     End Using 
+1

Danke pehaada für die Antwort und den Code, ich schätze es. Leider verursacht die Verwendung eines 'Graphic'-Objekts noch mehr Probleme, wenn versucht wird, die Einstellungen der ursprünglichen Bitmap beizubehalten. +1 für den Code und detaillierte Antwort obwohl! –

Verwandte Themen