Преобразовать изображение в монохромный байтовый массив - PullRequest
1 голос
/ 07 апреля 2010

Я пишу библиотеку для интерфейса C # с языком принтера EPL2. Одна из особенностей, которую я хотел бы попробовать реализовать, - это печать изображений, в документации спецификаций сказано:

p1 = Ширина графики Ширина графики в байтах. Восемь (8) точек = один (1) байт данных.

p2 = Длина графики Длина графики в точках (или печатных строках)

Данные = необработанные двоичные данные без графического форматирования файла. Данные должны быть в байтах. Умножьте ширину в байтах (p1) на количество строк печати (p2) для общего объема графических данных. Принтер автоматически вычисляет точный размер блока данных на основе этой формулы.

Я планирую сделать исходное изображение размером 1 бит на пиксель в формате bmp, уже масштабированное до размера. Я просто не знаю, как перевести его из этого формата в байт [], чтобы отправить его на принтер. Я попытался ImageConverter.ConvertTo(Object, Type), но это успешно, но массив, который он выводит, не имеет правильного размера, и в документации очень не хватает того, как форматируется вывод.

Мой текущий тестовый код.

Bitmap i = (Bitmap)Bitmap.FromFile("test.bmp");
ImageConverter ic = new ImageConverter();
byte[] b = (byte[])ic.ConvertTo(i, typeof(byte[]));

Любая помощь очень ценится, даже если она в совершенно ином направлении.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2012

Как сказал SLaks Мне нужно было использовать 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);
}
0 голосов
/ 07 апреля 2010

Если вам просто нужно преобразовать ваше растровое изображение в байтовый массив, попробуйте использовать MemoryStream:

Проверьте эту ссылку: C # Изображение в массив байтов и массив байтов в преобразователь изображений

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
 MemoryStream ms = new MemoryStream();
 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
 return  ms.ToArray();
}
...