Csharp/C#教程:c#扫描图片去黑边(扫描仪去黑边)分享

自动去除图像扫描黑边
代码如下:
///<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#

对比C语言中execv相关的执行文件的三个函数

简单比较C语言中的execl()函数与execlp()函数

上述就是C#学习教程:c#扫描图片去黑边(扫描仪去黑边)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/905409.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