如果将普通图片转成单色位图bmp,例如画图工具转换成单色位图。

问题描述

请教大神们怎么用C#存储单色位图,和画板生成的单色为图一样。用于打印机打印单色位图(热敏打印机只支持单色位图)求完整的代码。

解决方案

解决方案二:

解决方案三:
引用1楼starfd的回复:没有尝试过?这个代码要下载才可用使用。
解决方案四:
单色图?二值化?。publicImageGetBinaryImage(ImageimgSrc,bytebyValue){Bitmapb=newBitmap(imgSrc);Bitmapbmp=b.Clone(newRectangle(0,0,imgSrc.Width,imgSrc.Height),PixelFormat.Format24bppRgb);b.Dispose();BitmapDatabmpData=bmp.LockBits(newRectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,bmp.PixelFormat);byte[]byColorInfo=newbyte[bmp.Height*bmpData.Stride];Marshal.Copy(bmpData.Scan0,byColorInfo,0,byColorInfo.Length);bytebyR,byG,byB;for(intx=0,xLen=bmp.Width;x<xLen;x++){for(inty=0,yLen=bmp.Height;y<yLen;y++){byB=byColorInfo[y*bmpData.Stride+x*3];byG=byColorInfo[y*bmpData.Stride+x*3+1];byR=byColorInfo[y*bmpData.Stride+x*3+2];bytebyV=GetAvg(byR,byG,byB);if(byV>=byValue){byV=255;}else{byV=0;}byColorInfo[y*bmpData.Stride+x*3]=byColorInfo[y*bmpData.Stride+x*3+1]=byColorInfo[y*bmpData.Stride+x*3+2]=byV;}}Marshal.Copy(byColorInfo,0,bmpData.Scan0,byColorInfo.Length);bmp.UnlockBits(bmpData);returnbmp;}

解决方案五:
引用3楼crystal_lz的回复:

单色图?二值化?。publicImageGetBinaryImage(ImageimgSrc,bytebyValue){Bitmapb=newBitmap(imgSrc);Bitmapbmp=b.Clone(newRectangle(0,0,imgSrc.Width,imgSrc.Height),PixelFormat.Format24bppRgb);b.Dispose();BitmapDatabmpData=bmp.LockBits(newRectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,bmp.PixelFormat);byte[]byColorInfo=newbyte[bmp.Height*bmpData.Stride];Marshal.Copy(bmpData.Scan0,byColorInfo,0,byColorInfo.Length);bytebyR,byG,byB;for(intx=0,xLen=bmp.Width;x<xLen;x++){for(inty=0,yLen=bmp.Height;y<yLen;y++){byB=byColorInfo[y*bmpData.Stride+x*3];byG=byColorInfo[y*bmpData.Stride+x*3+1];byR=byColorInfo[y*bmpData.Stride+x*3+2];bytebyV=GetAvg(byR,byG,byB);if(byV>=byValue){byV=255;}else{byV=0;}byColorInfo[y*bmpData.Stride+x*3]=byColorInfo[y*bmpData.Stride+x*3+1]=byColorInfo[y*bmpData.Stride+x*3+2]=byV;}}Marshal.Copy(byColorInfo,0,bmpData.Scan0,byColorInfo.Length);bmp.UnlockBits(bmpData);returnbmp;}

单色位图啊!你的代码不完整。
解决方案六:
那个是不行的,已然是24位位图,只是将色彩变成灰色而已你要的是Format1bppIndexed格式的bmp待会如果我的代码能测试通过的话,就给你
解决方案七:
引用5楼xuzuning的回复:

那个是不行的,已然是24位位图,只是将色彩变成灰色而已你要的是Format1bppIndexed格式的bmp待会如果我的代码能测试通过的话,就给你

麻烦你了!我的邮箱是357901986@qq.com
解决方案八:
希望有人帮忙解决下!
解决方案九:
引用4楼u013416462的回复:

