验证码识别必备,c#分析bmp图形文件,一个有用的BMP图形分析类
2008-08-06 10:18
351 查看
以前帮朋友写的代码,现在公布出来,道理很简单的,切割,提取验证码,因为验证码字体并未重合,所以切割起来相当的简单,如果您要做分类信息的网站,采集还是可取的,识别率100%
疯狂代码原创发布,转载请注明出处
C#代码如下:
using System;
using CrazyCoder.Commom.IO;
namespace CrazyCoder.Common.Image
{
/**//// <summary>
/// BMP 的摘要说明。
/// </summary>
public class BMP
{
public BMP()
{
//
//TODO: 在此处添加构造函数逻辑
//功能:分析bmp文件格式
//本文参考了林福宗老师的有关BMP文件格式的文章
//
}
/**//*BMP(BitMap-File)图形文件是Windows采用的图形文件格式,在Windows环境
* 下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各
* 图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与
* 显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB
* (device-dependent BitMap)文件格式。Windows 3.0以后的BMP图象文件与
* 显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB
* (device-independent BitMap)格式(注:Windows 3.0以后,在系统中仍
* 然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将
* 图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的
* 是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件
* 默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
* */
public struct StructBMP
{
public BMPHeader Header;
public BMPPalette Palette;
public BMPData Data;
}
public struct BMPHeader
{
/**//*位图文件可看成由4个部分组成:位图文件头(BitMap-file header)、
* 位图信息头(BitMap-information header)、彩色表(color table)和
* 定义位图的字节阵列,
* */
public string Identifier;/**//*2 bytes,识别位图的类型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 BitMap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
*/
public System.Int32 FileSize;//1 dword,用字节表示的整个文件的大小
public byte[] Reserved;//1 dword,保留,必须设置为0
public System.Int32 BitMapDataOffset;//1 dword,从文件开始到位图数据开始之间的数据(BitMap data)之间的偏移量
public System.Int32 BitMapHeaderSize;/**//*1 dword
位图信息头(BitMap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - windows 3.1x, 95, nt, …
0ch - os/2 1.x
f0h - os/2 2.x
注: 在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化 比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
*/
public System.Int32 Width;//1 dword,位图的宽度,以象素为单位
public System.Int32 Height;//1 dword,位图的高度,以象素为单位
public System.Int16 Planes;//1 word,位图的位面数(注:该值将总是1)
public System.Int16 BitsPerPixel;
/**//*1 word
每个象素的位数
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit 真彩色位图
32 - 32bit 增强型真彩色位图
*/
public System.Int32 Compression;
/**//*1 dword
压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
*/
public System.Int32 BitMapDataSize;//1 dword,用字节数表示的位图数据的大小。该数必须是4的倍数
public System.Int32 HResolution;//1 dword,用象素/米表示的水平分辨率
public System.Int32 VResolution;//1 dword,用象素/米表示的垂直分辨率
public System.Int32 Colors;//1 dword,位图使用的颜色数。如8-比特/象素表示为100h或者 256.
public System.Int32 ImportantColors;
/**//*1 dword,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
*/
}
public struct BMPPalette
{
public byte[] Palette;//new byte[8192];//bmp规范没有规定调色板最大81926字节,此处可以根据程序需要调节
/**//*调色板数据根据BMP版本的不同而不同PaletteN * 4 byte调色板规范。
对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值: 1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
*/
}
public struct BMPData {
public byte[] BitMapData;//=new byte[1024000];//bmp规范没有规定bmp数据最多为1024000,此处可以根据需要调整
/**//*
图象数据根据BMP版本及调色板尺寸的不同而不同BitMap Dataxxx bytes该域的大小取决
于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是
彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。
*/
}
public void ProcessBMP(ref StructBMP sbmp,byte[] bytesFile)
{
byte[] word1=new byte[2];
byte[] word2=new byte[4];
System.Int32 result;
string str="";
word1[0]=bytesFile[0];
word1[1]=bytesFile[1];
str=FromBytesToString(word1);
sbmp.Header.Identifier=str;
word2[0]=bytesFile[2];
word2[1]=bytesFile[3];
word2[2]=bytesFile[4];
word2[3]=bytesFile[5];
result=this.FromBytesToInt32(word2);
sbmp.Header.FileSize=result;
word2[0]=bytesFile[10];
word2[1]=bytesFile[11];
word2[2]=bytesFile[12];
word2[3]=bytesFile[13];
result=this.FromBytesToInt32(word2);
sbmp.Header.BitMapDataOffset=result;
word2[0]=bytesFile[14];
word2[1]=bytesFile[15];
word2[2]=bytesFile[16];
word2[3]=bytesFile[17];
result=this.FromBytesToInt32(word2);
141 sbmp.Header.BitMapHeaderSize=result;
word2[0]=bytesFile[18];
word2[1]=bytesFile[19];
word2[2]=bytesFile[20];
word2[3]=bytesFile[21];
sbmp.Header.Width=result;
word2[0]=bytesFile[22];
word2[1]=bytesFile[23];
word2[2]=bytesFile[24];
word2[3]=bytesFile[25];
result=this.FromBytesToInt32(word2);
sbmp.Header.Height =result;
word1[0]=bytesFile[26];
word1[1]=bytesFile[27];
sbmp.Header.Planes=(System.Int16)FromBytesToInt32(word1);
word1[0]=bytesFile[28];
word1[1]=bytesFile[29];
sbmp.Header.BitsPerPixel=(System.Int16)FromBytesToInt32(word1);
word2[0]=bytesFile[30];
word2[1]=bytesFile[31];
word2[2]=bytesFile[32];
word2[3]=bytesFile[33];
result=this.FromBytesToInt32(word2);
sbmp.Header.Compression =result;
word2[0]=bytesFile[34];
word2[1]=bytesFile[35];
word2[2]=bytesFile[36];
word2[3]=bytesFile[37];
result=this.FromBytesToInt32(word2);
sbmp.Header.BitMapDataSize =result;
word2[0]=bytesFile[38];
word2[1]=bytesFile[39];
word2[2]=bytesFile[40];
word2[3]=bytesFile[41];
result=this.FromBytesToInt32(word2);
sbmp.Header.HResolution =result;
word2[0]=bytesFile[42];
word2[1]=bytesFile[43];
word2[2]=bytesFile[44];
word2[3]=bytesFile[45];
result=this.FromBytesToInt32(word2);
sbmp.Header.VResolution =result;
word2[0]=bytesFile[46];
word2[1]=bytesFile[47];
word2[2]=bytesFile[48];
word2[3]=bytesFile[49];
result=this.FromBytesToInt32(word2);
sbmp.Header.Colors =result;
word2[0]=bytesFile[50];
word2[1]=bytesFile[51];
word2[2]=bytesFile[52];
word2[3]=bytesFile[53];
result=this.FromBytesToInt32(word2);
sbmp.Header.ImportantColors =result;
//计算位图数据的开始位置
//sbmp.Header.BitMapDataSize是位图数据的大小,sbmp.Header.FileSize是整个文件的大小
//sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-1就是位图数据的开始位置
//0x36到sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-2就是调色板数据
result=sbmp.Header.FileSize-sbmp.Header.BitMapDataSize;
int j=0;
byte[] b=new byte[sbmp.Header.BitMapDataSize];
for(int i=result;i<sbmp.Header.FileSize;i++)
{
b[j]=bytesFile[i];j++;
}
sbmp.Data.BitMapData=b;
j=0;
b=new byte[result-sbmp.Header.BitMapDataOffset];
for(int i=sbmp.Header.BitMapDataOffset;i<result;i++)
{
b[j]=bytesFile[i];j++;
}
sbmp.Palette.Palette=b;
}
public void ProcessBMP(ref StructBMP sbmp,string File)
{
//先读取文件成字节数组,统一由ProcessBMP(StructBMP sbmp,byte[] bytesFile)处理
JJBase.FILE.ReadAndWrite f=new ReadAndWrite();
byte[] result=f.ReadBytesFromFile(File);
ProcessBMP(ref sbmp,result);
}
private System.Int32 FromBytesToInt32(byte[] b)
{
System.Int32 result=0;
System.Int32 t=0;
for(int i=b.Length-1;i>=0;i--)
{
if((int)b[i]!=0)
{
t=(int)Math.Pow(256,i);
result+=(int)b[i]*t;
}
}
return result;
}
private string FromBytesToString(byte[] b)
{
string result="";
for(int i=0;i<b.Length;i++)
{
result+=Convert.ToChar((int)(b[i])).ToString();
}
return result;
}
}
}
方法2:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace CrazyCoder.Common.Decode
{
public class GanjiImageDecode : CrazyCoder.Common.Decode.ImageDeCodeBase
{
public GanjiImageDecode(Bitmap pic) : base(pic) { }
public GanjiImageDecode(string path) : base(path) { }
//特征码数组
string[] CodeArray = new string[] {
"00011111000001111111000111000111001100000110110000000111100000001111000000011110000000111100000001101100000110011100011100011111110000011111000",//0
"0111111110110011001100110011001100110011001100110011",//1
"001111100011111110110000111000000011000000011000000110000001110000111000001110000011000000110000000111111111111111111",//2
"001111100011111110110000111000000011000000011000000111000011110000011110000000111000000011110000111011111110001111100",//3
"00000011100000000111000000011110000001101100000110011000011000110001100001100111000011001111111111111111111111000000011000000000110000000001100",//4
"111111110111111110110000000110000000110000000111111000000001110000000111000000011000000011010000111111111110011111100",//5
"0001111000001111111001110001000110000000110000000011001111001111111110111000011111000000110110000011011100011100111111100001111100",//6
"11111111111111110000011000001100000011000001100000110000001100000010000001100000011000000110000001100000",//7
"001111100011111110111000111110000011111000111011111110011111110111000111110000011110000011111000111011111110001111100",//8
"0011111000011111110011100011101100000110110000011111100011110111111011001111001100000000110000000110001000111001111111000011111000",//9
"11111111"//-
};
public Bitmap[] GetPic()
{
ToGrayByPixels(); //灰度处理
Bitmap bmp = GetPicValidByValue(128);
Bitmap[] pics = GetSplitPics2(bmp,128); //分割
for (int i = 0; i < pics.Length; i++)
{
if (pics[i] != null)
{
Bitmap b = pics[i];
pics[i] = GetPicValidByValue(pics[i], 128);
b.Dispose();
}
}
return pics;
}
public string GetCodeString()
{
Bitmap[] pics = GetPic();
string numStr = "";
for (int i = 0; i < pics.Length; i++)
{
string str = GanjiImageDecode.GetSingleBmpCode(pics[i], 128);
for (int j = 0; j < CodeArray.Length; j++)
{
if (CodeArray[j] == str)
{
if (j < CodeArray.Length - 1)
{
numStr += j.ToString();
}
else
{
numStr += "-";
}
}
}
}
return numStr;
}
}
}
疯狂代码原创发布,转载请注明出处
C#代码如下:
using System;
using CrazyCoder.Commom.IO;
namespace CrazyCoder.Common.Image
{
/**//// <summary>
/// BMP 的摘要说明。
/// </summary>
public class BMP
{
public BMP()
{
//
//TODO: 在此处添加构造函数逻辑
//功能:分析bmp文件格式
//本文参考了林福宗老师的有关BMP文件格式的文章
//
}
/**//*BMP(BitMap-File)图形文件是Windows采用的图形文件格式,在Windows环境
* 下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各
* 图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与
* 显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB
* (device-dependent BitMap)文件格式。Windows 3.0以后的BMP图象文件与
* 显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB
* (device-independent BitMap)格式(注:Windows 3.0以后,在系统中仍
* 然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将
* 图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的
* 是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件
* 默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
* */
public struct StructBMP
{
public BMPHeader Header;
public BMPPalette Palette;
public BMPData Data;
}
public struct BMPHeader
{
/**//*位图文件可看成由4个部分组成:位图文件头(BitMap-file header)、
* 位图信息头(BitMap-information header)、彩色表(color table)和
* 定义位图的字节阵列,
* */
public string Identifier;/**//*2 bytes,识别位图的类型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 BitMap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
*/
public System.Int32 FileSize;//1 dword,用字节表示的整个文件的大小
public byte[] Reserved;//1 dword,保留,必须设置为0
public System.Int32 BitMapDataOffset;//1 dword,从文件开始到位图数据开始之间的数据(BitMap data)之间的偏移量
public System.Int32 BitMapHeaderSize;/**//*1 dword
位图信息头(BitMap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - windows 3.1x, 95, nt, …
0ch - os/2 1.x
f0h - os/2 2.x
注: 在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化 比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
*/
public System.Int32 Width;//1 dword,位图的宽度,以象素为单位
public System.Int32 Height;//1 dword,位图的高度,以象素为单位
public System.Int16 Planes;//1 word,位图的位面数(注:该值将总是1)
public System.Int16 BitsPerPixel;
/**//*1 word
每个象素的位数
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit 真彩色位图
32 - 32bit 增强型真彩色位图
*/
public System.Int32 Compression;
/**//*1 dword
压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
*/
public System.Int32 BitMapDataSize;//1 dword,用字节数表示的位图数据的大小。该数必须是4的倍数
public System.Int32 HResolution;//1 dword,用象素/米表示的水平分辨率
public System.Int32 VResolution;//1 dword,用象素/米表示的垂直分辨率
public System.Int32 Colors;//1 dword,位图使用的颜色数。如8-比特/象素表示为100h或者 256.
public System.Int32 ImportantColors;
/**//*1 dword,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
*/
}
public struct BMPPalette
{
public byte[] Palette;//new byte[8192];//bmp规范没有规定调色板最大81926字节,此处可以根据程序需要调节
/**//*调色板数据根据BMP版本的不同而不同PaletteN * 4 byte调色板规范。
对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值: 1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
*/
}
public struct BMPData {
public byte[] BitMapData;//=new byte[1024000];//bmp规范没有规定bmp数据最多为1024000,此处可以根据需要调整
/**//*
图象数据根据BMP版本及调色板尺寸的不同而不同BitMap Dataxxx bytes该域的大小取决
于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是
彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。
*/
}
public void ProcessBMP(ref StructBMP sbmp,byte[] bytesFile)
{
byte[] word1=new byte[2];
byte[] word2=new byte[4];
System.Int32 result;
string str="";
word1[0]=bytesFile[0];
word1[1]=bytesFile[1];
str=FromBytesToString(word1);
sbmp.Header.Identifier=str;
word2[0]=bytesFile[2];
word2[1]=bytesFile[3];
word2[2]=bytesFile[4];
word2[3]=bytesFile[5];
result=this.FromBytesToInt32(word2);
sbmp.Header.FileSize=result;
word2[0]=bytesFile[10];
word2[1]=bytesFile[11];
word2[2]=bytesFile[12];
word2[3]=bytesFile[13];
result=this.FromBytesToInt32(word2);
sbmp.Header.BitMapDataOffset=result;
word2[0]=bytesFile[14];
word2[1]=bytesFile[15];
word2[2]=bytesFile[16];
word2[3]=bytesFile[17];
result=this.FromBytesToInt32(word2);
141 sbmp.Header.BitMapHeaderSize=result;
word2[0]=bytesFile[18];
word2[1]=bytesFile[19];
word2[2]=bytesFile[20];
word2[3]=bytesFile[21];
sbmp.Header.Width=result;
word2[0]=bytesFile[22];
word2[1]=bytesFile[23];
word2[2]=bytesFile[24];
word2[3]=bytesFile[25];
result=this.FromBytesToInt32(word2);
sbmp.Header.Height =result;
word1[0]=bytesFile[26];
word1[1]=bytesFile[27];
sbmp.Header.Planes=(System.Int16)FromBytesToInt32(word1);
word1[0]=bytesFile[28];
word1[1]=bytesFile[29];
sbmp.Header.BitsPerPixel=(System.Int16)FromBytesToInt32(word1);
word2[0]=bytesFile[30];
word2[1]=bytesFile[31];
word2[2]=bytesFile[32];
word2[3]=bytesFile[33];
result=this.FromBytesToInt32(word2);
sbmp.Header.Compression =result;
word2[0]=bytesFile[34];
word2[1]=bytesFile[35];
word2[2]=bytesFile[36];
word2[3]=bytesFile[37];
result=this.FromBytesToInt32(word2);
sbmp.Header.BitMapDataSize =result;
word2[0]=bytesFile[38];
word2[1]=bytesFile[39];
word2[2]=bytesFile[40];
word2[3]=bytesFile[41];
result=this.FromBytesToInt32(word2);
sbmp.Header.HResolution =result;
word2[0]=bytesFile[42];
word2[1]=bytesFile[43];
word2[2]=bytesFile[44];
word2[3]=bytesFile[45];
result=this.FromBytesToInt32(word2);
sbmp.Header.VResolution =result;
word2[0]=bytesFile[46];
word2[1]=bytesFile[47];
word2[2]=bytesFile[48];
word2[3]=bytesFile[49];
result=this.FromBytesToInt32(word2);
sbmp.Header.Colors =result;
word2[0]=bytesFile[50];
word2[1]=bytesFile[51];
word2[2]=bytesFile[52];
word2[3]=bytesFile[53];
result=this.FromBytesToInt32(word2);
sbmp.Header.ImportantColors =result;
//计算位图数据的开始位置
//sbmp.Header.BitMapDataSize是位图数据的大小,sbmp.Header.FileSize是整个文件的大小
//sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-1就是位图数据的开始位置
//0x36到sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-2就是调色板数据
result=sbmp.Header.FileSize-sbmp.Header.BitMapDataSize;
int j=0;
byte[] b=new byte[sbmp.Header.BitMapDataSize];
for(int i=result;i<sbmp.Header.FileSize;i++)
{
b[j]=bytesFile[i];j++;
}
sbmp.Data.BitMapData=b;
j=0;
b=new byte[result-sbmp.Header.BitMapDataOffset];
for(int i=sbmp.Header.BitMapDataOffset;i<result;i++)
{
b[j]=bytesFile[i];j++;
}
sbmp.Palette.Palette=b;
}
public void ProcessBMP(ref StructBMP sbmp,string File)
{
//先读取文件成字节数组,统一由ProcessBMP(StructBMP sbmp,byte[] bytesFile)处理
JJBase.FILE.ReadAndWrite f=new ReadAndWrite();
byte[] result=f.ReadBytesFromFile(File);
ProcessBMP(ref sbmp,result);
}
private System.Int32 FromBytesToInt32(byte[] b)
{
System.Int32 result=0;
System.Int32 t=0;
for(int i=b.Length-1;i>=0;i--)
{
if((int)b[i]!=0)
{
t=(int)Math.Pow(256,i);
result+=(int)b[i]*t;
}
}
return result;
}
private string FromBytesToString(byte[] b)
{
string result="";
for(int i=0;i<b.Length;i++)
{
result+=Convert.ToChar((int)(b[i])).ToString();
}
return result;
}
}
}
方法2:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace CrazyCoder.Common.Decode
{
public class GanjiImageDecode : CrazyCoder.Common.Decode.ImageDeCodeBase
{
public GanjiImageDecode(Bitmap pic) : base(pic) { }
public GanjiImageDecode(string path) : base(path) { }
//特征码数组
string[] CodeArray = new string[] {
"00011111000001111111000111000111001100000110110000000111100000001111000000011110000000111100000001101100000110011100011100011111110000011111000",//0
"0111111110110011001100110011001100110011001100110011",//1
"001111100011111110110000111000000011000000011000000110000001110000111000001110000011000000110000000111111111111111111",//2
"001111100011111110110000111000000011000000011000000111000011110000011110000000111000000011110000111011111110001111100",//3
"00000011100000000111000000011110000001101100000110011000011000110001100001100111000011001111111111111111111111000000011000000000110000000001100",//4
"111111110111111110110000000110000000110000000111111000000001110000000111000000011000000011010000111111111110011111100",//5
"0001111000001111111001110001000110000000110000000011001111001111111110111000011111000000110110000011011100011100111111100001111100",//6
"11111111111111110000011000001100000011000001100000110000001100000010000001100000011000000110000001100000",//7
"001111100011111110111000111110000011111000111011111110011111110111000111110000011110000011111000111011111110001111100",//8
"0011111000011111110011100011101100000110110000011111100011110111111011001111001100000000110000000110001000111001111111000011111000",//9
"11111111"//-
};
public Bitmap[] GetPic()
{
ToGrayByPixels(); //灰度处理
Bitmap bmp = GetPicValidByValue(128);
Bitmap[] pics = GetSplitPics2(bmp,128); //分割
for (int i = 0; i < pics.Length; i++)
{
if (pics[i] != null)
{
Bitmap b = pics[i];
pics[i] = GetPicValidByValue(pics[i], 128);
b.Dispose();
}
}
return pics;
}
public string GetCodeString()
{
Bitmap[] pics = GetPic();
string numStr = "";
for (int i = 0; i < pics.Length; i++)
{
string str = GanjiImageDecode.GetSingleBmpCode(pics[i], 128);
for (int j = 0; j < CodeArray.Length; j++)
{
if (CodeArray[j] == str)
{
if (j < CodeArray.Length - 1)
{
numStr += j.ToString();
}
else
{
numStr += "-";
}
}
}
}
return numStr;
}
}
}
相关文章推荐
- 验证码识别必备,c#分析bmp图形文件,一个有用的BMP图形分析类
- 验证码识别必备,c#分析bmp图形文件,一个有用的BMP图形分析类收藏
- 验证码识别必备,c#分析bmp图形文件,一个有用的BMP图形分析类
- BMP图形文件分析类(c#)
- BMP图形文件分析类(c#)
- 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频
- c#判断一个文件是否是图形文件
- 保存MFC的CBitmap对象中的图象到一个BMP文件中
- Unix - 文件中构成一个空洞的分析
- C# .NET想要另存一个项目,sln文件丢了怎么办
- C#将接受到的流写入文件的回调函数------一个防止内存溢出的方法
- C#控制台控制台将一个文件夹中的所有txt文件中的数据读取出来
- C#怎么通过一个按钮Button,实现点击这个按钮可以打开一个文件或者文件夹?
- C# 判断一个文件是否正在被使用。
- 发布一个C#+ADOMD.NET实现查看分析服务数据库信息的类对象
- ffmpeg将一个视频文件解码输出bmp和jpg文件--重写tutorial01程序
- 分析Linux下如何运行一个可执行文件?
- C# 如何创建一个xml文件?并写入指定内容?
- c#判断一个文件是否是图片文件
- C# - 把两个bitmap文件合并成一个bitmap文件