2010-04-07 3 views
1

J'écris une bibliothèque pour l'interface C# avec le langage d'imprimante EPL2. Une caractéristique que je voudrais essayer d'implémenter est l'impression d'images, la spécification doc ditConversion d'une image en tableau d'octets monochromes

p1 = Largeur de graphique Largeur de graphique en octets. Huit (8) points = un (1) octet de données.

p2 = Longueur du graphique Longueur du graphique en points (ou lignes d'impression)

données = données binaires brutes sans mise en forme de fichier graphique. Les données doivent être en octets. Multipliez la largeur en octets (p1) par le nombre de lignes d'impression (p2) pour la quantité totale de données graphiques. L'imprimante calcule automatiquement la taille exacte du bloc de données en fonction de cette formule.

Je prévois que mon image source soit un fichier bmp de 1 bit par pixel, déjà dimensionné. Je ne sais pas comment l'obtenir à partir de ce format dans un octet [] pour que je l'envoie à l'imprimante. J'ai essayé ImageConverter.ConvertTo(Object, Type) il réussit mais le tableau qu'il sort n'est pas la taille correcte et la documentation manque très sur comment la sortie est formatée.

Mon code de test actuel.

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

Toute aide est grandement appréciée même si elle est dans une direction totalement différente.

+0

Vous recherchez la méthode ['LockBits'] (http://msdn.microsoft.com/en-us/library/5ey6h79d%28v=VS.90%29.aspx). – SLaks

+0

J'ai utilisé votre méthode mais il y a une question de suivi avec un problème que j'ai rencontré. http://stackoverflow.com/questions/2595393/ –

Répondre

0

Comme SLaks said je devais utiliser 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

Si vous avez juste besoin de convertir votre bitmap dans un tableau d'octets, essayez d'utiliser un MemoryStream:

Vérifiez ce lien: 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(); 
} 
Questions connexes