用微软自带的画图,打开一个已经存在的单色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();

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

  1. matlab里open命令,告诉你Ununtu下在Matlab中读写OpenEXR格式的图片的方法及命令

    由于最近有需求对OpenEXR格式的图片进行处理,而Matlab本身并不支持OpenEXR格式的图片读写.发现在网上有一个插件,使用该插件可以在Matlab中直接使用exrread/exrwrite对 ...

  2. ps保存psd后图层全没了_PS画图后保存PSD格式,然后就打不开了

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:PS画图后保存PSD格式,然后就打不开了回答:这个应该是PSD与版本不兼容,要下一个比他高的版本,你在保存的时候有一个勾要选的,你没 ...

  3. ios保存gif到相册_如何在iOS中保存和下载GIF图片

    对于大多数移动开发人员来说,他们经常处理图片,而png和jpg是开发人员经常遇到的图片类型. 但是,对于gif图片怎么存gif图,由于iOS系统不支持直接处理gif,因此处理起来会更加麻烦. 本文将讨 ...

  4. ai保存web格式没有html,存储技巧,讲解AI存储为WEB所用格式的一些知识

    虽然这是讲解AI的存储,但photoshop也可以参考一下.在AI中"存储为WEB所用格式"的目的是为了优化图片在网站或其他屏幕端的展示效果,例如平板或手机."优化&qu ...

  5. Photoshop 保存PNG格式交错和不交错有差别

    1.PNG格式是由Netscape公司开发出来的格式,可以用于网络图像,但它不同于GIF格式图像只能保存256色,PNG格式可以保存24位的真彩色图像,并且支持透明背景和消除锯齿边缘的功能,可以在不失 ...

  6. 计算机上如何保存ico格式,ico是什么文件?ico文件怎么生成?

    类型:图片素材大小:2.7M语言:中文 评分:5.0 标签: 立即下载 ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案.多尺寸.多色板的图标文件. 图标是具有 ...

  7. OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo

    导读 本文主要介绍使用OpenCV将常用格式图片保存为透明背景图片的方法与实现代码. 实现目标 本文的目标有如下两个: ① 将常见格式[jpg/png/bmp]白色背景图片转换保存为透明背景图片: ② ...

  8. ps保存html和图像格式不显示,photoshop保存web格式不能显示该怎样解决

    在photoshop里面处理完图片保存有的时候会选择web格式,可是保存完了发现不能显示怎么解决?尝试了多次还没有找到解决方法的你,可以看看小编为你推荐的关于保存web格式不能显示的解决方法,想必会对 ...

  9. PS图片无法保存ICO格式解决方法

    iCO作为一种图标文件格式,很多朋友想制作ICO图标却没有专业的ICO软件,实在很郁闷.尤其是一些汇编软件在做软件图标只支持ICO格式,这让人很蛋疼.Photoshop(以下简称:PS)作为公认的专业 ...

最新文章

  1. 26 history对象
  2. 对E—R模型的深入理解
  3. python os 文件操作 os.rename(src, dst) 方法 os.renames()
  4. MyBatis子查询
  5. Oracle表的分区update卡着,分区表update global indexes引起表阻塞
  6. 【Android】自定义Loader:loadInBackground+onStartLoading+onStopLoading+onReset+onCanceled
  7. leetcode 449. Serialize and Deserialize BST | 449. 序列化和反序列化二叉搜索树(BST后序遍历性质)
  8. vivado软件如何查看内部器件的仿真信号
  9. office高级应用与python综合案例教程_office高级应用与python综合案例实验指导--详细介绍...
  10. static变量 java
  11. python查找字符串数量_python如何实现从字符串中找出字符1的位置以及个数的示例...
  12. zabbix详解(一)——zabbix基本概念
  13. ubuntu ftp server配置
  14. 微信投票系统平台大全
  15. 解决:无法加载文件 C:\Users\user\AppData\Roaming\npm\npx.ps1,因为在此系统上禁止运行脚本 。
  16. python基础语法结构图(简单明了)
  17. 计算机科学第三讲——布尔逻辑和逻辑门
  18. Win10系统电脑连接打印机的设置方法
  19. jmeter监听器之图形监控扩展
  20. 关于怎么给Date类型的数据加上一天的时间

热门文章

  1. 计算机辅助教育发展趋势 人工智能,浅析计算机辅助教学发展趋势的探讨
  2. 【U8+】用友U8明细账联查凭证的时候提示“联查凭证不存在”
  3. amd860k能装黑苹果吗_如何知道自己的AMD处理器是否支持安装黑苹果?
  4. 什么是数据驱动和关键字驱动
  5. 【工具配置】CLion编译c语言的配置
  6. 东吴策略市场温度计:公募抱团加强,风格偏向价值20210105.PDF
  7. 函数生成的ALV的按钮列表 .
  8. Printjs 打印文字右对齐的问题
  9. 重磅!9个中文免费电子书网站合集来了
  10. 30年30首诗入选榜单