Pregunta

Tengo un problema extraño: tengo alrededor de 14.5 millones de imágenes de mapa de bits, que supuestamente no están comprimidas. Necesito convertir estos mapas de bits a JPG y almacenarlos en una base de datos.

Cuando uso las clases proporcionadas en la biblioteca de .NET System.Drawing para guardar el mapa de bits como un ImageFormat.Jpeg, el JPEG resultante es aproximadamente dos veces el tamaño del mapa de bits original. Aquí está el código:

byte[] bitmapBytes = //get from the db
using(MemoryStream bitmapStream = new MemoryStream(bitmapBytes))
{
   using(Bitmap bitmap = (Bitmap)Bitmap.FromStream(bitmapStream))
   {
       bitmap.Save("jpg.jpg", ImageFormat.Jpeg);
   }
}

He revisado el HEX de varias de estas imágenes, y parece que la configuración de compresión es " ninguna " Así que estoy asumiendo que son sin comprimir. Además, el HEX para el archivo original tiene el " BMP " El código y el archivo resultante tienen el " JFIF " codifique como esperaría.

Las imágenes son en blanco y negro, sin colores.

¿Alguna idea de por qué esto estaría sucediendo? Buscando punteros en la dirección correcta ...

Ediciones:

  • He intentado usar la sobrecarga alternativa para guardar que te permite especificar la calidad. No se han visto beneficios.
  • También debo especificar que estoy un poco atascado con JPEG hasta cierto punto aquí. Este es un sistema heredado y otras partes del sistema esperan JPEG.

Atributos de la imagen:

  • Dimensiones de mapa de bits: 152x48
  • Tamaño de archivo de mapa de bits: 1022 bytes
  • JPEG: misma dimensión
  • tamaño JPEG: 2.2 kb
  • Información de mapa de bits: indexada, 1 capa (2 colores)
  • Resolución de mapa de bits: 96.012x 96.012 ppi
¿Fue útil?

Solución

Probablemente se deba a que las imágenes jpeg que está guardando ahora son imágenes en color RGB de 24 bits, donde los mapas de bits son imágenes en blanco y negro de 1 bpp.

Si los mapas de bits son 1 bpp, jpeg probablemente no sea el mejor formato para convertirlos.

Otros consejos

¿Blanco y negro o escala de grises?

De http://www.faqs.org/faqs /compression-faq/part2/section-6.html :

" JPEG funciona en imágenes a todo color o en escala de grises; no maneja Imágenes de dos niveles (blanco y negro), al menos no bien. No maneja imágenes colormapped tampoco; tienes que pre-expandirlos en un no mapeado Representación a todo color. JPEG funciona mejor en " tono continuo " imagenes Las imágenes con muchos saltos repentinos en los valores de color no se comprimirán correctamente. & Quot;

Debe establecer un atributo para que el codificador le indique el nivel de compresión que debe usar.

Ver también

Querrá cambiar a usar esta sobrecarga de Bitmap.Save , por lo que puede especificar el EncoderParameter .

En cuanto a por qué sus archivos se están haciendo más grandes, puede ser que su BMP se haya ejecutado con codificación de longitud, o que esté utilizando un mapa de bits más pequeño (no de 24 bits).

Una comparación de tamaños para una imagen de 61x64 en 2 colores:

  • Fax-4 tiff: 268 bytes
  • bmp de 2 colores (como arriba): 550 bytes
  • 8 bit jpeg: 1502 bytes
  • jpeg de 32 bits (como lo haría System.Drawing crear): 2015 bytes

Entonces, si tienes que usar jpegs, primero conviértelos a 8 bits. Hacer eso en .Net será incómodo, pero hay código de ejemplo disponible en CodeProject y otros.

Sólo quería seguir con mi solución. Pude lograr que el resto del sistema admitiera gráficos en formato PNG, así que lo que hice fue convertir los mapas de bits en gráficos PNG, y hacerlos de 1 bit por píxel en blanco y negro. Esto los hizo pequeños y eficientes.

Entonces, el problema fue que los JPG simplemente no hacen bien las imágenes de pocos colores.

Solo un pensamiento: usted dice que parte de su sistema necesita que los archivos sean archivos JPEG. ¿Es eso realmente cierto o solo necesita los archivos para tener la extensión JPG? Si es así, podría, aunque sea feo, simplemente cambiar el nombre de la extensión del archivo, ya que los archivos BMP en su caso son más pequeños.

Por ejemplo, en Windows, puede tomar un archivo BMP y cambiar su extensión a JPG. Cuando lo abre, a Windows no le importa y lo muestra correctamente.

Este artículo kb debería mostrarte cómo hacerlo

http://support.microsoft.com/kb/324790

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