c#.net image对象如何保存成单色bmp文件 15
在.net里,我通过一个第三方库的方法获得了一张图片的Image对象。对象的色深为24位,每个像素只包含黑白两种颜色。我如何将这个Image对象的色深变成1位即单色,并保...
在.net里,我通过一个第三方库的方法获得了一张图片的Image对象。对象的色深为24位,每个像素只包含黑白两种颜色。我如何将这个Image对象的色深变成1位即单色,并保存为bmp文件。
展开
1个回答
展开全部
/* //如果确知图像里仅有纯黑白二色,也可用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);
把反相或者涂画后的像点数据每一行的每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.Save("w.bmp",ImageFormat.Bmp);
bb.Dispose();
bmp.Dispose();
img.Dispose();
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);
把反相或者涂画后的像点数据每一行的每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.Save("w.bmp",ImageFormat.Bmp);
bb.Dispose();
bmp.Dispose();
img.Dispose();
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询