C#下怎样处理并保存单色格式PNG图片?

图片片转换成位深度为1的单色bmp照片   最近调用热敏打印机需要打印单色,位深度为1的bmp照片,找了半天网上都是半成品,最后实现了,先谢谢各位大神,整体还是很有帮助,但是还是有些差距。   第一次写博客,不怎么会写,可能语言描述不是很好,但是代码是完完整整写入,写对static void Main(string[] args)        {           Bitmap b = (Bitmap)Bitmap.FromFile... 阅读详情
 
用微软自带的画图,打开一个已经存在的单色PNG图片文件,然后复制图像粘贴上去,做点反色或其他处理再保存,可以得到黑白单色PNG图片;但是,如果有很多黑底白字的图片要想改成白纸黑字的单色PNG格式保存这就很麻烦了,譬如2,3百张BMP或JPG图片用来保存只有白纸黑字的书页真是浪费。可是,有些索引格式图像如单色位图,或者单色PNG,如果用C#的Graphics类处理之后,保存文件只能得到非索引色格式或者GIF格式,若想以原格式保存文件似乎没有直接方便的方法可用,不得已只能用自己的代码一点一点去写像。
    以下代码,参考网上找了些的,加上实际证得:(注释并不是必需要的,有些编写代码过程中的记录,或者为了方便说明)

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

//打开任一索引色的或者非索引色的图像
Image img=Image.FromFile("r.bmp");
ImageAttributes ta=new ImageAttributes();
/* 下面用Graphics类改变像点颜色,是靠ImageAttributes来把
* 彩色变成灰度,或者颠倒黑白,发现用矩阵处理还是很方便的
*/
//如实际发现几个简单又好用的矩阵:
/* float[][] mm=new float[][]{ //彩色变灰度的矩阵
     new float[]{0.4f, 0.4f, 0.4f, 0, 0},
     new float[]{0.3f, 0.3f, 0.3f, 0, 0},
     new float[]{0.3f, 0.3f, 0.3f, 0, 0},
     new float[]{0,    0,    0,    1, 0},
     new float[]{0,    0,    0,    0, 1}
};
float[][] mm1=new float[][]{ //彩色反相的矩阵
     new float[]{0,    0.3f, 0.5f, 0, 0},
     new float[]{0.5f, 0.3f, 0.5f, 0, 0},
     new float[]{0.5f, 0.4f, 0,    0, 0},
     new float[]{0,    0,    0,    1, 0},
     new float[]{0,    0,    0,    0, 1}
};
*/
float[][] mm2=new float[][]{ //彩色变反相灰度的矩阵
     new float[]{-0.4f, -0.4f, -0.4f, 0, 0},
     new float[]{-0.3f, -0.3f, -0.3f, 0, 0},
     new float[]{-0.3f, -0.3f, -0.3f, 0, 0},
     new float[]{1,     1,     1,     1, 0},
     new float[]{0,     0,     0,     0, 1}
};
ColorMatrix cmt=new ColorMatrix(mm2);
ta.SetColorMatrix(cmt);
/* //如果确知图像里仅有纯黑白二色,也可用ColorMap来反相,它可逐色改变
ColorMap map1=new ColorMap();
map1.OldColor=Color.Black;
map1.NewColor=Color.White;
ColorMap map2=new ColorMap();
map2.OldColor=Color.White;
map2.NewColor=Color.Black;
ta.SetRemapTable(new ColorMap[]{map1,map2},ColorAdjustType.Bitmap);
*/
/* 有的图像比如索引格式的位图或GIF是无法创建Graphics的,
* 需要新建一非索引色位图取得Graphics对象以便做画或改变像点颜色。
*/
Bitmap bmp=new Bitmap(img.Width,img.Height);
Graphics g=Graphics.FromImage(bmp);
g.DrawImage(img,new Rectangle(0,0,bmp.Width,bmp.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel,ta);
//g.DrawString("Foxit PDF Reader",new Font("宋体",8),new SolidBrush(Color.White),0,0);
g.Dispose();
/* 在如下构造图像数据之前,也可以先创建一单色位图并锁定数据,
* 利用它现成的Stride简单计算出实际每行有效数据之后的填充字节数,而且可
* 在下面循环里直接写点Marshal.WriteByte(dt.Scan0,k,val);而不用数组拷贝
*/
//以下,把反相或者涂画后的像点数据每一行的每8点简单合并成1byte存储
int midrgb=Color.FromArgb(128,128,128).ToArgb();
int stride;//简单公式((width/8)+3)&(~3)
stride = (bmp.Width%8)==0 ? (bmp.Width/8) : (bmp.Width/8)+1;
stride = (stride%4)==0 ? stride : ((stride/4)+1)*4;
int k=bmp.Height*stride;
byte[] buf=new byte[k];
for(int j=0;j<bmp.Height;j++){
     k=j*stride;//因图像宽度不同、有的可能有填充字节需要跳越
     int x=0,ab=0;
     for(int i=0;i<bmp.Width;i++){
         //从灰度变单色(下法如果直接从彩色变单色效果不太好,不过反相也可以在这里控制)
         if ((bmp.GetPixel(i,j)).ToArgb() > midrgb) ab=ab*2+1; else ab=ab*2;
         x++;
         if(x==8){
             buf[k++]=(byte)ab;
             ab=0;
             x=0;
         }
     }
     if(x>0){
         //循环实现:剩余有效数据不满1字节的情况下须把它们移往字节的高位部分
         for(int t=x;t<8;t++)ab=ab*2;
         buf[k++]=(byte)ab;
     }
}
Bitmap bb=new Bitmap(img.Width,img.Height,PixelFormat.Format1bppIndexed);
BitmapData dt=bb.LockBits(new Rectangle(0,0,bb.Width,bb.Height),ImageLockMode.ReadWrite,bb.PixelFormat);
Marshal.Copy(buf,0,dt.Scan0,buf.Length);
bb.UnlockBits(dt);
//bb.MakeTransparent(Color.White);
/* 如果需要生成透明的单色图像,必须根据背景颜色不同,在此指定不同颜色为透明。
* 但是带透明的PNG不再是单色PNG格式,文件尺寸也更大一些。
* 在此是以原图黑底白字的为例,因为经过上面反相以后背景已变成白色,所以这里
* 指定了白色为透明色;反之应当指定黑色为透明。
* 注意:如果原图是透明背景白字的,等同黑底白字,这段代码全部不需要修改,可
* 以反相输出透明背景黑字的。但是,如果原图是透明背景黑字的,上面就不能用矩
* 阵做反相,否则由于变成全黑而最后输出无字透明;
* 因此,只需Graphics那里改成不使用ImageAttribute参数的DrawImage画出白色背景
* 黑字,然后这里不用改变就仍然输出原样的透明背景黑字;
* 如果一定要求把它反相成透明背景白字的(一般也没有这种需要),只要在上面循环
* 里注释着从灰度变单色的地方把if条件的>号改成<号,这里改成指定黑色为透明即可。
*/
//保存时若不指定第2参数,单色位图默认地被以单色PNG格式保存。虽然是单色像素格式,
//不影响保存为GIF文件或者非索引色图片,只不过GIF不能指定透明色,否则全黑。
bb.Save("w.png",ImageFormat.Png);
bb.Dispose();
bmp.Dispose();
img.Dispose();
Bartender标签打印踩坑记:C#传图片路径时,为什么我的标签打不出来?(附排查清单) 本文详细解析了C#调用Bartender打印标签时图片无法显示的常见问题及解决方案,涵盖图片路径处理、权限问题、模板配置和代码集成等关键环节。通过实战案例和排查清单,帮助开发者快速定位并解决标签打印中的图片显示问题,提升打印效率和稳定性。 阅读详情

相关推荐

C#实战:如何用斑马打印机ZD888打印自定义二维码(附完整源码)

本文详细介绍了使用C#通过USB接口驱动斑马打印机ZD888打印自定义二维码的完整流程。内容涵盖环境搭建、ZPL指令解析、图像转换核心逻辑、ZPL压缩编码以及通过Winspool驱动发送原始数据等关键技术,并提供了完整的源码示例和性能优化建议,帮助开发者实现稳定高效的工业级标签打印方案。

beer8的博客 305

C#图像bitmap位深度从32位转成1位-位深度转换

原图像bitmapnow:32位深度,新图像1位深度。直接用clone方法 Bitmap newbitmap = bitmapnow.Clone(new Rectangle(0, 0, bitmapnow.Width, bitmapnow.Height), PixelFormat.Format1bppIndexed); 如果要转换其他位深度的图像,只要更改PixelFormat里的选项即可 ...

马儿不吃草 3523

嵌入式GUI开发:emWin位图转换器从原理到实战优化

在嵌入式系统开发中,图形用户界面(GUI)的实现常面临资源受限的挑战,其中图像资源的处理是关键环节。位图转换技术通过将通用图像格式转换为嵌入式设备可直接处理的像素数据,解决了存储空间与渲染效率的核心矛盾。其原理涉及设备无关位图(DIB)与设备相关位图(DDB)的转换,前者保证跨硬件兼容性,后者则追求极致的绘制性能。这项技术的核心价值在于显著减少ROM占用并提升绘制速度,对于内存和算力有限的MCU至关重要。在实际应用场景中,开发者需根据项目阶段(开发调试或量产发布)灵活选择DIB或DDB策略,并结合调色板优化

weixin_30568591的博客 369

C#将Panel里面的内容保存为bmp图像

扣扣技术交流群:460189483 2种方式 第一种:保存为BMP图像文件,亲测没有问题 Bitmap bmp = new Bitmap(panel1.Width, panel1.Height,System.Drawing.Imaging.PixelFormat.Format24bppRgb); panel1.DrawToBitmap(bmp,new Rectangle(0,0,pane...

u014453443的博客 7507

Blender到Godot高效3D资产工作流:GLTF导出与自动化实践

3D资产工作流是游戏开发与数字内容创作中的核心环节,它涉及从建模软件到游戏引擎的无缝数据转换。其原理在于通过标准化的中间格式和预处理流程,确保模型、材质、动画等资产在跨平台迁移时保持完整性。这一流程的技术价值在于极大提升创作效率,减少手动调整与问题排查时间,让开发者能聚焦于创意实现。在应用场景上,尤其适用于独立游戏开发、实时可视化及交互式3D应用制作。本文聚焦于Blender与Godot引擎间的资产传递,深入解析GLTF格式的优势、导出前在Blender中进行模型变换应用与动画烘焙等关键预处理步骤,并探讨如

weixin_30256901的博客 312

灰度世界算法:自动白平衡的经典实现

灰度世界算法是计算机视觉和数字图像处理领域中最经典且最基础的白平衡算法(Auto White Balance, AWB)。其主要功能是修正由于光照色温差异造成的图像色彩偏差(例如室内黄光导致的偏黄或阴天环境下的偏蓝现象),使图像色彩更贴近人眼观察到的真实效果。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 758

C# bmp图片另存为位图 位深度1

用微软自带的画图,打开一个已经存在的单色PNG图片文件,然后复制图像粘贴上去,做点反色或其他处理再保存,可以得到黑白单色PNG图片;但是,如果有很多黑底白字的图片要想改成白纸黑字的单色PNG格式保存这就很麻烦了,譬如2,3百张BMP或JPG图片用来保存只有白纸黑字的书页真是浪费。可是,有些索引格式图像如单色位图,或者单色PNG,如果用C#的Graphics类处理之后,保存文件只能得到非索引色格式或

6028

C#实现图片添加与灰度转换的详细指南

在C#中,可以使用System.Drawing命名空间中的类库实现灰度图像的转换。具体步骤如下:加载一张原始的彩色图片。遍历图片中的每个像素点。根据选取的转换公式计算出灰度值,并更新该像素点。保存转换后的灰度图片。代码示例:// C#代码片段,演示如何将彩色图片转换为灰度图片// 加载图片// 遍历每个像素点进行转换x++)y++)// 保存灰度图片在上述代码中,我们首先创建了原图和灰度图的实例,然后通过双重循环遍历每一个像素点。

weixin_42629522的博客 1154

常见图片格式详解

标明原作者信息 http://www.cnblogs.com/xiangism 做了几年有关图形、图像的工作,对图片格式算是小有经验,在此写成一文章总结下。虽然一开始并不想讲很理论的东西,但写完后发现几乎全是理论,细想一下关于图片格式的知识本身就是理论的东西,囧~~ 那就力求用最简单的方式将这些“理论”讲清楚吧。 常见的图片格式有bmp, jpg(jpeg), png, gif, w...

weixin_34067049的博客 232

自定义半透明按钮实现与界面美化实战

半透明按钮是指通过调节背景或边框的Alpha通道值(通常在0-255之间),使其部分透显底层内容的交互控件。其视觉构成包含三个核心层次:透明度层(控制整体通透感)、色彩层(定义主色调与渐变)和边界层(描边或阴影增强可点击性)。相较于传统不透明按钮,半透明设计打破了界面的“堆叠感”,借助视觉穿透建立前后元素的空间关系。在现代图形用户界面(GUI)系统中,标准控件往往难以满足日益复杂的交互需求和个性化视觉风格。

weixin_28968525的博客 1110

图片转化单色,位深度为1的BMP文件

最近调用热敏打印机需要打印单色,位深度为1的bmp照片,找了半天网上都是半成品,最后实现了,先谢谢各位大神,整体还是很有帮助,但是还是有些差距。

C# Graphics图像处理实战:从DrawString到蒙版混合的趣味应用开发

在C#桌面应用开发中,图形图像处理是核心技能之一,它通过System.Drawing命名空间中的Graphics类实现,该类提供了在绘图表面绘制文本、形状和图像的基础能力。其原理在于利用GDI+图形设备接口,通过DrawString等方法将元素渲染到位图上,并结合蒙版、位图操作实现图层合成与特效。这项技术的价值在于能够创建丰富的视觉交互体验,广泛应用于图像编辑工具、数据可视化、游戏界面及趣味应用等场景。本文聚焦于一个具体案例:开发一个“图片本性揭露器”趣味程序,它巧妙运用半透明叠加、颜色减淡混合等Graph

weixin_30335353的博客 367

C#将List对象转换为BMP图片保存

传入List对象,将内容转换为BMP格式文件,并将文件存储在本地

数字图像与机器视觉基础补充(1)

文章目录一、相关概念1.位图||矢量图2.常见图像格式3.BMP文件结构二、文件格式变换与比较1.格式转化2.对比三、图片处理编程1.奇异函数分解(SDV)参考链接 一、相关概念 1.位图||矢量图 ①位图图像(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得

weixin_54089068的博客 1661

SAM2与Docker的完美组合:5分钟搞定Linux环境下的图像分割部署

本文详细介绍了如何在Linux环境下通过Docker快速部署SAM2图像分割模型,解决安装过程中的常见问题。文章提供了从镜像选择、CUDA版本匹配到容器构建的全流程指南,特别针对GPU加速环境下的'cudnn_frontend: No execution plans support the graph'等报错提供了实用解决方案,帮助开发者在5分钟内完成高效部署。

fern8的博客 933

周志华《机器学习》课程系列笔记——目录导航页

最近自学机器学习课程,注意到了南京大学周志华老师的课程。我是在学堂在线平台观看的,注意到b站上也有相应视频,但b站上并未获得授权,随时有消失的可能。周志华老师的网络教学视频中,与其西瓜书相比确实少了一些内容。但幸运的是,缺失的内容实际上对于初学者来说并不会产生太大影响。目前这一笔记也遵循视频内容,相比西瓜书中也会有一些缺失,敬请谅解。可能以后如果有机会和时间,我会再阅读周志华老师的书籍将缺失内容补全。一切内容敬请关注我的个人Page页面。

Sinocifengs的博客 1684

Python蓝牙控制热敏打印机:从ESC/POS指令到图片打印实战

串口通信是嵌入式系统和物联网设备与计算机交互的经典方式,它通过定义数据格式、波特率等参数实现稳定可靠的数据传输。其核心原理在于将数据分解为字节流,通过物理或虚拟的串行线路进行顺序发送与接收。在物联网和自动化控制领域,串口通信技术价值显著,它使得软件能够直接操控硬件设备,是实现软硬件结合的关键桥梁。典型的应用场景包括工业传感器数据采集、智能硬件控制以及本文聚焦的微型热敏打印机驱动。通过Python的pySerial库,开发者可以便捷地操作虚拟串口,结合蓝牙RFCOMM协议实现无线通信。本文以热敏打印机为具体案

weixin_34258838的博客 435

【软件逆向学习记录】x64dbg调试器入门2:主调试窗口功能及字符串搜索功能介绍

在x64dbg中, ​​CPU视图 是调试过程中最核心的界面,通常被称为​​主调试窗口​​或​​调试视图​​,总体分为四个区域,代码区(反汇编),数据区(内存窗口),寄存器区和堆栈区,详细位置如下图:示例数据代码区最左侧为内存地址,第二块区域为程序代码值,原始程序代码经编译和汇编后变为二进制机器码存储在计算机中,调试器将其展示为易于阅读的十六进制,第三块区域是机器码反汇编后的汇编代码,最右侧为代码的注释窗口,有一些原始的注释,也可以自己添加注释PS:汇编和反汇编解释。

tusikong的博客 2922

Unity TextMeshPro Emoji显示全攻略:从原理到避坑实践

在UI与游戏开发中,文本渲染是基础且关键的技术环节,它直接影响用户体验与产品质感。其核心原理通常涉及字形管理、纹理图集与实时渲染管线。TextMeshPro(TMP)作为Unity强大的文本渲染解决方案,通过预烘焙字体图集来优化性能,但这也带来了对动态内容(如Emoji)支持的挑战。Emoji本质上是特殊的Unicode字符,具有彩色、序列化等复杂特性,传统的单色字体图集无法直接满足其渲染需求。因此,掌握**精灵资产(Sprite Asset)**的创建与**Unicode映射**技术,成为实现稳定、跨平台

weixin_33860528的博客 328

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例 简介   这是一个回归预测的实例,数据集来自李宏毅的《机器学习》课程的第一次作业,可以用来训练一个线性回归模型或者其他的回归模型,动手实践学习到的理论知识,在实践中去发现问题。这篇文章主要包括数据集的解释、数据的预处理过程及线性回归模型的代码实现这三个部分。由于这个数据集并不能直接使用,还需进行一些重构,为了对初学者更友好一些,我会提供重构完的可以读取后就直接使用的数据集,我也会提供 Matlab\rm MatlabMatlab 可直接使用

qq_27309515的博客 3574

【遥感数字图像处理(朱文泉)】第一章 数字图像基础

关于图像的定义、类型、模拟图像和数字图像

甜子yu的博客 4403

2.13英寸电子纸HAT多平台驱动指南:从SPI原理到低功耗应用

SPI(串行外设接口)是一种广泛应用于微控制器与外围设备通信的同步串行总线协议,以其接口简单、全双工通信和高速传输的特点,成为连接显示屏、传感器等外设的主流方案。其工作原理基于主从架构,通过时钟线、数据线和片选线实现设备间的数据交换,技术价值在于为嵌入式系统提供了标准化的高效通信方式。在电子墨水屏(e-Paper)等低功耗显示设备的驱动中,SPI协议扮演着关键角色,用于传输图像数据和控制命令。电子墨水屏凭借其类纸显示效果和仅在刷新时耗电的特性,在电子价签、便携式信息站等对功耗敏感的场景中具有独特优势。本文以

weixin_30906185的博客 554

Langfuse实战:从评估打分到问题解决的完整指南

本文详细介绍了如何利用开源LLM工程平台Langfuse对AI应用进行系统性评估与优化。从创建评估数据集、设计自动化评分函数,到深入排查常见问题并关联Trace进行精准打分,提供了完整的实战指南。最后,探讨了如何利用评估结果驱动提示词迭代与A/B测试,并给出了生产环境部署与性能优化的关键考量,帮助开发者构建可测量、可分析、可改进的LLM应用。

backprop5master的博客 649

Unity游戏开发中实现原生GIF解码与播放的三大技术突破

在计算机图形学中,图像解码与纹理渲染是实时渲染管线的核心基础。其原理涉及二进制文件解析、数据压缩算法(如LZW)解压、色彩空间转换,最终将像素数据映射到GPU纹理内存。这项技术的价值在于,它使应用程序能够动态加载和显示丰富的视觉内容,而无需依赖预编译的资源格式。在游戏开发领域,尤其是在Unity引擎中,动态图像资源的管理与播放直接影响着游戏的包体大小、内存占用和运行时性能。传统的序列帧动画方案存在资源体积庞大、加载耗时长等问题,而视频播放又可能过于重量级。因此,实现一套高效的运行时GIF解码方案,成为连接网

weixin_33804582的博客 402

Qt —— QWebEngineView加载谷歌离线地图(包含离线地图瓦片下载制作、附谷歌地图开发文档)

  关注 微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。 笔者 - jxd

1万+

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

有数据的地方就有存储, 内存是谁都离不开的产品。而动态随机存取存储器(DRAM)作为一种常见的内存。本博客将介绍DRAM的基本概念、工作原理、优缺点以及应用领域等方面。

串起点滴 3917
上一篇: 手机隐藏功能
下一篇: 軟件架構學習視頻
msikruby
博客等级 码龄19年 11粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值