scanner manipular escaner desde c# .net windows image

manipular - C#Convertir imagen de 32bpp a 8bpp



scanning documents using c# (4)

Estoy intentando convertir una imagen de captura de pantalla de 32bpp a un formato de 8bpp (o 4bpp o 1bpp) utilizando C #. Ya he mirado varias respuestas de stackoverflow sobre temas similares y la mayoría de las variaciones sugeridas utilizan el siguiente código:

public static Bitmap Convert(Bitmap oldbmp) { Bitmap newbmp = new Bitmap(oldbmp.Width, oldbmp.Height, PixelFormat.Format8bppIndexed); Graphics gr = Graphics.FromImage(newbmp); gr.PageUnit = GraphicsUnit.Pixel; gr.DrawImageUnscaled(oldbmp, 0, 0); return newbmp; }

Sin embargo, cuando esto se ejecuta, obtengo una excepción: A graphics object cannot be created from an image that has an indexed pixel format . Entiendo que las imágenes de 8, 4 y 1bpp tienen asignaciones de tablas de color en lugar de los píxeles de color reales (como en las imágenes de 32 o 16bpp), así que supongo que me estoy perdiendo algún paso de conversión en algún lugar, pero soy bastante nuevo en C # (próximamente) de un fondo de C ++) y preferiría poder hacer esto utilizando llamadas nativas de C # en lugar de recurrir a PInvoking BitBlt y GetDIBits etc. ¿Alguien puede ayudarme a resolver esto? Gracias.

EDITAR : Debería señalar que necesito que esto sea compatible con versiones anteriores de .NET framework 2.0


GDI + en general tiene un soporte muy pobre para los formatos de píxeles indexados. No hay una forma sencilla de convertir una imagen con 65536 o 16 millones de colores en uno que solo tenga 2, 16 o 256. Los colores deben eliminarse de la imagen de origen y esa es una conversión con pérdida que puede tener resultados muy pobres. Hay varios algoritmos disponibles para lograr esto, ninguno de ellos es perfecto para cada tipo de imagen. Este es un trabajo para un editor de gráficos.

Hay un truco que encontré. GDI + tiene un codificador de imagen para archivos GIF. Es un formato de gráficos que tiene solo 256 colores, el codificador debe limitar la cantidad de colores. Utiliza un algoritmo de dithering que es adecuado para fotos. Tiene una habilidad especial para generar un patrón de cuadrícula, estarás menos emocionado cuando lo haga. Úsalo así:

public static Image Convert(Bitmap oldbmp) { using (var ms = new MemoryStream()) { oldbmp.Save(ms, ImageFormat.Gif); ms.Position = 0; return Image.FromStream(ms); } }

La imagen devuelta tiene un formato de píxeles de 8 bpp con las entradas de la paleta calculadas por el codificador. Puedes convertirlo a Bitmap si es necesario. Por mucho, lo mejor que puede hacer es no molestarse con los formatos indexados. Se remontan a la edad de piedra de la computación cuando la memoria estaba severamente restringida. O utilice un editor de gráficos profesional.


La zancada negativa significa que la imagen está de abajo hacia arriba (invertida). Solo usa el absoluto de la zancada si no te importa. Sé que funciona para imágenes de 24bpp, sin saber si funciona para otros.


Puede usar System.Windows.Media.Imaging en PresentationCore Assembly, eche un vistazo here para obtener más información.


La biblioteca de AForge lo está haciendo perfectamente usando Grayscale .

var bmp8bpp = Grayscale.CommonAlgorithms.BT709.Apply(bmp);

Esta clase es la clase base para la escala de imagen [...] El filtro acepta imágenes en color de 24, 32, 48 y 64 bpp y produce 8 (si la fuente es 24 o 32 bpp) o 16 (si la fuente es 48 o 64 bpp). imagen) bpp imagen en escala de grises.