Convertir una imagen a una matriz de bytes en blanco y negro
-
25-09-2019 - |
Pregunta
Yo escribo una biblioteca de interfaz de C # con el lenguaje de impresora EPL2. Una característica que me gustaría tratar de poner en práctica es la impresión de imágenes, el doc especificación dice
p1 = Ancho de gráfico Ancho de gráfico en bytes. Ocho (8) puntos = un (1) byte de datos.
p2 = Longitud del gráfico Longitud del gráfico en puntos (o líneas de impresión)
datos binariosDatos = primas sin formato de archivo gráfico. Los datos deben estar en bytes. Multiplicar el ancho en bytes (P1) por el número de líneas de impresión (P2) para la cantidad total de datos gráficos. La impresora calcula automáticamente el tamaño exacto del bloque de datos en base a esta fórmula.
planeo en la imagen mi fuente es un archivo BMP 1 bit por píxel, ya a escala en tamaño. Sólo que no sé cómo conseguir que a partir de ese formato en el que un byte [] para mí enviar a la imprenta. Probé ImageConverter.ConvertTo(Object, Type)
tiene éxito pero el vector al que da salida no es el tamaño correcto y la documentación es muy escaso sobre cómo se formatea la salida.
Mi código de prueba actual.
Bitmap i = (Bitmap)Bitmap.FromFile("test.bmp");
ImageConverter ic = new ImageConverter();
byte[] b = (byte[])ic.ConvertTo(i, typeof(byte[]));
Cualquier ayuda es muy apreciada, incluso si es en una dirección totalmente diferente.
Solución 2
Como dijo que necesitaba usar LockBits
Rectangle rect = new Rectangle(0, 0, Bitmap.Width, Bitmap.Height);
System.Drawing.Imaging.BitmapData bmpData = null;
byte[] bitVaues = null;
int stride = 0;
try
{
bmpData = Bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, Bitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
stride = bmpData.Stride;
int bytes = bmpData.Stride * Bitmap.Height;
bitVaues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, bitVaues, 0, bytes);
}
finally
{
if (bmpData != null)
Bitmap.UnlockBits(bmpData);
}
Otros consejos
Si sólo necesita para convertir su mapa de bits en una matriz de bytes, intente utilizar un MemoryStream:
Salida este enlace: C # imagen para matriz de bytes y la matriz de bytes en Image Converter Clase
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}