ejemplo - C#¿Por qué Bitmap.Save ignora PixelFormat de Bitmap?
crear bitmap c# (4)
Necesito procesar y guardar imágenes en su bpp original (1 - para BnW, 8 - para gris, 24 - color). Después del procesamiento, siempre tengo 24bpp (debido al procesamiento con Aforge.Net). Paso el bpp original a la función de guardado y estoy usando el siguiente código para guardar:
private static Bitmap changePixelFormat(Bitmap input, PixelFormat format)
{
Bitmap retval = new Bitmap(input.Width, input.Height, format);
retval.SetResolution(input.HorizontalResolution, input.VerticalResolution);
Graphics g = Graphics.FromImage(retval);
g.DrawImage(input, 0, 0);
g.Dispose();
return retval;
}
Cuando paso:
PixelFormat.Format8bppIndexed
Me aparece una excepción: "El objeto gráfico no puede crear una imagen en formato de píxel indexado" en la línea:
Graphics g = Graphics.FromImage(retval);
He intentado con el siguiente código:
Bitmap s = new Bitmap("gray.jpg");
Bitmap NewPicture = s.Clone(new Rectangle(0, 0, s.Width, s.Height), PixelFormat.Format8bppIndexed);
Después de esta "NewImage" tiene PixelFormat 8bppIndexed, pero cuando estoy guardando NewImage:
NewPicture.Save("hello.jpg", ImageFormat.Jpeg);
hello.jpg tiene 24 ppp.
Necesito mantener el bpp y el formato de imagen de la imagen original.
¿Por qué Bitmap.Save ignora PixelFormat de Bitmap?
=============================================== =====
Gracias chicos, he encontrado una solución: http://freeimage.sourceforge.net/license.html
Con la ayuda de esta biblioteca gratuita, es posible guardar imágenes (especialmente JPEG) en Escala de grises de 8 bits.
Aquí está el código que convertirá un mapa de bits en un mapa de bits de 1bpp / 8bpp. 1bpp / 8bpp en C #.
En su método changePixelFormat puede verificar qué formato de corrección necesita para convertirse, luego si es 1bpp u 8 bpp, entonces use el código del enlace y para todos los demás formatos use su código.
Graphics.FromImage
documentación de Graphics.FromImage
tiene observaciones:
Si la imagen tiene un formato de píxel indexado, este método arroja una excepción con el mensaje "No se puede crear un objeto de Gráficos a partir de una imagen que tenga un formato de píxel indexado". Los formatos de píxeles indexados se muestran en la siguiente lista.
Format1bppIndexed
Format4bppIndexed
Format8bppIndexed
PARTE NUEVA:
Esto es lo que encontré después de googlear brevemente:
8bpp en escala de grises y 8bpp jpg no son compatibles con gdiplus versión 1.0. Hay una nueva versión de gdiplus en Windows 7 que admite imágenes en escala de grises y compatibilidad con códecs mejorada.
Las imágenes jpeg indexadas de 8bpp son compatibles con la API de WIC de Microsoft.
Puede intentarlo usted mismo descargando el explorador de WIC desde el sitio de descarga de Microsoft.
GDI + carga de 8 bits / error de guardado
La norma JPEG solo admite imágenes de 24 bits.
Estoy casi seguro de que el formato de imagen JPEG no admite imágenes indexadas. Por lo tanto, aunque haya creado la imagen que especifica PixelFormat.Format8bppIndexed
, GDI + la convertirá a un formato diferente cuando intente guardarla como JPEG. En este caso, ya ha determinado que son 24 bpp.
En su lugar, debe guardar la imagen como BMP o GIF. Por ejemplo:
NewPicture.Save("hello.jpg", ImageFormat.Bmp);
Consulte la tabla de formatos de archivos de imagen que admiten el color indexado aquí en Wikipedia .
Use la clase de gráficos para imágenes no indexadas. UseBitmap.LockBits y Bitmap.UnlockBits cuando procesa imágenes indexadas
Si estás buscando una verdadera imagen de mapa de bits en escala de grises de 8 bits, hice una publicación detallada sobre al respecto. Funcionará en cualquier sistema operativo (Windows / Mac / Linux), no solo Windows 7. Espero que ayude.