2010-05-15 24 views
8

Estoy tratando de crear una imagen redimensionada desde un mapa de bits, establecer un nuevo alto/ancho y una nueva resolución y guardarla en PNG. Puedo hacer esto ya sea directamente desde A) Image.FromFile(filename) o B) New Bitmap(imageSource) para crear el la A Bitmap ser pasado a B. Ambos trabajan bien schmokay, pero Un no permite que fije una nueva anchura/altura en la creación (pero no me permite preservar los valores con useIcm=True) y B no me permite preseve valores.Preservar los valores de mapa de bits al crear un nuevo mapa de bits desde System.Drawing.Image

bien, de ahora en cierto código y ejemplos:

  1. Dim sourceBitmap As New Bitmap(imagePath & myImage1Name) < -no bueno en absoluto (# 1 sobrecarga). No conserva cosas como HorizontalResolution o PixelFormat en .Save

  2. Dim sourceBitmap2 As Bitmap = Image.FromFile(imagePath & myImage1Name, True) < -no buena (# 5 sobrecarga). se hace preservar cosas como HorizontalResolution o PixelFormat en .Save, pero no se me permite inicializar la imagen a un nuevo tamaño.

  3. Dim targetBitmap As New Bitmap(sourceBitmap2, newWidth, newHeight) < -no está bien. A pesar de que sourceBitmap2 (ver # 2 arriba) fue inicializado con useIcm=True, que no importa, una vez que he pasado en como la fuente de targetBitmap.

Básicamente, estoy buscando una manera de contruct un nuevo mapa de bits tanto con algo así como useIcm=Truey establecer el ancho/altura al mismo tiempo (Width/Height son propiedades de sólo lectura una vez que se ha creado) .

He pasado por la ruta Graphics.DrawImage también y es la misma - Graphics.FromImage(sourceBitmap) no conserva los valores.

¿Por qué necesito que se conserven estos valores? Porque necesito convertir estas imágenes a PNG (para el tamaño del archivo) con una nueva resolución y mantener las mismas dimensiones físicas (p/h en pulgadas) para imprimir. Conozco el nuevo ancho/alto de píxel necesario en función de los valores de resolución que voy a pasar con .SetResolution(xDpi,yDpi) para preservar las dimensiones físicas, por lo que ese no es el problema. El problema es que las cosas como la PixelFormatSize necesitan permanecer sin cambios (sí, lo intenté EncoderParameters - no funcionan. Puedo darte los detalles sangrientos si quieres, pero basta decir que por ahora, simplemente no lo hacen trabajo).

¡Vaya, me quité eso de encima! De acuerdo, ¿alguien que realmente sepa cómo funciona todo esto puede ayudar?

EDIT: Tipos de archivos necesarios para convertir a PNG: BMP, TIF, GIF, WMF, EMF.

+0

Reflector puede ser tu amigo aquí. Es posible que pueda determinar una combinación exacta de constructor y API que le brinde lo que desea. –

+0

Gracias Mark. No estoy familiarizado con Reflector, pero voy a echarle un vistazo. Suena potencialmente prometedor. –

Respuesta

3

¿Por qué no acaba de hacer Dim targetBitmap As New Bitmap(Image.FromFile(imagePath & myImage1Name, True), newWidth, newHeight)?

+0

¡Perfecto, no sé cómo me lo perdí! –

3

¿Qué tal si hace algo como el siguiente código: Puede dibujar el mapa de bits en un NEWGraphic. Luego puedes jugar con el tamaño cuando lo vuelves a dibujar.

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

Gracias pehaada por la respuesta y el código, lo agradezco. Desafortunadamente, el uso de un objeto 'Gráfico' causa aún más problemas cuando se trata de preservar la configuración del mapa de bits original. +1 para el código y respuesta detallada sin embargo! –

Cuestiones relacionadas