当前位置:  编程技术>.net/c#/asp.net

c#文档图片自动纠偏

    来源: 互联网  发布时间:2014-10-29

    本文导语:  代码如下:public class Deskew    {        // Representation of a line in the image.          private class HougLine        {            // Count of points in the line.            public int Count;            // Index in Matrix.    ...

代码如下:

public class Deskew
    {
        // Representation of a line in the image. 
        private class HougLine
        {
            // Count of points in the line.
            public int Count;
            // Index in Matrix.
            public int Index;
            // The line is represented as all x,y that solve y*cos(alpha)-x*sin(alpha)=d
            public double Alpha;
        }


        // The Bitmap
        public Bitmap _internalBmp;

        // The range of angles to search for lines
        const double ALPHA_START = -20;
        const double ALPHA_STEP = 0.2;
        const int STEPS = 40 * 5;
        const double STEP = 1;

        // Precalculation of sin and cos.
        double[] _sinA;
        double[] _cosA;

        // Range of d
        double _min;


        int _count;
        // Count of points that fit in a line.
        int[] _hMatrix;

        // Calculate the skew angle of the image cBmp.
        public double GetSkewAngle()
        {
            // Hough Transformation
            Calc();

            // Top 20 of the detected lines in the image.
            HougLine[] hl = GetTop(20);

            // Average angle of the lines
            double sum = 0;
            int count = 0;
            for (int i = 0; i hl[j - 1].Count)
                    {
                        HougLine tmp = hl[j];
                        hl[j] = hl[j - 1];
                        hl[j - 1] = tmp;
                        j -= 1;
                    }
                }
            }

            for (int i = 0; i 0)
            {
                pixelFormat = PixelFormat.Format24bppRgb;
            }

            Bitmap tmpBitmap = new Bitmap(bmp.Width, bmp.Height, pixelFormat);
            tmpBitmap.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
            Graphics g = Graphics.FromImage(tmpBitmap);
            try
            {
                g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
                g.RotateTransform(angle);
                g.DrawImage(bmp, 0, 0);
            }
            catch
            {
            }
            finally
            {
                g.Dispose();
            }

            if (pixelFormatOld == PixelFormat.Format8bppIndexed) tmpBitmap = CopyTo8bpp(tmpBitmap);
            else if (pixelFormatOld == PixelFormat.Format1bppIndexed) tmpBitmap = CopyTo1bpp(tmpBitmap);

            return tmpBitmap;
        }

在最后进行图片选择时,位深度为1、4、8的索引图片是没办法直接用Graphics进行旋转操作的,需要图像的PixelFormat再做旋转。
现在只实现位深度为1和8的索引图片还原。

代码如下:

private static Bitmap CopyTo1bpp(Bitmap b)
        {
            int w = b.Width, h = b.Height; Rectangle r = new Rectangle(0, 0, w, h);
            if (b.PixelFormat != PixelFormat.Format32bppPArgb)
            {
                Bitmap temp = new Bitmap(w, h, PixelFormat.Format32bppPArgb);
                temp.SetResolution(b.HorizontalResolution, b.VerticalResolution);
                Graphics g = Graphics.FromImage(temp);
                g.DrawImage(b, r, 0, 0, w, h, GraphicsUnit.Pixel);
                g.Dispose();
                b = temp;
            }
            BitmapData bdat = b.LockBits(r, ImageLockMode.ReadOnly, b.PixelFormat);
            Bitmap b0 = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
            b0.SetResolution(b.HorizontalResolution, b.VerticalResolution);
            BitmapData b0dat = b0.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
            for (int y = 0; y < h; y++)
            {
                for (int x = 0; x < w; x++)
                {
                    int index = y * bdat.Stride + (x * 4);
                    if (Color.FromArgb(Marshal.ReadByte(bdat.Scan0, index + 2), Marshal.ReadByte(bdat.Scan0, index + 1), Marshal.ReadByte(bdat.Scan0, index)).GetBrightness() > 0.5f)
                    {
                        int index0 = y * b0dat.Stride + (x >> 3);
                        byte p = Marshal.ReadByte(b0dat.Scan0, index0);
                        byte mask = (byte)(0x80 >> (x & 0x7));
                        Marshal.WriteByte(b0dat.Scan0, index0, (byte)(p | mask));
                    }
                }
            }
            b0.UnlockBits(b0dat);
            b.UnlockBits(bdat);
            return b0;
        }

        private static Bitmap CopyTo8bpp(Bitmap bmp)
        {
            if (bmp == null) return null;

            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);

            int width = bmpData.Width;
            int height = bmpData.Height;
            int stride = bmpData.Stride;
            int offset = stride - width * 3;
            IntPtr ptr = bmpData.Scan0;
            int scanBytes = stride * height;

            int posScan = 0, posDst = 0;
            byte[] rgbValues = new byte[scanBytes];
            Marshal.Copy(ptr, rgbValues, 0, scanBytes);
            byte[] grayValues = new byte[width * height];

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    double temp = rgbValues[posScan++] * 0.11 +
                        rgbValues[posScan++] * 0.59 +
                        rgbValues[posScan++] * 0.3;
                    grayValues[posDst++] = (byte)temp;
                }
                posScan += offset;
            }

            Marshal.Copy(rgbValues, 0, ptr, scanBytes);
            bmp.UnlockBits(bmpData);

            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
            bitmap.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

            int offset0 = bitmapData.Stride - bitmapData.Width;
            int scanBytes0 = bitmapData.Stride * bitmapData.Height;
            byte[] rawValues = new byte[scanBytes0];

            int posSrc = 0;
            posScan = 0;
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    rawValues[posScan++] = grayValues[posSrc++];
                }
                posScan += offset0;
            }

            Marshal.Copy(rawValues, 0, bitmapData.Scan0, scanBytes0);
            bitmap.UnlockBits(bitmapData);

            ColorPalette palette;
            using (Bitmap bmp0 = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))
            {
                palette = bmp0.Palette;
            }
            for (int i = 0; i < 256; i++)
            {
                palette.Entries[i] = Color.FromArgb(i, i, i);
            }
            bitmap.Palette = palette;

            return bitmap;
        }


    
 
 

