C# comport 打印图像
2015-06-24 16:21
585 查看
public string GetLogo() { string logo = ""; if (!File.Exists(@"C:\bitmap.bmp")) return null; BitmapData data = GetBitmapData(@"C:\bitmap.bmp"); BitArray dots = data.Dots; byte[] width = BitConverter.GetBytes(data.Width); int offset = 0; MemoryStream stream = new MemoryStream(); BinaryWriter bw = new BinaryWriter(stream); bw.Write((char)0x1B); bw.Write('@'); bw.Write((char)0x1B); bw.Write('3'); bw.Write((byte)24); while (offset < data.Height) { bw.Write((char)0x1B); bw.Write('*'); // bit-image mode bw.Write((byte)33); // 24-dot double-density bw.Write(width[0]); // width low byte bw.Write(width[1]); // width high byte for (int x = 0; x < data.Width; ++x) { for (int k = 0; k < 3; ++k) { byte slice = 0; for (int b = 0; b < 8; ++b) { int y = (((offset / 8) + k) * 8) + b; // Calculate the location of the pixel we want in the bit array. // It'll be at (y * width) + x. int i = (y * data.Width) + x; // If the image is shorter than 24 dots, pad with zero. bool v = false; if (i < dots.Length) { v = dots[i]; } slice |= (byte)((v ? 1 : 0) << (7 - b)); } bw.Write(slice); } } offset += 24; bw.Write((char)0x0A); } // Restore the line spacing to the default of 30 dots. bw.Write((char)0x1B); bw.Write('3'); bw.Write((byte)30); bw.Flush(); byte[] bytes = stream.ToArray(); return logo + Encoding.Default.GetString(bytes); } public BitmapData GetBitmapData(string bmpFileName) { using (var bitmap = (Bitmap)Bitmap.FromFile(bmpFileName)) { var threshold = 127; var index = 0; double multiplier = 570; // this depends on your printer model. for Beiyang you should use 1000 double scale = (double)(multiplier/(double)bitmap.Width); int xheight = (int)(bitmap.Height * scale);int xwidth =(int)(bitmap.Width* scale);var dimensions = xwidth * xheight;var dots =newBitArray(dimensions);for(var y =0; y < xheight; y++){for(var x =0; x < xwidth; x++){var _x =(int)(x / scale);var _y =(int)(y / scale);var color = bitmap.GetPixel(_x, _y);var luminance =(int)(color.R *0.3+ color.G *0.59+ color.B *0.11); dots[index]=(luminance < threshold); index++;}}returnnewBitmapData(){Dots= dots,Height=(int)(bitmap.Height*scale),Width=(int)(bitmap.Width*scale)};}}publicclassBitmapData{publicBitArrayDots{ get;set;}publicintHeight{ get;set;}publicintWidth{ get;set;}}
相关文章推荐
- C# 6.0语法新特性体验(二)
- 通过Roslyn体验C# 6.0的新语法
- C# 当double数值较大且小数位过多时转化成字符串并保留小数位
- C# 控制音量大小
- C#2008的第一个程序HelloWord
- C#泛型
- C# 使用 X.509 v.3 证书的方法。
- C#DES对较大文件和文件字节数组对象加密解密
- C#结构体与类区别
- C# 当double数值较大且小数位过多时转化成字符串并保留小数位
- C#中字符串一些使用方法
- C#.NET彩票数据分析
- C# WinForm开发系列 - ADO.NET
- c#WebBrowser进阶
- How does it work in C#? - Part 3 (C# LINQ in detail)
- C# 制作Zip压缩包
- C#代码反编译 得到项目可运行源码
- C#实现图片缩放(包括缩略图和旋转)
- C#实现任意角度旋转图片(方法2)
- C#实现任意角度旋转图片(方法1)