当前位置:   article > 正文

C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图_c# bmp

c# bmp

最终效果:

V1.8.2 20230419
文字生成单色BMP图片4.exe
默认1280*720  如果显示不全,请把宽和高加大  字体加大。

 

首先,用windows画板生成一张1*1白色单色图作为标准,数据如下:

数据解析参考:BMP图像文件完全解析 - 知乎

单色图有点不一样的是像数数据部分,是1bit一个点,0黑1白。4字节对齐是一样的。 比如上面是8000 0000   ,80即二进制1000 0000。因为是1*1,只有一个点有效,其它是4字节对齐。

 再建一个2*1,变成C0    即二进制1100 0000

 再建一个2*1,变成C0    即二进制1100 0000

  再建一个1*2,变成8个数据,变成8000 0000 8000 0000 每一列都需要凑4字节的倍数

用C#生成单色图:

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. Bitmap bmp2 = new Bitmap(1, 1, PixelFormat.Format1bppIndexed);
  4. //其它bmp格式的画图数据
  5. //Graphics _Graphics = Graphics.FromImage(bmp2);
  6. //_Graphics.Clear(Color.Red);
  7. //_Graphics.Dispose();
  8. //bmp2.SetResolution( 72,72);
  9. //单色图数据
  10. Rectangle rect = new Rectangle(0, 0, bmp2.Width, bmp2.Height);
  11. System.Drawing.Imaging.BitmapData bmpData = bmp2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp2.PixelFormat);
  12. // Get the address of the first line.
  13. IntPtr ptr = bmpData.Scan0;
  14. // Declare an array to hold the bytes of the bitmap.
  15. int bytes = Math.Abs(bmpData.Stride) * bmp2.Height;//error if bmpData.Width
  16. byte[] rgbValues = new byte[bytes];
  17. // Copy the RGB values into the array.
  18. System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
  19. //Generate dots in random cells and show image
  20. for (int i = 0; i < bmp2.Height; i++)
  21. {
  22. for (int j = 0; j < bmp2.Width; j += 8)
  23. {
  24. byte b = 0;
  25. b = (byte)(b | ((byte)(1) << 7));
  26. //b = (byte)(b | ((byte)(1) << 6));
  27. //b = (byte)(b | ((byte)(1) << 5));
  28. //b = (byte)(b | ((byte)(1) << 4));
  29. //b = (byte)(b | ((byte)(1) << 3));
  30. //b = (byte)(b | ((byte)(1) << 2));
  31. //b = (byte)(b | ((byte)(1) << 1));
  32. //b = (byte)(b | ((byte)(1) << 0));
  33. rgbValues[i * bmpData.Stride + j / 8] = (byte)b;
  34. }
  35. }
  36. // Copy back values into the array.
  37. System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
  38. // Unlock the bits.
  39. bmp2.UnlockBits(bmpData);
  40. //save bmp
  41. bmp2.Save("Test.bmp",ImageFormat.Bmp);
  42. }

 任意语言完全用字节拼一张图:

 JAVA C# Zxing生成的二维码数据转换为1bit的bmp下发到点阵终端。QRCode去白边,以bmp格式字节流发送,BMP图片解析_java图片转点阵_小黄人软件的博客-CSDN博客