Quote: 引用3楼crystal_lz的回复:
单色图?二值化?。publicImageGetBinaryImage(ImageimgSrc,bytebyValue){Bitmapb=newBitmap(imgSrc);Bitmapbmp=b.Clone(newRectangle(0,0,imgSrc.Width,imgSrc.Height),PixelFormat.Format24bppRgb);b.Dispose();BitmapDatabmpData=bmp.LockBits(newRectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,bmp.PixelFormat);byte[]byColorInfo=newbyte[bmp.Height*bmpData.Stride];Marshal.Copy(bmpData.Scan0,byColorInfo,0,byColorInfo.Length);bytebyR,byG,byB;for(intx=0,xLen=bmp.Width;x<xLen;x++){for(inty=0,yLen=bmp.Height;y<yLen;y++){byB=byColorInfo[y*bmpData.Stride+x*3];byG=byColorInfo[y*bmpData.Stride+x*3+1];byR=byColorInfo[y*bmpData.Stride+x*3+2];bytebyV=GetAvg(byR,byG,byB);if(byV>=byValue){byV=255;}else{byV=0;}byColorInfo[y*bmpData.Stride+x*3]=byColorInfo[y*bmpData.Stride+x*3+1]=byColorInfo[y*bmpData.Stride+x*3+2]=byV;}}Marshal.Copy(byColorInfo,0,bmpData.Scan0,byColorInfo.Length);bmp.UnlockBits(bmpData);returnbmp;}

单色位图啊!你的代码不完整。

