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

news2024/9/20 0:49:09

最终效果:

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#生成单色图:

private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bmp2 = new Bitmap(1, 1, PixelFormat.Format1bppIndexed);
            //其它bmp格式的画图数据
            //Graphics _Graphics = Graphics.FromImage(bmp2);
            //_Graphics.Clear(Color.Red);
            //_Graphics.Dispose();
            //bmp2.SetResolution( 72,72);

            //单色图数据
            Rectangle rect = new Rectangle(0, 0, bmp2.Width, bmp2.Height);
            System.Drawing.Imaging.BitmapData bmpData = bmp2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp2.PixelFormat);
            // Get the address of the first line.
            IntPtr ptr = bmpData.Scan0;
            // Declare an array to hold the bytes of the bitmap.
            int bytes = Math.Abs(bmpData.Stride) * bmp2.Height;//error if bmpData.Width
            byte[] rgbValues = new byte[bytes];
            // Copy the RGB values into the array.
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
            //Generate dots in random cells and show image
            for (int i = 0; i < bmp2.Height; i++)
            {
                for (int j = 0; j < bmp2.Width; j += 8)
                {
                    byte b = 0;
                    b = (byte)(b | ((byte)(1) << 7));
                    //b = (byte)(b | ((byte)(1) << 6));
                    //b = (byte)(b | ((byte)(1) << 5));
                    //b = (byte)(b | ((byte)(1) << 4));
                    //b = (byte)(b | ((byte)(1) << 3));
                    //b = (byte)(b | ((byte)(1) << 2));
                    //b = (byte)(b | ((byte)(1) << 1));
                    //b = (byte)(b | ((byte)(1) << 0));
                    rgbValues[i * bmpData.Stride + j / 8] = (byte)b;
                }
            }
            // Copy back values into the array.
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
            // Unlock the bits.
            bmp2.UnlockBits(bmpData);
            //save bmp
            bmp2.Save("Test.bmp",ImageFormat.Bmp);
        }

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

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

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

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

 其它图片转为单色图:

 public void generateBMP(string contents, int width = 1280, int height = 720)
        {
            if (contents.Length > 0)
            {
                using (Bitmap bmp = GetStrBMPALL(contents, width, height)) // 获取待分析的字符位图
                {
                    pictureBox2.Image = ConvertTo24bppTo1bpp(bmp);
                }
            }
            else
            {
                pictureBox2.Image = null;
            }
            pictureBox2.BringToFront(); //最前显示
            System.GC.Collect();//清内存 不然图片一直增加内存
        }
        //白底黑字
        public static Bitmap GetStrBMPALL(string str, int bmpWidth = 1280, int bmpHeight = 720) //str字符串  width单个宽度  height单个高度
        {
            str = str.Replace("\r", "");
            string[] lineList = str.Split('\n');
            Bitmap bmp = new Bitmap(bmpWidth, bmpHeight); // 新建位图变量
            Graphics g = Graphics.FromImage(bmp);
            Brush backgroud = Brushes.White; //点阵分隔线颜色
            g.FillRectangle(backgroud, new Rectangle(0, 0, bmpWidth, bmpHeight));//实心正方形 背景
            int y = 0;
            foreach (string line in lineList)
            {
                int widthTemp = 0;
                foreach (char ch in line)
                {
                    g.DrawString(ch.ToString(), p.myFont, Brushes.Black, new PointF(widthTemp + p.xOffset, y + p.yOffset + 0.0F)); //new Font("宋体", 10)
                    if ((int)ch <= 127) { widthTemp += p.width / 2; } else { widthTemp += p.width; } //如果是字符ASCII,宽度为8 如果是汉字,宽度为16
                }
                y += p.height;
            }
            //bmp.Save("out32.bmp");
            return bmp;
        }
        public static Bitmap ConvertTo24bppTo1bpp(Bitmap bmp, int pixelSize=1, int jg=0,int width=1280,int height=720) //bmp要显示的图  pixelSize单个点大小   jg点与点间隔 ,返回转换后的图
        {
                Bitmap bmp2 = new Bitmap(width, height, PixelFormat.Format1bppIndexed);         
                //Bitmap bmp2 = new Bitmap(@"Test.bmp", true);

                Rectangle rect = new Rectangle(0, 0, bmp2.Width, bmp2.Height);
                System.Drawing.Imaging.BitmapData bmpData = bmp2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp2.PixelFormat);
                // Get the address of the first line.
                IntPtr ptr = bmpData.Scan0;
                // Declare an array to hold the bytes of the bitmap.
                int bytes = Math.Abs(bmpData.Stride) * bmp2.Height;//error if bmpData.Width
                byte[] rgbValues = new byte[bytes];
                // Copy the RGB values into the array.
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
                //Generate dots in random cells and show image
                for (int i = 0; i < bmp.Height; i++)
                {
                    for (int j = 0; j < bmp.Width; j += 8)
                    {
                        byte b = 0;
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 0, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 7));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 1, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 6));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 2, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 5));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 3, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 4));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 4, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 3));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 5, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 2));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 6, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 1));
                        b = (byte)(b | ((byte)((bmp.GetPixel(j + 7, i) == Color.FromArgb(0x0, 0, 0)) ? 1 : 0) << 0));
                        rgbValues[i * bmpData.Stride + j / 8] = (byte)b;
                    }
                }

                // Copy back values into the array.
                System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
                // Unlock the bits.
                bmp2.UnlockBits(bmpData);
                bmp2.Save("out.bmp", ImageFormat.Bmp);
            
            return bmp2;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            p.xOffset = Convert.ToInt32(textBox5.Text);
            p.yOffset = Convert.ToInt32(textBox6.Text);
            p.width = Convert.ToInt32(textBox3.Text);
            p.height = Convert.ToInt32(textBox4.Text);
            generateBMP(textBox1.Text);
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【K8S系列】深入解析StatefulSet(二)

