2010-04-07 5 views
1

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

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

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

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

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

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

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

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

+0

Вы ищете метод ['LockBits'] (http://msdn.microsoft.com/en-us/library/5ey6h79d%28v=VS.90%29.aspx). – SLaks

+0

Я использовал ваш метод, но есть проблема с проблемой, с которой я столкнулся. http://stackoverflow.com/questions/2595393/ –

ответ

0

Как SLaks said мне нужно использовать 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

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

Проверить эту ссылку: C# Image to Byte Array and Byte Array to Image Converter Class

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