谁有空帮填一下就行。JAVA写的部分。 

  1. final int[] pixels = new int[width * height]; //假设有这么多图像数据,比如二维码矩阵
  2. final byte[] pixelsByte = new byte[ pixels.length/8 ]; //8个pixels合并到一个pixelsByte字节
  3. final byte[] bmpFile = new byte[ 0x3E+pixels.length/8 ]; //图片存储的位置+像素数据大小 整个文件buff
  4. Arrays.fill(bmpFile, (byte) 0); //默认为0
  5. //0~1字节42、4d为B、M字符,表示BMP文件
  6. //2~5字节表示整个BMP文件的大小,小端模式,即0x0000003a,58字节
  7. //6~9字节是保留数据,一般都是0
  8. //10~13字节表示图片存储的位置
  9. //14~17字节为位图信息数据头,一般是40,即0x00000028。
  10. //18~21字节表示图像宽度,即0x00000001,
  11. //22~25字节表示图像高度。
  12. //26~27字节表示色彩平面数量,必须为1,即0x0001
  13. //28~29字节表示每个像素存储的位数(蓝色部分,0x0018,即24位)。
  14. //30~33字节为压缩方式,0表示不压缩
  15. //34~37字节表示原始位图数据的大小,即0x00000004,即4字节
  16. //38~41字节表示横向分辨率
  17. //42~45字节表示纵向分辨率
  18. //46~49字节表示调色板颜色数
  19. //50~53字节表示重要颜色数
  20. //54~57字节(红色部分)即原始的像素数据,这些才是最终需要显示到屏幕上的数据
  21. bmpFile[0]=0x42; //‘B’
  22. bmpFile[1]=0x4d; //'M'
  23. bmpFile[10]=0x3E; //图片存储的位置
  24. System.arraycopy(pixelsBit,0,bmpFile,bmpFile[10],pixelsBit.length); //图像数据复制到buf位置
  25. WriteToFile(bmpFile,bmpFile.length);//二进制写入到文件

 其它图片转为单色图:

  1. public void generateBMP(string contents, int width = 1280, int height = 720)
  2. {
  3. if (contents.Length > 0)
  4. {
  5. using (Bitmap bmp = GetStrBMPALL(contents, width, height)) // 获取待分析的字符位图
  6. {
  7. pictureBox2.Image = ConvertTo24bppTo1bpp(bmp);
  8. }
  9. }
  10. else
  11. {
  12. pictureBox2.Image = null;
  13. }
  14. pictureBox2.BringToFront(); //最前显示
  15. System.GC.Collect();//清内存 不然图片一直增加内存
  16. }
  17. //白底黑字
  18. public static Bitmap GetStrBMPALL(string str, int bmpWidth = 1280, int bmpHeight = 720) //str字符串 width单个宽度 height单个高度
  19. {
  20. str = str.Replace("\r", "");
  21. string[] lineList = str.Split('\n');
  22. Bitmap bmp = new Bitmap(bmpWidth, bmpHeight); // 新建位图变量
  23. Graphics g = Graphics.FromImage(bmp);
  24. Brush backgroud = Brushes.White; //点阵分隔线颜色
  25. g.FillRectangle(backgroud, new Rectangle(0, 0, bmpWidth, bmpHeight));//实心正方形 背景
  26. int y = 0;
  27. foreach (string line in lineList)
  28. {
  29. int widthTemp = 0;
  30. foreach (char ch in line)
  31. {
  32. g.DrawString(ch.ToString(), p.myFont, Brushes.Black, new PointF(widthTemp + p.xOffset, y + p.yOffset + 0.0F)); //new Font("宋体", 10)
  33. if ((int)ch <= 127) { widthTemp += p.width / 2; } else { widthTemp += p.width; } //如果是字符ASCII,宽度为8 如果是汉字,宽度为16
  34. }
  35. y += p.height;
  36. }
  37. //bmp.Save("out32.bmp");
  38. return bmp;
  39. }
  40. public static Bitmap ConvertTo24bppTo1bpp(Bitmap bmp, int pixelSize=1, int jg=0,int width=1280,int height=720) //bmp要显示的图 pixelSize单个点大小 jg点与点间隔 ,返回转换后的图
  41. {
  42. Bitmap bmp2 = new Bitmap(width, height, PixelFormat.Format1bppIndexed);
  43. //Bitmap bmp2 = new Bitmap(@"Test.bmp", true);
  44. Rectangle rect = new Rectangle(0, 0, bmp2.Width, bmp2.Height);
  45. System.Drawing.Imaging.BitmapData bmpData = bmp2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp2.PixelFormat);
  46. // Get the address of the first line.
  47. IntPtr ptr = bmpData.Scan0;
  48. // Declare an array to hold the bytes of the bitmap.
  49. int bytes = Math.Abs(bmpData.Stride) * bmp2.Height;//error if bmpData.Width
  50. byte[] rgbValues = new byte[bytes];
  51. // Copy the RGB values into the array.
  52. System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
  53. //Generate dots in random cells and show image
  54. for (int i = 0; i < bmp.Height; i++)
  55. {
  56. for (int j = 0; j < bmp.Width; j += 8)
  57. {
  58. byte b = 0;
  59. b = (byte)(b | ((byte)((bmp.GetPixel(j + 0, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 7));
  60. b = (byte)(b | ((byte)((bmp.GetPixel(j + 1, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 6));
  61. b = (byte)(b | ((byte)((bmp.GetPixel(j + 2, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 5));
  62. b = (byte)(b | ((byte)((bmp.GetPixel(j + 3, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 4));
  63. b = (byte)(b | ((byte)((bmp.GetPixel(j + 4, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 3));
  64. b = (byte)(b | ((byte)((bmp.GetPixel(j + 5, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 2));
  65. b = (byte)(b | ((byte)((bmp.GetPixel(j + 6, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 1));
  66. b = (byte)(b | ((byte)((bmp.GetPixel(j + 7, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 0));
  67. rgbValues[i * bmpData.Stride + j / 8] = (byte)b;
  68. }
  69. }
  70. // Copy back values into the array.
  71. System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
  72. // Unlock the bits.
  73. bmp2.UnlockBits(bmpData);
  74. bmp2.Save("out.bmp", ImageFormat.Bmp);
  75. return bmp2;
  76. }
  77. private void button1_Click(object sender, EventArgs e)
  78. {
  79. p.xOffset = Convert.ToInt32(textBox5.Text);
  80. p.yOffset = Convert.ToInt32(textBox6.Text);
  81. p.width = Convert.ToInt32(textBox3.Text);
  82. p.height = Convert.ToInt32(textBox4.Text);
  83. generateBMP(textBox1.Text);
  84. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/715923
推荐阅读
相关标签
  

闽ICP备14008679号