ab56a9bcf7
SVN-Revision: r240
272 lines
10 KiB
C#
272 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
|
|
namespace Lskj.Control.ZKFinger
|
|
{
|
|
public class BitmapFormat
|
|
{
|
|
public struct BITMAPFILEHEADER
|
|
{
|
|
public ushort bfType;
|
|
public int bfSize;
|
|
public ushort bfReserved1;
|
|
public ushort bfReserved2;
|
|
public int bfOffBits;
|
|
}
|
|
|
|
public struct MASK
|
|
{
|
|
public byte redmask;
|
|
public byte greenmask;
|
|
public byte bluemask;
|
|
public byte rgbReserved;
|
|
}
|
|
|
|
public struct BITMAPINFOHEADER
|
|
{
|
|
public int biSize;
|
|
public int biWidth;
|
|
public int biHeight;
|
|
public ushort biPlanes;
|
|
public ushort biBitCount;
|
|
public int biCompression;
|
|
public int biSizeImage;
|
|
public int biXPelsPerMeter;
|
|
public int biYPelsPerMeter;
|
|
public int biClrUsed;
|
|
public int biClrImportant;
|
|
}
|
|
|
|
/*******************************************
|
|
* 函数名称:RotatePic
|
|
* 函数功能:旋转图片,目的是保存和显示的图片与按的指纹方向不同
|
|
* 函数入参:BmpBuf---旋转前的指纹字符串
|
|
* 函数出参:ResBuf---旋转后的指纹字符串
|
|
* 函数返回:无
|
|
*********************************************/
|
|
public static void RotatePic(byte[] BmpBuf, int width, int height, ref byte[] ResBuf)
|
|
{
|
|
int RowLoop = 0;
|
|
int ColLoop = 0;
|
|
int BmpBuflen = width * height;
|
|
|
|
try
|
|
{
|
|
for (RowLoop = 0; RowLoop < BmpBuflen;)
|
|
{
|
|
for (ColLoop = 0; ColLoop < width; ColLoop++)
|
|
{
|
|
ResBuf[RowLoop + ColLoop] = BmpBuf[BmpBuflen - RowLoop - width + ColLoop];
|
|
}
|
|
|
|
RowLoop = RowLoop + width;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//ZKCE.SysException.ZKCELogger logger = new ZKCE.SysException.ZKCELogger(ex);
|
|
//logger.Append();
|
|
}
|
|
}
|
|
|
|
/*******************************************
|
|
* 函数名称:StructToBytes
|
|
* 函数功能:将结构体转化成无符号字符串数组
|
|
* 函数入参:StructObj---被转化的结构体
|
|
* Size---被转化的结构体的大小
|
|
* 函数出参:无
|
|
* 函数返回:结构体转化后的数组
|
|
*********************************************/
|
|
public static byte[] StructToBytes(object StructObj, int Size)
|
|
{
|
|
int StructSize = Marshal.SizeOf(StructObj);
|
|
byte[] GetBytes = new byte[StructSize];
|
|
|
|
try
|
|
{
|
|
IntPtr StructPtr = Marshal.AllocHGlobal(StructSize);
|
|
Marshal.StructureToPtr(StructObj, StructPtr, false);
|
|
Marshal.Copy(StructPtr, GetBytes, 0, StructSize);
|
|
Marshal.FreeHGlobal(StructPtr);
|
|
|
|
if (Size == 14)
|
|
{
|
|
byte[] NewBytes = new byte[Size];
|
|
int Count = 0;
|
|
int Loop = 0;
|
|
|
|
for (Loop = 0; Loop < StructSize; Loop++)
|
|
{
|
|
if (Loop != 2 && Loop != 3)
|
|
{
|
|
NewBytes[Count] = GetBytes[Loop];
|
|
Count++;
|
|
}
|
|
}
|
|
|
|
return NewBytes;
|
|
}
|
|
else
|
|
{
|
|
return GetBytes;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//ZKCE.SysException.ZKCELogger logger = new ZKCE.SysException.ZKCELogger(ex);
|
|
//logger.Append();
|
|
|
|
return GetBytes;
|
|
}
|
|
}
|
|
|
|
/*******************************************
|
|
* 函数名称:GetBitmap
|
|
* 函数功能:将传进来的数据保存为图片
|
|
* 函数入参:buffer---图片数据
|
|
* nWidth---图片的宽度
|
|
* nHeight---图片的高度
|
|
* 函数出参:无
|
|
* 函数返回:无
|
|
*********************************************/
|
|
public static void GetBitmap(byte[] buffer, int nWidth, int nHeight, ref MemoryStream ms)
|
|
{
|
|
int ColorIndex = 0;
|
|
ushort m_nBitCount = 8;
|
|
int m_nColorTableEntries = 256;
|
|
byte[] ResBuf = new byte[nWidth * nHeight];
|
|
|
|
try
|
|
{
|
|
BITMAPFILEHEADER BmpHeader = new BITMAPFILEHEADER();
|
|
BITMAPINFOHEADER BmpInfoHeader = new BITMAPINFOHEADER();
|
|
MASK[] ColorMask = new MASK[m_nColorTableEntries];
|
|
|
|
//图片头信息
|
|
BmpInfoHeader.biSize = Marshal.SizeOf(BmpInfoHeader);
|
|
BmpInfoHeader.biWidth = nWidth;
|
|
BmpInfoHeader.biHeight = nHeight;
|
|
BmpInfoHeader.biPlanes = 1;
|
|
BmpInfoHeader.biBitCount = m_nBitCount;
|
|
BmpInfoHeader.biCompression = 0;
|
|
BmpInfoHeader.biSizeImage = 0;
|
|
BmpInfoHeader.biXPelsPerMeter = 0;
|
|
BmpInfoHeader.biYPelsPerMeter = 0;
|
|
BmpInfoHeader.biClrUsed = m_nColorTableEntries;
|
|
BmpInfoHeader.biClrImportant = m_nColorTableEntries;
|
|
|
|
//文件头信息
|
|
BmpHeader.bfType = 0x4D42;
|
|
BmpHeader.bfOffBits = 14 + Marshal.SizeOf(BmpInfoHeader) + BmpInfoHeader.biClrUsed * 4;
|
|
BmpHeader.bfSize = BmpHeader.bfOffBits + ((((BmpInfoHeader.biWidth * BmpInfoHeader.biBitCount + 31) / 32) * 4) * BmpInfoHeader.biHeight);
|
|
BmpHeader.bfReserved1 = 0;
|
|
BmpHeader.bfReserved2 = 0;
|
|
|
|
ms.Write(StructToBytes(BmpHeader, 14), 0, 14);
|
|
ms.Write(StructToBytes(BmpInfoHeader, Marshal.SizeOf(BmpInfoHeader)), 0, Marshal.SizeOf(BmpInfoHeader));
|
|
|
|
//调试板信息
|
|
for (ColorIndex = 0; ColorIndex < m_nColorTableEntries; ColorIndex++)
|
|
{
|
|
ColorMask[ColorIndex].redmask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].greenmask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].bluemask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].rgbReserved = 0;
|
|
|
|
ms.Write(StructToBytes(ColorMask[ColorIndex], Marshal.SizeOf(ColorMask[ColorIndex])), 0, Marshal.SizeOf(ColorMask[ColorIndex]));
|
|
}
|
|
|
|
//图片旋转,解决指纹图片倒立的问题
|
|
RotatePic(buffer, nWidth, nHeight, ref ResBuf);
|
|
|
|
ms.Write(ResBuf, 0, nWidth * nHeight);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// ZKCE.SysException.ZKCELogger logger = new ZKCE.SysException.ZKCELogger(ex);
|
|
// logger.Append();
|
|
}
|
|
}
|
|
|
|
/*******************************************
|
|
* 函数名称:WriteBitmap
|
|
* 函数功能:将传进来的数据保存为图片
|
|
* 函数入参:buffer---图片数据
|
|
* nWidth---图片的宽度
|
|
* nHeight---图片的高度
|
|
* 函数出参:无
|
|
* 函数返回:无
|
|
*********************************************/
|
|
public static void WriteBitmap(byte[] buffer, int nWidth, int nHeight)
|
|
{
|
|
int ColorIndex = 0;
|
|
ushort m_nBitCount = 8;
|
|
int m_nColorTableEntries = 256;
|
|
byte[] ResBuf = new byte[nWidth * nHeight];
|
|
|
|
try
|
|
{
|
|
|
|
BITMAPFILEHEADER BmpHeader = new BITMAPFILEHEADER();
|
|
BITMAPINFOHEADER BmpInfoHeader = new BITMAPINFOHEADER();
|
|
MASK[] ColorMask = new MASK[m_nColorTableEntries];
|
|
|
|
//图片头信息
|
|
BmpInfoHeader.biSize = Marshal.SizeOf(BmpInfoHeader);
|
|
BmpInfoHeader.biWidth = nWidth;
|
|
BmpInfoHeader.biHeight = nHeight;
|
|
BmpInfoHeader.biPlanes = 1;
|
|
BmpInfoHeader.biBitCount = m_nBitCount;
|
|
BmpInfoHeader.biCompression = 0;
|
|
BmpInfoHeader.biSizeImage = 0;
|
|
BmpInfoHeader.biXPelsPerMeter = 0;
|
|
BmpInfoHeader.biYPelsPerMeter = 0;
|
|
BmpInfoHeader.biClrUsed = m_nColorTableEntries;
|
|
BmpInfoHeader.biClrImportant = m_nColorTableEntries;
|
|
|
|
//文件头信息
|
|
BmpHeader.bfType = 0x4D42;
|
|
BmpHeader.bfOffBits = 14 + Marshal.SizeOf(BmpInfoHeader) + BmpInfoHeader.biClrUsed * 4;
|
|
BmpHeader.bfSize = BmpHeader.bfOffBits + ((((BmpInfoHeader.biWidth * BmpInfoHeader.biBitCount + 31) / 32) * 4) * BmpInfoHeader.biHeight);
|
|
BmpHeader.bfReserved1 = 0;
|
|
BmpHeader.bfReserved2 = 0;
|
|
|
|
Stream FileStream = File.Open("finger.bmp", FileMode.Create, FileAccess.Write);
|
|
BinaryWriter TmpBinaryWriter = new BinaryWriter(FileStream);
|
|
|
|
TmpBinaryWriter.Write(StructToBytes(BmpHeader, 14));
|
|
TmpBinaryWriter.Write(StructToBytes(BmpInfoHeader, Marshal.SizeOf(BmpInfoHeader)));
|
|
|
|
//调试板信息
|
|
for (ColorIndex = 0; ColorIndex < m_nColorTableEntries; ColorIndex++)
|
|
{
|
|
ColorMask[ColorIndex].redmask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].greenmask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].bluemask = (byte)ColorIndex;
|
|
ColorMask[ColorIndex].rgbReserved = 0;
|
|
|
|
TmpBinaryWriter.Write(StructToBytes(ColorMask[ColorIndex], Marshal.SizeOf(ColorMask[ColorIndex])));
|
|
}
|
|
|
|
//图片旋转,解决指纹图片倒立的问题
|
|
RotatePic(buffer, nWidth, nHeight, ref ResBuf);
|
|
|
|
//写图片
|
|
TmpBinaryWriter.Write(ResBuf);
|
|
|
|
FileStream.Close();
|
|
TmpBinaryWriter.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//ZKCE.SysException.ZKCELogger logger = new ZKCE.SysException.ZKCELogger(ex);
|
|
//logger.Append();
|
|
}
|
|
}
|
|
}
|
|
}
|