c# - town - ¿Cómo cambiar la resolución(DPI) de una imagen?
ppp imagen (5)
Tengo una imagen JPEG con un DPI de 72. Quiero cambiar 72 dpi a 300 dpi.
¿Cómo podría cambiar la resolución de las imágenes JPEG utilizando C #?
Debe copiar los bits sobre una nueva imagen con la resolución de destino, como esto:
using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
{
using (Bitmap newBitmap = new Bitmap(bitmap))
{
newBitmap.SetResolution(300, 300);
newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
}
}
Es simplemente una cuestión de escalar el ancho y la altura de la imagen en la proporción correcta. No todos los formatos de imágenes admiten una etiqueta de identificación de PPP, y cuando lo hacen, lo único que le dicen a su software de gráficos es que dividan la imagen por la proporción proporcionada.
Por ejemplo, si exporta una imagen de 300 ppp de Photoshop a un JPEG, la imagen parecerá ser muy grande cuando se vea en su software de visualización de imágenes. Esto se debe a que la información de DPI no es compatible con JPEG y se descarta cuando se guarda. Esto significa que su visor de imágenes no sabe qué proporción dividir la imagen por y en su lugar muestra la imagen en una proporción de 1: 1.
Para obtener la proporción que necesita para escalar la imagen, consulte el siguiente código. Solo recuerda, esto estirará la imagen, como lo haría en Photoshop. Básicamente, está cuadruplicando el tamaño de la imagen, por lo que se extenderá y puede producir artefactos.
Pseudo codigo
ratio = 300.0 / 72.0 // 4.167
image.width * ratio
image.height * ratio
Este código utiliza unir 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);
}
}
Los DPI no deben almacenarse en un archivo de imagen de mapa de bits, ya que la mayoría de las fuentes de datos para mapas de bits no tienen sentido.
Una imagen de mapa de bits se almacena como píxeles. Los píxeles no tienen ningún tamaño inherente en ningún aspecto. Es solo en el momento de renderizar, ya sea el monitor, la impresora o la máquina de crossstitching automatizada, lo que importa el DPI.
Una imagen de mapa de bits de 800x1000 píxeles, impresa a 100 ppp, se convierte en una bonita foto de 8x10 ". Impresa a 200 ppp, la imagen de mapa de bits EXACT MISMO se convierte en una foto de 4x5".
Captura una imagen con una cámara digital, ¿y qué significa DPI? Ciertamente no es el tamaño del área enfocada en el reproductor 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 diámetro y 2 millones de años luz de diferencia, en el mismo campo de visión, ¿qué tipo de DPI obtienes de esa 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 (ahorre unos pocos micrómetros de espacio de almacenamiento en la RAM o en el disco duro). Es solo una imagen mostrada, o una imagen impresa, que tiene un tamaño físico en pulgadas, milímetros, o furlongs.
Este artículo habla sobre la modificación de los EXIF sin volver a guardar / volver a comprimir (y, por lo tanto, la pérdida de información; en realidad usa un "truco"; puede haber más bibliotecas directas) requerida 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 hacer es modificar los datos EXIF almacenados.
También: .NET lib para modificación EXIF y otra pregunta SO . Google posee cuando sabes buenos términos de búsqueda.