自动去除图像扫描黑边
代码如下:
///<summary>
///自动去除图像扫描黑边
///</summary>
///<paramname=”fileName”></param>
publicstaticvoidAutoCutBlackEdge(stringfileName)
{
//打开图像
Bitmapbmp=OpenImage(fileName);
RemoveBlackEdge(bmp);
//保存图像
SaveImage(bmp,fileName);
}
privatestaticbyte[]rgbValues;//目标数组内存
///<summary>
///图像去黑边
///</summary>
///<paramname=”bmp”></param>
///<returns></returns>
privatestaticBitmapRemoveBlackEdge(Bitmapbmp)
{
Rectanglerect=newRectangle(0,0,bmp.Width,bmp.Height);
BitmapDatabmpData=bmp.LockBits(rect,ImageLockMode.ReadWrite,bmp.PixelFormat);
//获取图像参数
intw=bmpData.Width;
inth=bmpData.Height;
intstride=bmpData.Stride; //扫描线的宽度
doublepicByteSize=GetPicByteSize(bmp.PixelFormat);
intbWidth=(int)Math.Ceiling(picByteSize*w);//显示宽度
intoffset=stride-bWidth; //显示宽度与扫描线宽度的间隙
IntPtrptr=bmpData.Scan0; //获取bmpData的内存起始位置
intscanBytes=stride*h; //用stride宽度,表示这是内存区域的大小
//分别设置两个位置指针,指向源数组和目标数组
intposScan=0;
rgbValues=newbyte[scanBytes]; //为目标数组分配内存
Marshal.Copy(ptr,rgbValues,0,scanBytes); //将图像数据拷贝到rgbValues中
boolisPass=true;
inti=0,j=0;
intcutW=(int)(bWidth*0.02);//2%宽度(可修改)
intcutH=(int)(h*0.02); //2%高度(可修改)
intposLen=(int)(picByteSize*8);//继续查找深度为8的倍数(可修改)
//左边
for(i=0;i<h;i++)
{
for(j=0;j<bWidth;j++)
{
isPass=true;
if(rgbValues[posScan]<255)rgbValues[posScan]=255;
if(rgbValues[posScan+1]==255)
{
for(intm=1;m<=posLen;m++)
{
if(rgbValues[posScan+m]<255)isPass=false;
}
}
if(rgbValues[posScan+1]<255||bWidth/2<j)isPass=false;
recCheck(refrgbValues,posScan,h,stride,true);
posScan++;
if(j>=cutW&&isPass)break;
}
//跳过图像数据每行未用空间的字节,length=stride-width*bytePerPixel
if(j==bWidth)posScan+=offset;
elseposScan+=(offset+bWidth-j-1);
}
//右边
posScan=scanBytes-1;
for(i=h-1;i>=0;i–)
{
posScan-=offset;
for(j=bWidth-1;j>=0;j–)
{
isPass=true;
if(rgbValues[posScan]<255)rgbValues[posScan]=255;
if(rgbValues[posScan-1]==255)
{
for(intm=1;m<=posLen;m++)
{
if(rgbValues[posScan-m]<255)isPass=false;
}
}
if(rgbValues[posScan-1]<255||bWidth/2>j)isPass=false;
recCheck(refrgbValues,posScan,h,stride,false);
posScan–;
if(cutH<(h-i))
if(j<(bWidth-cutW)&&isPass)break;
}
//跳过图像数据每行未用空间的字节,length=stride-width*bytePerPixel
if(j!=-1)posScan-=j;
}
//内存解锁
Marshal.Copy(rgbValues,0,ptr,scanBytes);
bmp.UnlockBits(bmpData); //解锁内存区域
returnbmp;
}
///<summary>
///上下去除黑边时,临近黑点去除
///</summary>
///<paramname=”rgbValues”></param>
///<paramname=”posScan”></param>
///<paramname=”h”></param>
///<paramname=”stride”></param>
///<paramname=”islLeft”></param>
privatestaticvoidrecCheck(refbyte[]rgbValues,intposScan,inth,intstride,boolislLeft)
{
intscanBytes=h*stride;
intcutH=(int)(h*0.01);//临近最大1%高度(可修改)
for(inti=1;i<=cutH;i++)
{
intbefRow=0;
if(islLeft&&(posScan-stride*i)>0)
{
befRow=posScan-stride*i;
}
elseif(!islLeft&&(posScan+stride*i)<scanBytes)
{
befRow=posScan+stride*i;
}
if(rgbValues[befRow]<255)rgbValues[befRow]=255;
elsebreak;
}
}
您可能感兴趣的文章:C#操作图片读取和存储SQLserver实现代码C#(.net)水印图片的生成完整实例C#实现图片上传与浏览切换的方法C#实现绘制浮雕图片效果实例C#实现图片放大功能的按照像素放大图像方法C#实现将网页保存成图片的网页拍照功能C#实现动态显示及动态移除图片方法C#判断上传文件是否是图片以防止木马上传的方法c#图片处理之图片裁剪成不规则图形C#实现的图片盖章功能,支持拖拽、旋转、放缩、保存c#在sql中存取图片image示例C#实现对图片文件的压缩、裁剪操作实例
对比C语言中execv相关的执行文件的三个函数
简单比较C语言中的execl()函数与execlp()函数
上述就是C#学习教程:c#扫描图片去黑边(扫描仪去黑边)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/905409.html