问题描述
引用楼主gemeihao的回复:
中小企业如何利用云计算构建网...厂商为什么各自都推出了不同的...云计算与大数据领域的关系是?CIO选择云计算带来的时间节省是...如何利用云计算节约能源?winfrom将bmp转换为bmp格式的单色图位深度为1
以上代码是一个高手提高的但是有时候可以实现但是有时候又不行转换后的图片内容是空的但是转换前的内容是正常的希望高手支招
解决方案
解决方案二:
以下就是高手的代码但是有时候可以实现但是有时候又不行转换后的图片内容是空的但是转换前的内容是正常的希望高手支招转贴代码,参考一下:C#codeusingSystem;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSystem.Runtime.InteropServices;//打开任一索引色的或者非索引色的图像Imageimg=Image.FromFile("r.bmp");ImageAttributesta=newImageAttributes();/*下面用Graphics类改变像点颜色,是靠ImageAttributes来把*彩色变成灰度,或者颠倒黑白,发现用矩阵处理还是很方便的*///如实际发现几个简单又好用的矩阵:/*float[][]mm=newfloat[][]{//彩色变灰度的矩阵newfloat[]{0.4f,0.4f,0.4f,0,0},newfloat[]{0.3f,0.3f,0.3f,0,0},newfloat[]{0.3f,0.3f,0.3f,0,0},newfloat[]{0,0,0,1,0},newfloat[]{0,0,0,0,1}};float[][]mm1=newfloat[][]{//彩色反相的矩阵newfloat[]{0,0.3f,0.5f,0,0},newfloat[]{0.5f,0.3f,0.5f,0,0},newfloat[]{0.5f,0.4f,0,0,0},newfloat[]{0,0,0,1,0},newfloat[]{0,0,0,0,1}};*/float[][]mm2=newfloat[][]{//彩色变反相灰度的矩阵newfloat[]{-0.4f,-0.4f,-0.4f,0,0},newfloat[]{-0.3f,-0.3f,-0.3f,0,0},newfloat[]{-0.3f,-0.3f,-0.3f,0,0},newfloat[]{1,1,1,1,0},newfloat[]{0,0,0,0,1}};ColorMatrixcmt=newColorMatrix(mm2);ta.SetColorMatrix(cmt);/*//如果确知图像里仅有纯黑白二色,也可用ColorMap来反相,它可逐色改变ColorMapmap1=newColorMap();map1.OldColor=Color.Black;map1.NewColor=Color.White;ColorMapmap2=newColorMap();map2.OldColor=Color.White;map2.NewColor=Color.Black;ta.SetRemapTable(newColorMap[]{map1,map2},ColorAdjustType.Bitmap);*//*有的图像比如索引格式的位图或GIF是无法创建Graphics的,*需要新建一非索引色位图取得Graphics对象以便做画或改变像点颜色。*/Bitmapbmp=newBitmap(img.Width,img.Height);Graphicsg=Graphics.FromImage(bmp);g.DrawImage(img,newRectangle(0,0,bmp.Width,bmp.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel,ta);//g.DrawString("FoxitPDFReader",newFont("宋体",8),newSolidBrush(Color.White),0,0);g.Dispose();/*在如下构造图像数据之前,也可以先创建一单色位图并锁定数据,*利用它现成的Stride简单计算出实际每行有效数据之后的填充字节数,而且可*在下面循环里直接写点Marshal.WriteByte(dt.Scan0,k,val);而不用数组拷贝*///以下,把反相或者涂画后的像点数据每一行的每8点简单合并成1byte存储intmidrgb=Color.FromArgb(128,128,128).ToArgb();intstride;//简单公式((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;intk=bmp.Height*stride;byte[]buf=newbyte[k];for(intj=0;j<bmp.Height;j++){k=j*stride;//因图像宽度不同、有的可能有填充字节需要跳越intx=0,ab=0;for(inti=0;i<bmp.Width;i++){//从灰度变单色(下法如果直接从彩色变单色效果不太好,不过反相也可以在这里控制)if((bmp.GetPixel(i,j)).ToArgb()>midrgb)ab=ab*2+1;elseab=ab*2;x++;if(x==8){buf[k++]=(byte)ab;ab=0;x=0;}}if(x>0){//循环实现:剩余有效数据不满1字节的情况下须把它们移往字节的高位部分for(intt=x;t<8;t++)ab=ab*2;buf[k++]=(byte)ab;}}Bitmapbb=newBitmap(img.Width,img.Height,PixelFormat.Format1bppIndexed);BitmapDatadt=bb.LockBits(newRectangle(0,0,bb.Width,bb.Height),ImageLockMode.ReadWrite,bb.PixelFormat);Marshal.Copy(buf,0,dt.Scan0,buf.Length);bb.UnlockBits(dt);bb.Save("w.bmp",ImageFormat.Bmp);bb.Dispose();bmp.Dispose();img.Dispose();