c#扫描图片去黑边(扫描仪去黑边)

自动去除图像扫描黑边

复制代码 代码如下:

/// <summary>
        /// 自动去除图像扫描黑边
        /// </summary>
        /// <param name="fileName"></param>
        public static void AutoCutBlackEdge(string fileName)
        {
            //打开图像
            Bitmap bmp = OpenImage(fileName);

RemoveBlackEdge(bmp);
            //保存图像
            SaveImage(bmp, fileName);
        }

private static byte[] rgbValues; // 目标数组内存

/// <summary>
        /// 图像去黑边
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        private static Bitmap RemoveBlackEdge(Bitmap bmp)
        {
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

// 获取图像参数 
            int w = bmpData.Width;
            int h = bmpData.Height;
            int stride = bmpData.Stride;  // 扫描线的宽度
            double picByteSize = GetPicByteSize(bmp.PixelFormat);
            int bWidth = (int)Math.Ceiling(picByteSize * w); //显示宽度
            int offset = stride - bWidth;  // 显示宽度与扫描线宽度的间隙 
            IntPtr ptr = bmpData.Scan0;   // 获取bmpData的内存起始位置 
            int scanBytes = stride * h;  // 用stride宽度,表示这是内存区域的大小

// 分别设置两个位置指针,指向源数组和目标数组 
            int posScan = 0;
            rgbValues = new byte[scanBytes];  // 为目标数组分配内存 
            Marshal.Copy(ptr, rgbValues, 0, scanBytes);  // 将图像数据拷贝到rgbValues中

bool isPass = true;
            int i = 0, j = 0;
            int cutW = (int)(bWidth * 0.02); //2%宽度(可修改)
            int cutH = (int)(h * 0.02);      //2%高度(可修改)
            int posLen = (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 (int m = 1; m <= posLen; m++)
                        {
                            if (rgbValues[posScan + m] < 255) isPass = false;
                        }
                    }
                    if (rgbValues[posScan + 1] < 255 || bWidth / 2 < j) isPass = false;
                    recCheck(ref rgbValues, posScan, h, stride, true);

posScan++;
                    if (j >= cutW && isPass) break;
                }
                // 跳过图像数据每行未用空间的字节,length = stride - width * bytePerPixel 
                if (j == bWidth) posScan += offset;
                else posScan += (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 (int m = 1; m <= posLen; m++)
                        {
                            if (rgbValues[posScan - m] < 255) isPass = false;
                        }
                    }
                    if (rgbValues[posScan - 1] < 255 || bWidth / 2 > j) isPass = false;
                    recCheck(ref rgbValues, 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);  // 解锁内存区域

return bmp;
        }

/// <summary>
        /// 上下去除黑边时,临近黑点去除
        /// </summary>
        /// <param name="rgbValues"></param>
        /// <param name="posScan"></param>
        /// <param name="h"></param>
        /// <param name="stride"></param>
        /// <param name="islLeft"></param>
        private static void recCheck(ref byte[] rgbValues, int posScan, int h, int stride, bool islLeft)
        {
            int scanBytes = h * stride;
            int cutH = (int)(h * 0.01); //临近最大1%高度(可修改)
            for (int i = 1; i <= cutH; i++)
            {
                int befRow = 0;
                if (islLeft && (posScan - stride * i) > 0)
                {
                    befRow = posScan - stride * i;
                }
                else if (!islLeft && (posScan + stride * i) < scanBytes)
                {
                    befRow = posScan + stride * i;
                }
                if (rgbValues[befRow] < 255) rgbValues[befRow] = 255;
                else break;
            }
        }

时间: 2014-03-14

C#实现绘制浮雕图片效果实例

本文采用C#实例讲解了处理图片为浮雕效果的实现方法,这在PS中是一个常见的功能,也是C#中的一个简单的图像处理例子.程序先读取原图,然后依次访问每个像素的RGB值,获取相邻两个像素的R.G.B值,计算与左上角像素的RGB分量之差,将计算后的RGB值回写到位图,最后进行图片的浮雕处理. 主要代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using Sy

C#实现对图片文件的压缩、裁剪操作实例