不就是差了一个GetAvg么想也想得到这个函数是干嘛的以及是怎么写的
解决方案十:
你要的是这个效果吧?把左边的24位真彩,转成右边的单色位图privatestaticBitmapBuiltBlackWhiteBitmap(byte[]rawValues,intwidth,intheight){//新建一个8位灰度位图,并锁定内存区域操作Bitmapbitmap=newBitmap(width,height,PixelFormat.Format1bppIndexed);BitmapDatabmpData=bitmap.LockBits(newRectangle(0,0,width,height),ImageLockMode.WriteOnly,PixelFormat.Format1bppIndexed);//计算图像参数intoffset=bmpData.Stride-bmpData.Width/8;//计算每行未用空间字节数IntPtrptr=bmpData.Scan0;//获取首地址intscanBytes=bmpData.Stride*bmpData.Height;//图像字节数=扫描字节数*高度byte[]grayValues=newbyte[scanBytes];//为图像数据分配内存//为图像数据赋值intposSrc=0,posScan=0;//rawValues和grayValues的索引for(inti=0;i<height;i++){for(intj=0;j<width/8;j++){byteb=0;for(intk=0;k<8;k++)b=(byte)((b<<1)|(byte)(rawValues[posSrc++]<96?0:1));grayValues[posScan++]=b;}//跳过图像数据每行未用空间的字节,length=stride-width*bytePerPixelposScan+=offset;}//内存解锁Marshal.Copy(grayValues,0,ptr,scanBytes);bitmap.UnlockBits(bmpData);//解锁内存区域//returnbitmap;//修改生成位图的索引表ColorPalettepalette;//获取一个Format8bppIndexed格式图像的Palette对象using(Bitmapbmp=newBitmap(1,1,PixelFormat.Format1bppIndexed)){palette=bmp.Palette;}for(inti=0;i<2;i++){palette.Entries[i]=Color.FromArgb(i*255,i*255,i*255);}//修改生成位图的索引表bitmap.Palette=palette;returnbitmap;}

参数rawValues就是#4得到的灰度数据byColorInfo
解决方案十一:
代码是套改8位灰度图的,注释不准确,请原谅
解决方案十二:
另外,对微软的色彩转黑白的抖动算法不甚了解转出的图片和画图转的不太一样
解决方案十三:
引用9楼xuzuning的回复:

你要的是这个效果吧?把左边的24位真彩,转成右边的单色位图privatestaticBitmapBuiltBlackWhiteBitmap(byte[]rawValues,intwidth,intheight){//新建一个8位灰度位图,并锁定内存区域操作Bitmapbitmap=newBitmap(width,height,PixelFormat.Format1bppIndexed);BitmapDatabmpData=bitmap.LockBits(newRectangle(0,0,width,height),ImageLockMode.WriteOnly,PixelFormat.Format1bppIndexed);//计算图像参数intoffset=bmpData.Stride-bmpData.Width/8;//计算每行未用空间字节数IntPtrptr=bmpData.Scan0;//获取首地址intscanBytes=bmpData.Stride*bmpData.Height;//图像字节数=扫描字节数*高度byte[]grayValues=newbyte[scanBytes];//为图像数据分配内存//为图像数据赋值intposSrc=0,posScan=0;//rawValues和grayValues的索引for(inti=0;i<height;i++){for(intj=0;j<width/8;j++){byteb=0;for(intk=0;k<8;k++)b=(byte)((b<<1)|(byte)(rawValues[posSrc++]<96?0:1));grayValues[posScan++]=b;}//跳过图像数据每行未用空间的字节,length=stride-width*bytePerPixelposScan+=offset;}//内存解锁Marshal.Copy(grayValues,0,ptr,scanBytes);bitmap.UnlockBits(bmpData);//解锁内存区域//returnbitmap;//修改生成位图的索引表ColorPalettepalette;//获取一个Format8bppIndexed格式图像的Palette对象using(Bitmapbmp=newBitmap(1,1,PixelFormat.Format1bppIndexed)){palette=bmp.Palette;}for(inti=0;i<2;i++){palette.Entries[i]=Color.FromArgb(i*255,i*255,i*255);}//修改生成位图的索引表bitmap.Palette=palette;returnbitmap;}

参数rawValues就是#4得到的灰度数据byColorInfo

不明白rawValues是使用灰度数据还是原始数据。
解决方案十四:
最简单的两句代码就能搞定要想要二值化自定义阈值就用上面的代码
解决方案十五:
引用13楼crystal_lz的回复:

最简单的两句代码就能搞定要想要二值化自定义阈值就用上面的代码

但是和图片用画图工具打开保存的单色位图不一样!
解决方案:
.net中有现成的转换方法,只要执行Image.Save即可。把24L改为1L,或者别的值。
解决方案:
我说的很清楚了:参数rawValues就是#4得到的灰度数据byColorInfo也说了产生的位图与画图的不一样你可自行调整21行处的代码
解决方案:
引用14楼u013416462的回复:

但是和图片用画图工具打开保存的单色位图不一样!

你看到的不是“单色”,是“灰度”吧?
解决方案:
单色就是Encoder.ColorDepth==1L,而灰度的图片那就是Encoder.ColorDepth==8L。

时间: 2024-09-14 13:33:40

如果将普通图片转成单色位图bmp,例如画图工具转换成单色位图。的相关文章

c++-为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1?

问题描述 为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1? <C++ Primer>第五版,中文版.p33. 1.999999999999999(比转换之后少是 2 的少个 9) 也是 1. 微软免费 IDE 2015.g++ 好像也一样. #include <iostream> using namespace std; int main() { double d = 1.9999999999999999; int i = d; cout

在Word2003中将Word转换成图片详细教程

在Word2003实际使用中,很多朋友需要把Word文档转换成图片.将Word文档转换成PDF文件,然后保存为JPEG图片文件的方法固然可行,但需要安装付费的PDF转Word商业软件.其实借助Windows和Office本身具备的功能,同样可以实现Word转换成图片的目的. 1.插入Word对象并转换成JPEG图片 如果要转换成图片的Word文档只有一页,则在Word2003可以通过插入Word对象的方法将Word文档转换成图片,操作步骤如下所述: 第1步,新建一个Word文档,在菜单栏依次单击

如何把pdf里的表格转换成excel

日常工作中,为了方便计算或统计,有时会需要将PDF格式电子书,即其中的表格文本导入Excel中.这样就方便我们在其中进行图表的编辑和整理工作了.那么如何让PDF转换成Excel?网上的文件转换工具很多,但是从测试的结果来看,很多软件转换出来的文档常常是乱码一片. 这里给大家推荐一个可以说是目前最好的PDF转Excel工具: 这是一套专门将PDF文件转换成Excel的转换工具,除了转换成Excel文件外,还可以转换成Word.PPT.TXT.图片以及Office与 PDF两种文档格式之间的转换.当

ppt转换成pdf转换器怎么使用?

  下面我们一起来看看迅捷ppt转换成pdf转换器怎么使用吧! 图片1 步骤1:打开安装好的迅捷ppt转换成pdf转换器,选择"ppt转PDF"转换模式. 图片2 步骤2:点击软件中的"添加文件"按钮,将需要转换的ppt文件添加到软件中,用户也可以直接使用鼠标将ppt文件拖拽到软件上进行快速添加,并且可以同时添加多个文件. 图片3 步骤3:文件添加成功,此时大家可以设置转换文件的存储位置,大家可以选择保存在原文件夹内,也可以选择自定义文件夹,选择自定义文件夹的用户可

怎么把pdf文件转换成word?

  迅捷pdf转换成word转换器是一款功能强大的文件转换工具,它采用多层次转换技术,能够对各文件进行深度转换以达到最满意的转换效果,特别是在pdf转word技术上,能充分实现pdf文件的完美转换,不会出现任何排版错误.乱码的情况. 怎么把pdf文件转换成word? 首先,大家需要在电脑中下载安装迅捷PDF转换成word转换器,安装界面如下图所示: 图片1 第二步,安装完成后,打开迅捷PDF转换成word转换器,软件界面左侧有十种转换模式,这里我们选择"文件转Word"转换模式. 图片

万能迅捷PDF转换成Word软件全能版 Office转PDF

日前,最新发布的迅捷PDF转换成Word转换器在原有基础上,通过增强型的转换功能集成,已经不再仅仅局限于普通的PDF转换成Word的基础功能,而是成为一款具备全面覆盖PDF与多种不同文件格式的互相转换,最大限度地满足了不同用户的需求,成为目前下载和使用量最大的转换工具之一. 作为国内知名的文件格式转换大师,迅捷PDF转换成Word转换器较之传统的PDF转换工具具备极大的不同.普通的PDF转换成Word转换器软件功能核心单一,转换质量也较差,同时转换效率方面也很难满足广大用户的需求.实际上,很多用

pdf转换成ppt转换器方法介绍

最简单的方法 PDFto图片toPPT 在以往的经验里说过用小软件把PDF装换成图片.由于图片是按顺序排列的可以用office一个小软件实现转换成ppt的功能,首先是将pdf转成图片.打开软件添加PDF文件 ==点击装换按钮,等待文档转换完毕,PDf就变成一系列图像文件了.   ==然后进入程序office.如同的路径找到一个叫office picture manager的程序点击运行该软件   ==点击添加图片添加快捷.然后找到图片所在的文件夹.然后点击添加.这样图片就被添加完毕了   ==然

将CAJ、KDH、NH格式文件转换成WORD格式的方法教程【多图】

准备的软件工具 CAJViewer 7完整版 (带OCR组件) PDF虚拟打印机(本文以PDF factory 为例) OCR识别软件 (本文以ABBYY finereader 9为例) 步骤/方法 1 用CAJviewer 7打开你要转换的文件,如下图所示 如果我们需要第一段的内容,那么我们需要点击CAJViewer 7自带的OCR功能键,如下图 图中红色方框框出的按钮就是OCR识别按钮(如果你使用的是精简版的CAJviewer,那么这个按钮是灰色的,不可用的),我们点击一下鼠标就会变成十字形

WPS怎么将正文中大写字母转换成小写

  WPS文字轻松将大写字母转换成小写 ①将文章全部转换成小写. 选中文字,单击激活标题后面的"开始"标签,单击字体工具区域中的更改大小写图标,弹出"更改大小写"对话框,选择"小写"完成第一步. ②英文每句话的第一个字母必须大写,所以我们在全选状态下执行"句首字母大写"操作. ③英文专有名词中实词的第一个字母必须大写,我们选中相应单词后执行"词首字母大写"操作. ④像TV.PE等缩略词及某些特殊的词字母需要