您可能感兴趣的文章:

  • c# 多文档窗口修改mdi窗体背景色的实现代码
  • C#采用OpenXml实现给word文档添加文字
  • C#获取Word文档中所有表格的实现代码分享
  • 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
  • c#中xml文档注释编译dll引用到其它项目示例
  • C# 写入XML文档的三种方法与代码实例
  • C#采用OpenXml给Word文档添加表格
  • C# 写入XML文档三种方法详细介绍
  • C#编程实现Excel文档中搜索文本内容的方法及思路
  • C# 生成XML文档的三种方法与代码实例
  • 使用c#在word文档中创建表格的方法详解
  • C#实现合并多个word文档的方法
  • c#实现在word文档中创建表格的具体方法
  • 高分求c#和java精彩文档
  • C#利用XML创建Excel文档的实现方法
  • C# 操作XML文档 使用XmlDocument类方法
  • word ppt excel文档转换成pdf的C#实现代码
  • C#实现通过模板自动创建Word文档的方法
  • C#转换EXCEL到TXT文档的方法介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Word文档转化成html后,再转化成CHM格式后,图片总不能显示,用很多转化工具试过!
  • 请问如何在 JTextPane 中嵌入图片实现多媒体文档?
  • 设置sharepoint 2010文档库中的 pdf文件在浏览器中访问的打开方式
  • openoffice 新建文件,我从网页上复制一些文字到这个新建文档里面后正常显示。但当我保存文档后关闭,再次打开文档时文档少部份中文变成了问号
  • HTML 5 <!DOCTYPE> HTML文档规范声明标签
  • linux-3.0Documentation 目录是 linux 内核及驱动的一些文档, 如何看这些文档呢? 从什么角度看这些文档?
  • java操作excel2007文档介绍及代码例子
  • vim怎么从中文帮助文档切换到英文帮助文档
  • HTML 5 <body> 标签-定义文档的主体
  • 寻JDK 1.4 中文文档下载地址,真的有1.4的中文文档吗?
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 急求redhat liunx8.0电子文档。(安装指南和入门指南和提高或相关的电子文档)
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 使用标准SAX解析XML文档如何获取文档编码信息及约束它的dtd文件路径.
  • HTML 文档各种元素用法介绍
  • 作网管需要了解那些知识,有文档看吗?求solaris中文文档,多谢!100分
  • HTML 文档属性介绍
  • gcc的帮助文档放在哪个位置?也就是HOWTO文档??
  • HTML 文档各种标题的定义及参考手册
  • openoffice保存好文档后,下次打开这个文档后字体大小什么的都变了。
  • HTML 文档中的段落<p>标签介绍
  • 求freebsd 5.2 的安装手册(文档)和配置使用文档。谢谢各位了。
  • 玩那个VI仿真器GVIM,愣是不知道怎么关闭当前文档,但不退出程序,然后装入一个旧文档


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3