本文实例讲述了C#对图片文件的压缩.裁剪操作方法,在C#项目开发中非常有实用价值.分享给大家供大家参考.具体如下: 一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 具体步骤如下: 先说图片压缩: 第一步:需要读取一个图片文件,读取方法: //

C# 实现的图片盖章功能,支持拖拽、旋转、放缩、保存

实现图片盖章功能,在图片上点击,增加"图章"小图片,可以拖拽"图章"到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加"图章"2.选中移动图标3.点中右下角放缩旋转图章. 效果图: 实现代码如下: 1.  窗口Xaml代码 复制代码 代码如下: <Window x:Class="Lenovo.YogaPaster.ImageEditWindow"    xmlns="htt

C#实现动态显示及动态移除图片方法

本文所述实例为C#动态加载一张图片并显示及动态移除它的实现方法,代码主要涉及一些C#图像操作知识,代码简单易懂,对C#的初学者有一定的帮助. 主要功能代码如下: using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ImageListRemovePicture { public partial class Form1 : For

C#判断上传文件是否是图片以防止木马上传的方法

很多时候木马程序会伪装成其他格式的文件上传到网站,最常见的如图片格式.本文就以C#为例讲述C#判断上传文件是否是图片以防止木马上传的方法,具体方法如下: 方法一:用image对象判断是否为图片 /// <summary> /// 判断文件是否为图片 /// </summary> /// <param name="path">文件的完整路径</param> /// <returns>返回结果</returns> pu

C#操作图片读取和存储SQLserver实现代码

一.用C#将Image转换成byte[]并插入数据库: 1.1 将图片控件的Image转换成流: 复制代码 代码如下: private byte[] PicToArray() { Bitmap bm = new Bitmap(picBox.Image); MemoryStream ms = new MemoryStream(); bm.Save(ms, ImageFormat.Jpeg); return ms.GetBuffer(); } 复制代码 代码如下: //保存到数据库 try { st

c#在sql中存取图片image示例

