2010-05-15 16 views
8

Sto provando a creare un'immagine ridimensionata da una bitmap, impostare una nuova altezza/larghezza e una nuova risoluzione e salvarla in PNG. Posso fare questo sia da direttamente A) Image.FromFile(filename) o B) New Bitmap(imageSource) per creare la la A bitmap da passare al B. Entrambi lavorano schmokay va bene, ma Un non mi permette di impostare una nuova larghezza/altezza sulla creazione (ma non mi permette di preservare i valori con useIcm=True) e B non mi permette di preseve valori.Preservazione dei valori bitmap durante la creazione di una nuova bitmap da System.Drawing.Image

Va bene, d'ora in poi a un codice ed esempi:

  1. Dim sourceBitmap As New Bitmap(imagePath & myImage1Name) < -non va bene a tutti (# 1 sovraccarico). Non conservare le cose come HorizontalResolution o PixelFormat su .Save

  2. Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True) < -non buona (# 5 sovraccarico). si fa conservare le cose come HorizontalResolution o PixelFormat su .Save, ma non si mi permette di inizializzare immagine con un nuovo formato.

  3. Dim targetBitmap As New Bitmap(sourceBitmap2, newWidth, newHeight) < -non valido. Anche se sourceBitmap2 (vedi sopra # 2) è stato inizializzato con useIcm=True, è non ha importanza una volta che ho passato è come la fonte in targetBitmap.

Fondamentalmente, io sto cercando un modo per contruct una nuova bitmap sia con qualcosa come useIcm=Truee impostare la larghezza/altezza al tempo stesso (Width/Height sono proprietà di sola lettura una volta che è creato) .

Ho percorso il percorso Graphics.DrawImage ed è lo stesso - Graphics.FromImage(sourceBitmap) non conserva i valori.

Perché sono necessari questi valori da conservare? Perché ho bisogno di convertire queste immagini in PNG (per dimensioni del file) con una nuova risoluzione e mantenere le stesse dimensioni fisiche (w/h in pollici) per la stampa. Conosco la nuova larghezza/altezza del pixel necessaria in base ai valori di risoluzione che inoltrerò con .SetResolution(xDpi,yDpi) per preservare le dimensioni fisiche, quindi non è questo il problema. Il problema è che le cose come la PixelFormatSize devono rimanere invariate (sì, ho provato EncoderParameters - non funzionano. Posso darti i dettagli cruenti se vuoi, ma basti dire che per ora, semplicemente non lavoro).

Whew, me lo sono tolto dal petto! Ok, chi sa davvero come funziona tutto questo può aiutare?

EDIT: tipi di file necessari per eseguire il pull in PNG: BMP, TIF, GIF, WMF, EMF.

+0

Riflettore potrebbe essere tuo amico qui. Potresti essere in grado di determinare una combinazione esatta di costruttore e API che ti fornisce ciò che desideri. –

+0

Grazie Marco. Non ho familiarità con Reflector, ma darò un'occhiata. Sembra potenzialmente promettente. –

risposta

3

Perché non fare solo Dim targetBitmap As New Bitmap(Image.FromFile(imagePath & myImage1Name, True), newWidth, newHeight)?

+0

Perfetto, non so come mi sono perso! –

3

Che ne dici di fare qualcosa come il seguente codice: Puoi disegnare la bitmap su una NUOVA grafica. Puoi quindi modificare le dimensioni quando lo ridisci.

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

Grazie pehaada per la risposta e il codice, lo apprezzo. Sfortunatamente, l'uso di un oggetto 'Grafico' causa ancora più problemi quando si tenta di conservare le impostazioni della bitmap originale. +1 per il codice e risposta dettagliata però! –

Problemi correlati