¿Existe una forma económica de obtener las dimensiones de una imagen (jpg, png, ...)? Preferiblemente, me gustaría lograr esto usando solo la biblioteca de clases estándar (debido a las restricciones de alojamiento). Sé que debería ser relativamente fácil leer el encabezado de la imagen y analizarlo yo mismo, pero parece que algo como esto ya debería estar allí. Además, he verificado que el siguiente código lee la imagen completa (que no quiero):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
fuente
fuente
Respuestas:
Su mejor apuesta, como siempre, es encontrar una biblioteca bien probada. Sin embargo, dijiste que es difícil, por lo que aquí hay un código poco probado que debería funcionar para un buen número de casos:
Con suerte, el código es bastante obvio. Para agregar un nuevo formato de archivo, lo agrega
imageFormatDecoders
con la clave como una matriz de los "bits mágicos" que aparecen al principio de cada archivo del formato dado y el valor es una función que extrae el tamaño de la secuencia. La mayoría de los formatos son bastante simples, el único apestoso real es jpeg.fuente
throw e;
sino simplementethrow;
. Sus comentarios del documento XML en el segundoGetDimensions
también se muestran enpath
lugar debinaryReader
el
validateImageData
conjunto parafalse
evita que GDI + realice análisis costosos de los datos de la imagen, lo que reduce considerablemente el tiempo de carga. Esta pregunta arroja más luz sobre el tema.fuente
new Bitmap()
.¿Ha intentado utilizar las clases de imágenes de WPF?
System.Windows.Media.Imaging.BitmapDecoder
, etc.?Creo que se hizo un esfuerzo para asegurarse de que esos códecs solo leyeran un subconjunto del archivo para determinar la información del encabezado. Vale la pena comprobarlo.
fuente
Estaba buscando algo similar unos meses antes. Quería leer el tipo, la versión, la altura y el ancho de una imagen GIF, pero no pude encontrar nada útil en línea.
Afortunadamente, en el caso de GIF, toda la información requerida estaba en los primeros 10 bytes:
PNG son un poco más complejos (el ancho y el alto son de 4 bytes cada uno):
Como se mencionó anteriormente, wotsit es un buen sitio para especificaciones detalladas sobre formatos de imagen y datos, aunque las especificaciones PNG en pnglib son mucho más detalladas. Sin embargo, creo que la entrada de Wikipedia sobre PNG y GIF formatos es el mejor lugar para comenzar.
Aquí está mi código original para verificar GIF, también he juntado algo para PNG:
fuente
Según las respuestas hasta ahora y algunas búsquedas adicionales, parece que en la biblioteca de clases .NET 2 no hay ninguna funcionalidad para ello. Así que decidí escribir el mío. Aquí hay una versión muy aproximada. Por el momento, lo necesitaba solo para JPG. Así completa la respuesta publicada por Abbas.
No hay verificación de errores ni ninguna otra verificación, pero actualmente lo necesito para una tarea limitada y, eventualmente, se puede agregar fácilmente. Lo probé en varias imágenes y, por lo general, no lee más de 6K en una imagen. Supongo que depende de la cantidad de datos EXIF.
fuente
Hice esto para un archivo PNG
fuente
Sí, absolutamente puede hacer esto y el código depende del formato del archivo. Trabajo para un proveedor de imágenes ( Atalasoft ), y nuestro producto proporciona un GetImageInfo () para cada códec que hace lo mínimo para averiguar las dimensiones y algunos otros datos fáciles de obtener.
Si desea lanzar el suyo, le sugiero que comience con wotsit.org , que tiene especificaciones detalladas para casi todos los formatos de imagen y verá cómo identificar el archivo y también dónde se puede encontrar la información.
Si se siente cómodo trabajando con C, entonces el jpeglib gratuito se puede utilizar para obtener esta información también. Apostaría a que puede hacer esto con bibliotecas .NET, pero no sé cómo.
fuente
new AtalaImage(filepath).Width
hace algo similar?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Se actualizó la respuesta de ICR para admitir jPegs progresivos y WebP también :)
fuente
Dependerá del formato de archivo. Por lo general, lo indicarán en los primeros bytes del archivo. Y, por lo general, una buena implementación de lectura de imágenes lo tendrá en cuenta. Sin embargo, no puedo señalarle uno para .NET.
fuente