(1)控制台应用程序下演示插入图片 复制代码 代码如下: public void InsertIMG(){//将需要存储的图片读取为数据流FileStream fs = new FileStream(@"E:\c.jpg", FileMode.Open,FileAccess.Read);Byte[] btye2 = new byte[fs.Length];fs.Read(btye2 , 0, Convert.ToInt32(fs.Length));fs.Close(); using (

C#实现图片上传与浏览切换的方法

本文以一个完整实例讲述了C#实现图片上传与浏览切换的方法,对于进行C#程序设计来说具有一定的借鉴价值.分享给大家供大家参考. 具体实现代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %> <!DOCTYPE html PUBLIC "-//W3C//

c#图片处理之图片裁剪成不规则图形

为了让大家知道下面内容是否是自己想要的,我先发效果图. 好了,那就开始贴代码了 以下为一个按钮的事件,为裁剪准备图片.裁剪路径.保存路径 复制代码 代码如下: private void button1_Click(object sender, EventArgs e)        {            GraphicsPath path = new GraphicsPath();            Point[] p = {                            new

C#实现将网页保存成图片的网页拍照功能

本文实例主要实现了网页照相机程序的功能.C#实现将网页保存成图片格式,简单实现网页拍照,主要是基于ActiveX 组件的网页快照类,AcitveX 必须实现 IViewObject 接口.因此读者完全可扩展此类将其用于你的C#软件项目中.在此特别感谢作者:随飞提供的代码. 主要功能代码如下: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices

C#(.net)水印图片的生成完整实例

本文以一个完整实例讲述了C#水印图片的生成方法.是非常实用的技巧.分享给大家供大家参考. 具体实例代码如下: /* * * 使用说明: * 建议先定义一个WaterImage实例 * 然后利用实例的属性,去匹配需要进行操作的参数 * 然后定义一个WaterImageManage实例 * 利用WaterImageManage实例进行DrawImage(),印图片水印 * DrawWords()印文字水印 * */ using System; using System.Drawing; using

C#实现图片放大功能的按照像素放大图像方法

本文实例讲述了基于Visual C#实现的图片放大功能代码.可以直接放大像素,类似photoshop的图片放大功能,可用于像素的定位及修改,由于使用了指针需要勾选允许不安全代码选项,读者可将其用于自己的项目中! 关于几个参数说明: srcbitmap源图片 multiple图像放大倍数 放大处理后的图片 注意:需要在头部引用:using System.Drawing;using System.Drawing.Imaging; 至于命名空间读者可以自己定义. 主要功能代码如下: using Sys

基于jquery实现图片放大功能

本文实例为大家分享了jquery实现图片放大功能的具体实现代码,供大家参考,具体内容如下 图片放大功能类似于淘宝上的商品的查看,如果鼠标移动到小图上就会在相应的位置显示出大图.如果自己写这些代码,会很痛苦.官方网站上提供了一个类库--jquery.jqzoom.js:只需要引入次类库,引用此类库,添加一些css代码即可实现此功能: HTML框架如下: <div class="jqzoom"> <img src="images/pro_img/blue_one

Vue press 支持图片放大功能的实例代码

介绍 VuePress 由两部分组成:一个以 Vue 驱动的主题系统的简约静态网站生成工具,和一个为编写技术文档而优化的默认主题.它是为了支持 Vue 子项目的文档需求而创建的. 由 VuePress 生成的每个页面,都具有相应的预渲染静态 HTML,它们能提供出色的加载性能,并且对 SEO 友好.然而,页面加载之后,Vue 就会将这些静态内容,接管为完整的单页面应用程序(SPA).当用户在浏览站点时,可以按需加载其他页面. 前两天接触到了 Vuepress ,颜值很高,界面简洁,容易上手.于是

微信小程序如何实现点击图片放大功能

这篇文章主要介绍了微信小程序如何实现点击图片放大功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 WXML: <view class='imgList'> <view class='imgList-li' wx:for='{{imgArr}}'> <image class='img' src='{{item}}' data-src='{{item}}' bindtap='previewImg'></image&

Android开发实现的图片浏览功能示例【放大图片】

本文实例讲述了Android开发实现的图片浏览功能.分享给大家供大家参考,具体如下: 效果图: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res

java实现的图片裁剪功能示例

本文实例讲述了java实现的图片裁剪功能.分享给大家供大家参考,具体如下: PicCut.java: package Tsets; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax

jquery实现图片放大镜功能

实现原理: 这里用到了两张图片,一张小图,一张大图.将大图设置为放大镜的背景图片,当鼠标在小图上移动时,同时控制背景大图在放大镜中的位置.两张图片大小最好是等比例的,这样才能达到最佳效果.当没有大图时,则默认为小图本身,这时由于两张图片大小一样,因此放大镜效果不明显,就跟没放大是一样的. 此插件用到了html5,css3的一些属性,ie8及以下版本不兼容,放大镜是方形的. 运行效果截图如下: 具体代码如下: (function () { $.fn.Magnifier = function (op

jquery图片放大镜功能的实例代码

复制代码 代码如下: /*放大镜*/ .ZoomMain {margin:100px;width:395px;height:460px;float:left;position:relative;} .ZoomMain .zoom {height:393px;width:393px;position:relative;border: 1px solid #dcdddd;} .ZoomMain .zoom .move{position:absolute;left:0; top:0;display:n

vue中element-ui表格缩略图悬浮放大功能的实例代码

element-ui界面非常简洁和美观,提供的组件可以满足绝大多数的应用场景,当表格中显示了图片的缩略图时,想要鼠标浮动在缩略图上时放大图片的效果,该如何实现呢?element-ui虽然没有直接提供图片悬浮放大的组件,但是可以使用Popover弹出框组件,一样实现效果,如下: 具体的代码(此处只是图片单元格的代码,其它代码省略): <el-table-column prop="picture" header-align="center" align="

Python实现使用卷积提取图片轮廓功能示例

本文实例讲述了Python实现使用卷积提取图片轮廓功能.分享给大家供大家参考,具体如下: 一.实例描述 将彩色的图片生成带边缘化信息的图片. 本例中先载入一个图片,然后使用一个"3通道输入,1通道输出的3*3卷积核"(即sobel算子),最后使用卷积函数输出生成的结果. 二.代码 ''''' 载入图片并显示 首先将图片放到代码的同级目录下,通过imread载入,然后将其显示并打印出来 ''' import matplotlib.pyplot as plt # plt 用于显示图片 im