序言 那些看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持的意义。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器编排平…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤&#xff1a; 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的&#xff0c;拟合方程是2阶的数据是4阶的&#xff0c;拟合方程也是4阶…

3年自动化测试(心路历程),从月薪10k到30k我经历了什么?

前言 2018年的时候&#xff0c;由于项目的原因&#xff0c;开始使用Robot Framework测试框架&#xff0c;正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理&#xff0c;并可以根据项目的需要开发系统关键字。2019年随着移动App越来越流行&#xff0c;乘着换…

HTML5超链接和图片基础用法

一、HTML5 超链接&#xff08;链接&#xff09; 超链接可以是一个文本&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的页面或新的文档或者当前文档中的某个部分。 当您把鼠标指针移动到网页中的某个链接上时&#xff0c;箭头会变为一只小手。 1.我…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…

CleanMyMac4.13最新免费mac电脑系统优化软件

CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志&am…

数组题目总结 -- 前缀和数组

目录 一. 区域和检索 - 数组不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 二. 二维区域和检索 - 矩阵不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 一. 区域和检索 - 数组不可变 题目链接&#xff1…

【方法一:二分+字符串哈希 优化】【dp——取不取问题-背包】最长公共子串【上海交通大学考研机试题】

最长公共子串 二分方法字符串哈希的复习字符串哈希 如何理解 二分代码 dp方法字符串str1中以第i个字符为结尾的子串 与字符串str2中以第i个字符为结尾的子串的连续公共子串 二维一维优化 二分方法 由于这个题是要求求子串&#xff0c;而子串是连续的一段&#xff0c;所以用二分…

在微信小程序中怎么使用vant框架?

目录标题 首先介绍什么是vant一、第一步&#xff0c;打开我们小程序项目目录&#xff0c;找到所在的位置&#xff0c;打开终端二、对项目进行初始化三、进行安装依赖1、通过npm安装vant/weapp2、安装miniprogram 四、修改app.json五、修改project.config.json六、然后构建npm 需…

使用Word的一些技巧记录

本文主要用于记录书写毕业论文时&#xff0c;遇到的Word的使用技巧。 设置样式及多级列表 每个学校必然会对论文中的字体、字号、行间距提出要求&#xff0c;设置Word中样式解决此问题。 例如&#xff0c;本校的格式要求为&#xff1a; 正文中的一级标题&#xff08;章目&a…

【C#】GridControl动态更换DataSource,查询数据异常处理

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统&#xff0c;它可以帮助医院和医生更好地管理手术麻醉过程&#xff0c;提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

【微服务笔记20】微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置

这篇文章&#xff0c;主要介绍微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置。 目录 一、搭建Nacos配置中心环境 1.1、Nacos配置中心介绍 1.2、搭建Nacos配置中心客户端 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;添加配置信息 &…

图书管理系统的开发与设计(论文+源码)_kaic

摘 要 随着科学技术的快速发展&#xff0c;尤其是计算机技术的突飞猛进&#xff0c;计算机技术普及到日常生活、学习生活的方方面面。由此想到学校的相对于传统的图书管理系统&#xff0c;帮助到学校的读者和学校的图书管理员的系统。提升图书管工作人员的效率&#xff0c;满足…

【C++类和对象】类和对象(中):构造函数 {六个默认成员函数;构造函数的概念及特性;编译器自动生成的构造函数;默认构造函数}

一、类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

Pytorch深度学习笔记(六)用pytorch实现线性回归

目录 1.数据准备 2.设计模型 3.构造损失函数和优化器 4.训练周期&#xff08;前馈—>反馈—>更新&#xff09; 课程推荐&#xff1a;05.用PyTorch实现线性回归_哔哩哔哩_bilibili 线性通常是指变量之间保持等比例的关系&#xff0c;从图形上来看&#xff0c;变量之间…

为什么要学习微服务?

文章目录 1.认识微服务1.1微服务由来1.2为什么需要微服务&#xff1f; 2.两种架构2.1.单体架构2.2.分布式架构 3.微服务的特点4.SpringCloud5.总结最后说一句 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为…

类和对象(上篇)

类和对象----上篇 &#x1f506;面向过程和面向对象的初步认识&#x1f506;类的引入&#x1f506;类的定义&#x1f506;类的访问限定符及封装访问限定符封装 &#x1f506;类的作用域&#x1f506;类的实例化&#x1f506;类的对象大小的计算如何计算一个类的大小结构体内存对…

15天学习MySQL计划(多表联查)第四天

15天学习MySQL计划&#xff08;多表联查&#xff09;第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互…