2010-12-13 22 views
15

Tengo una imagen JPEG con un DPI de 72. Quiero cambiar de 72 ppp a 300 ppp.¿Cómo cambiar la resolución (DPI) de una imagen?

¿Cómo puedo cambiar la resolución de las imágenes JPEG con C#?

+2

DPI es relativa - por lo general sólo tiene sentido en la forma en que se procesa (por ejemplo, a una impresora o pantalla) o cuando se lee en (por ejemplo, a partir de un escáner). Guardar el DPI en estos casos permite una reproducción de tamaño exacto, por ejemplo. Los datos [EXIF] (http://en.wikipedia.org/wiki/Exchangeable_image_file_format) que se pueden almacenar dentro de las imágenes JPEG (pero no 2k) es donde se guarda la información de la DPI. –

Respuesta

6

This article conversaciones sobre cómo modificar el EXIF data sin la re- guardar/volver a comprimir (y por lo tanto la pérdida de información, en realidad utiliza un "truco"; puede haber más librerías directas) requerido por el enfoque SetResolution. Esto se encontró en una búsqueda rápida en Google, pero quería señalar que todo lo que necesita es modificar los datos EXIF ​​almacenados.

Also: .NET lib for EXIF modification y SO question. Google posee cuando sabes buenos términos de búsqueda.

4

Es simplemente una cuestión de escalar el ancho y el alto de la imagen con la proporción correcta. No todos los formatos de imagen admiten una metaetiqueta de DPI, y cuando lo hacen, todo lo que le dicen a su software de gráficos es dividir la imagen por la proporción suministrada.

Por ejemplo, si exporta una imagen de 300dpi desde Photoshop a JPEG, la imagen parecerá muy grande cuando se visualice en su software de visualización de imágenes. Esto se debe a que la información DPI no es compatible con JPEG y se descarta cuando se guarda. Esto significa que su visor de imágenes no sabe para qué razón dividir la imagen y, en su lugar, muestra la imagen en una proporción de 1: 1.

Para obtener la relación que necesita para escalar la imagen, consulte el código a continuación. Solo recuerde, este hará que estire la imagen, tal como lo haría en Photoshop. En esencia, estás cuadruplicando el tamaño de la imagen para que se estire y pueda producir artefactos.

código Pseudo

ratio = 300.0/72.0 // 4.167 
image.width * ratio 
image.height * ratio 
38

Tienes que copiar los bits sobre una nueva imagen con la resolución de destino, así:

using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg")) 
    { 
     using (Bitmap newBitmap = new Bitmap(bitmap)) 
     { 
      newBitmap.SetResolution(300, 300); 
      newBitmap.Save("file300.jpg", ImageFormat.Jpeg); 
     } 
    } 
+0

También debe mencionar que en el caso de JPEG, el guardado en un archivo nuevo causará pérdidas de compresión adicionales –

+0

Absolutamente, podemos observar que el archivo se vuelve más y más pequeño cada vez –

+9

¿Hay alguna razón para que * copie * el mapa de bits? en lugar de simplemente llamar a 'SetResolution' en el original? –

-1

DPI no debe almacenarse en un archivo de imagen de mapa de bits, ya que la mayoría de las fuentes de datos para mapas de bits lo dejan sin sentido.

Una imagen de mapa de bits se almacena como píxeles. Los píxeles no tienen un tamaño inherente en ningún aspecto. Es solo en el momento del renderizado, ya sea un monitor, una impresora o una máquina de pespunteado automático, lo que importa.

Una imagen de mapa de bits 800x1000 píxeles, impreso en 100 ppp, se convierte en un buen 8x10" foto. Impreso a 200 ppp, la imagen de mapa de bits exactamente igual se convierte en un 4x5" foto.

Capture una imagen con una cámara digital, y ¿qué significa DPI? Ciertamente no es el tamaño del área enfocada en el generador de imágenes CCD, eso depende de la distancia, y con la NASA devolviendo imágenes de galaxias que tienen 100,000 años luz de diferencia y 2 millones de años luz de diferencia, en el mismo campo de visión, de qué tipo de DPI se obtiene de QUE información?

No sea víctima de la idea del DPI de una imagen de mapa de bits, es un error. Una imagen de mapa de bits no tiene dimensiones físicas (excepto por algunos micrómetros de espacio de almacenamiento en la RAM o el disco duro). Es solo una imagen mostrada, o una imagen impresa, que tiene un tamaño físico en pulgadas, o milímetros, o estadios.

+4

DPI se almacena en formatos de mapa de bits como JPEG y PNG. –

+6

DPI se utiliza para interpretar el significado físico de los píxeles. Entonces tu información es correcta y tu conclusión es incorrecta. DPI es útil y a menudo necesario para trabajar con archivos de mapa de bits. – TaW

-2

Este código usando combinar y convertir 200 DBI

static void Main(string[] args) 
     { Path string Outputpath = @"C:\Users\MDASARATHAN\Desktop\TX_HARDIN_10-01-2016_K"; 

      string[] TotalFiles = Directory.GetFiles(Outputpath, "*.tif", SearchOption.AllDirectories); 
      foreach (string filename in TotalFiles) 
      { 

       Bitmap bitmap = (Bitmap)Image.FromFile(filename); 

       string ExportFilename = string.Empty; 
       int Pagecount = 0; 
       bool bFirstImage = true; 
       bitmap.SetResolution(200, 200); 

       ExportFilename = Path.GetDirectoryName(filename) + "\\" + Path.GetFileName(filename)+"f"; 
       MemoryStream byteStream = new MemoryStream(); 
       Pagecount = bitmap.GetFrameCount(FrameDimension.Page); 

       if (bFirstImage) 
       { 
        bitmap.Save(byteStream, ImageFormat.Tiff); 
        bFirstImage = false; 
       } Image tiff = Image.FromStream(byteStream); 
       ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"); 
       EncoderParameters encoderParams = new EncoderParameters(2); 
       EncoderParameter parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
       encoderParams.Param[0] = parameter; 
       parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); 
       encoderParams.Param[1] = parameter; 
       // bitmap.Dispose(); 
       try 
       { 

        tiff.Save(ExportFilename, encoderInfo, encoderParams); 
       } 
       catch (Exception ex) 
       { 

       } 
       EncoderParameters EncoderParams = new EncoderParameters(2); 
       EncoderParameter SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); 
       EncoderParameter CompressionEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
       EncoderParams.Param[0] = CompressionEncodeParam; 
       EncoderParams.Param[1] = SaveEncodeParam; 
       if (bFirstImage == false) 
       { 

        for (int i = 1; i < Pagecount; i++) 
        { 

          //bitmap = (Bitmap)Image.FromFile(filenames); 
          byteStream = new MemoryStream(); 
          bitmap.SelectActiveFrame(FrameDimension.Page, i); 
          bitmap.Save(byteStream, ImageFormat.Tiff); 
          bitmap.SetResolution(200, 200); 
          tiff.SaveAdd(bitmap, EncoderParams); 

        } 

       } SaveEncodeParam = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush); 
       EncoderParams = new EncoderParameters(1); 
       EncoderParams.Param[0] = SaveEncodeParam; 
       tiff.SaveAdd(EncoderParams); 
       tiff.Dispose(); 
       bitmap.Dispose(); 
       File.Delete(filename); 

      } 


     } 
+2

¿Pueden por favor explicar cómo esto resolvería el problema? – Phani

+1

Este código explica cómo combinar un conjunto de imágenes TIFF de una sola página en un archivo TIFF de varias páginas; no parece relacionado con la pregunta en absoluto. –

Cuestiones relacionadas