Pregunta

Estoy cargando un mapa de bits desde un archivo jpg.Si la imagen no es RGB de 24 bits, me gustaría convertirla.La conversión debería ser bastante rápida.Las imágenes que estoy cargando son enormes (9000*9000 píxeles con un tamaño comprimido de 40-50 MB).¿Cómo se puede hacer esto?

Por cierto:No quiero utilizar ninguna biblioteca externa si es posible.Pero si conoce una clase de utilidad de código abierto que realiza las tareas de imágenes más comunes, me encantaría saberlo.Gracias de antemano.

¿Fue útil?

Solución

El jpeg debería comenzar con 0xFF 0xd8. Después de que se encuentran varios campos en el formato:

  1. identificador de campo de 2 bytes
  2. Longitud de campo, con exclusión de identificador de campo. 2 bytes.
  3. Los datos variables.

analizar a través de los campos. El identificador se le busca es 0xFF 0xC0. Esto se llama SOF0, y contiene altura, anchura, profundidad de bits, etc. 0xFF 0xC0 será seguido por dos bytes para la longitud del campo. Inmediatamente después de que será un solo byte que muestra la profundidad de bits, que normalmente será 8. Entonces habrá dos bytes para la altura, dos para la anchura, y un solo byte para el número de componentes; este será usualmente 1 (para escala de grises) o 3. (por color)

Otros consejos

Esto no es algo que haya probado yo mismo, pero creo que, para empezar, es posible que necesites acceder a la información EXIF ​​de la imagen.

Consulte la entrada del blog de Scott Hanselman sobre cómo acceder a la información EXIF ​​de las imágenes.

Estándar .NET System.Drawing espacio de nombres debe tener todo lo que necesita, pero probablemente no será muy eficiente. Se va a cargar toda la cosa en la memoria RAM, descomprimirlo, convertirlo (probablemente haciendo una copia) y luego volver a comprimir y guardarlo. Si tu objetivo para el alto rendimiento, me temo que puede que tenga que buscar en bibliotecas C / C ++ .NET y hacer envolturas para ellos.

Por lo que yo sé jpg es siempre 24 bpp. La única cosa que podría cambiar sería que se trata de CMY (K?) En lugar de RGB. Esa información se almacena en la cabecera. Por desgracia no tengo ningún medio de la creación de una imagen CMYK para probar si la carga en un mapa de bits lo convertirá automáticamente.

La siguiente línea leerá el archivo en la memoria:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat le dirá el formato de imagen. Sin embargo, no puedo probar lo que la carga de archivos hace con archivos que no sean archivos JPG 24bpp RGB. Sólo puedo recomendar que lo pruebe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top