Dim vCode As String
Private Sub Command1_Click()
drawvc
End Sub
Private Sub drawvc() '显示校验码
Dim i, vc, px, py As Long
Dim r, g, b As Byte
Randomize '初始化随机种子
'生成随机校验码
vc = CLng(8999 * Rnd + 1000)
vCode = vc
'显示校验码
Picture1.Cls
Picture1.Print vc
'添加噪点(颤斗防止自衫晌动图像识别)
For i = 0 To 2000 '茄塌磨画2000个噪点
'画点随机位置
px = CLng(Picture1.Width * Rnd)
py = CLng(Picture1.Height * Rnd)
'画点随机颜色
r = CByte(255 * Rnd)
g = CByte(255 * Rnd)
b = CByte(255 * Rnd)
Picture1.Line (px, py)-(px + 1, py + 1), RGB(r, g, b)
Next
End Sub
Private Sub Command2_Click()
If Text1.Text = vCode Then
MsgBox ("正确")
Else
MsgBox ("错误")
drawvc
End If
End Sub
Private Sub Form_Load()
Picture1.FontSize = 12
Picture1.FontBold = True
Picture1.AutoRedraw = True
drawvc
End Sub
我不是做VC的 WIN32的函数不是太懂,这类资坦族辩料应该还是挺多的。关于放大。缩小可以这么做。放大,假设要放大一倍,一行的值是 0 1 0 0 0 0 1 0 放大之后应该就是
0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 很简单把 要是扩大1/3那穗粗么就要各3个加一个临接的点的值
缩小更不用说了0 1 0 0 0 0 1 0
就是 1 0 0 1。
这类算法很多 可以参考 ,也可以用WIN32的API进行图形放大缩小。
还有 数字判断的问题(2 3 6 8 9 0 )
2只有两个顶点
6有一个顶点,和一个连接点。
8有一个让缺连接点。
根据这种规律去想办法去比较
给你一个读bmp的类 ImgCenterDib 类使用其中的 BOOL ImgCenterDib::Read(LPCTSTR lpszPathName) 函数就可以 具体的圆笑自己研究一下这个 里面有 怎么读的。其实说vc6只能读bmp 是不对的 我也在vc6下读jpeg等格式的 如果需要我也可以贴出来
// .h文件
#ifndef _INSIDE_VISUAL_CPP_IMGCENTERDIB
#define _INSIDE_VISUAL_CPP_IMGCENTERDIB
//ImgCenterDib类,image processing center,北航图像中心编写的DIB类
//ImgCenterDib类
class ImgCenterDib
{
public:
//图像数据指针
unsigned char * m_pImgData
//图像颜色表指针
LPRGBQUAD m_lpColorTable
//每像素占的位数
int m_nBitCount
//指向DIB的指针(包含BITMAPFILEHEADER,BITMAPINFOHEADER和颜色表)
LPBYTE m_lpDib
private:
//图像信息头指针
LPBITMAPINFOHEADER m_lpBmpInfoHead
//调色板句柄
HPALETTE m_hPalette
//颜色表长度
int m_nColorTableLength
public:
//不带参数的构造函数
ImgCenterDib()
//带参数的构造函数
ImgCenterDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,unsigned char *pImgData)
//析构函数
~ImgCenterDib()
//DIB读函数
BOOL Read(LPCTSTR lpszPathName)
//DIB写函数
BOOL Write(LPCTSTR lpszPathName)
//DIB显示函数
BOOL Draw(CDC* pDC, CPoint origin, CSize size)
//逻辑调色板生成函数
void MakePalette()
//获取DIB的尺寸橘知含(宽高)
CSize GetDimensions()
//清理空间
void Empty()
//用新的数据替换当前DIB
void ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,
unsigned char *pImgData)
//计算颜色表的长度
int ComputeColorTabalLength(int nBitCount)
protected:
//图像的宽,像素为单位
int m_imgWidth
//图像的高猛盯,像素为单位
int m_imgHeight
}
#endif // _INSIDE_VISUAL_CPP_IMGCENTERDIB
//////////////////////////////////////////////////////////
//cpp文件
#include "stdafx.h"
#include "ImageCenterDib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__
#endif
/***********************************************************************
* 函数名称:
* ImgCenterDib()
*
*说明:无参数的构造函数,对成员变量进行初始化
***********************************************************************/
ImgCenterDib::ImgCenterDib()
{
m_lpDib=NULL//初始化m_lpDib为空。
m_lpColorTable=NULL//颜色表指针为空
m_pImgData=NULL // 图像数据指针为空
m_lpBmpInfoHead=NULL// 图像信息头指针为空
m_hPalette = NULL//调色板为空
}
/***********************************************************************
* 函数名称:
* ImgCenterDib()
*
*函数参数:
* CSize size -图像大小(宽、高)
* int nBitCount -每像素所占位数
* LPRGBQUAD lpColorTable -颜色表指针
* unsigned char *pImgData -位图数据指针
*
*返回值:
* 无
*
*说明:本函数为带参数的构造函数,给定位图的大小、每像素位数、颜色表
* 及位图数据等信息,创建ImgCenterDib类的对象
***********************************************************************/
ImgCenterDib::ImgCenterDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,
unsigned char *pImgData)
{
//如果没有位图数据传入,我们认为是空的DIB,此时不分配DIB内存
if(pImgData==NULL){
m_lpDib=NULL
m_lpColorTable=NULL
m_pImgData=NULL
m_lpBmpInfoHead=NULL
m_hPalette = NULL
}
else{//如果有位图数据传入
//图像的宽、高、每像素位数等成员变量赋值
m_imgWidth=size.cx
m_imgHeight=size.cy
m_nBitCount=nBitCount
//根据每像素位数,计算颜色表长度
m_nColorTableLength=ComputeColorTabalLength(nBitCount)
//每行像素所占字节数,必须扩展成4的倍数
int lineByte=(m_imgWidth*nBitCount/8+3)/4*4
//位图数据缓冲区的大小(图像大小)
int imgBufSize=m_imgHeight*lineByte
//为m_lpDib一次性分配内存,生成DIB结构
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize]
//填写BITMAPINFOHEADER结构
m_lpBmpInfoHead = (LPBITMAPINFOHEADER) m_lpDib
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER)
m_lpBmpInfoHead->biWidth = m_imgWidth
m_lpBmpInfoHead->biHeight = m_imgHeight
m_lpBmpInfoHead->biPlanes = 1
m_lpBmpInfoHead->biBitCount = m_nBitCount
m_lpBmpInfoHead->biCompression = BI_RGB
m_lpBmpInfoHead->biSizeImage = 0
m_lpBmpInfoHead->biXPelsPerMeter = 0
m_lpBmpInfoHead->biYPelsPerMeter = 0
m_lpBmpInfoHead->biClrUsed = m_nColorTableLength
m_lpBmpInfoHead->biClrImportant = m_nColorTableLength
//调色板句柄初始化为空,有颜色表时,MakePalette()函数要创建新的逻辑调色板
m_hPalette = NULL
if(m_nColorTableLength!=0){ //若有颜色表,则将颜色表拷贝进DIB的颜色表位置
//用m_lpColorTable指向DIB颜色表的起始位置
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER))
//颜色表拷贝
memcpy(m_lpColorTable,lpColorTable,
sizeof(RGBQUAD) * m_nColorTableLength)
//创建逻辑调色板
MakePalette()
}
//用m_pImgData指向DIB位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) * m_nColorTableLength
//拷贝图像数据进DIB位图数据区
memcpy(m_pImgData,pImgData,imgBufSize)
}
}
/***********************************************************************
* 函数名称:
* ~ImgCenterDib()
*
*说明:析构函数,释放资源
***********************************************************************/
ImgCenterDib::~ImgCenterDib()
{
//释放m_lpDib所指向的内存缓冲区
if(m_lpDib != NULL)
delete [] m_lpDib
//如果有调色板,释放调色板
if(m_hPalette != NULL)
::DeleteObject(m_hPalette)
}
/***********************************************************************
* 函数名称:
* Draw()
*
*函数参数:
* CDC* pDC -设备环境指针
* CPoint origin -显示矩形区域的左上角
* CSize size -显示矩形区域的尺寸
*
*返回值:
* 0为失败,1为成功
*
*说明:给定设备环境指针,以及需要显示的矩形区域在设备环境中的位置
* 将m_lpDib所指向的DIB显示出来
***********************************************************************/
BOOL ImgCenterDib::Draw(CDC* pDC, CPoint origin, CSize size)
{
//旧的调色板句柄
HPALETTE hOldPal=NULL
//如果DIB为空,则返回0
if(m_lpDib == NULL) return FALSE
//如果DIB有调色板,则选进设备环境中
if(m_hPalette != NULL) {
hOldPal=::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE)
}
//设置位图伸缩模式
pDC->SetStretchBltMode(WHITEONBLACK)
//将DIB在pDC所指向的设备上进行显示
::StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,
0, 0, m_lpBmpInfoHead->biWidth, m_lpBmpInfoHead->biHeight,m_pImgData,
(LPBITMAPINFO)m_lpBmpInfoHead, DIB_RGB_COLORS, SRCCOPY)
//恢复旧的调色板
if(hOldPal!=NULL)
::SelectPalette(pDC->GetSafeHdc(), hOldPal, TRUE)
//函数返回
return TRUE
}
/***********************************************************************
* 函数名称:
* Read()
*
*函数参数:
* LPCTSTR lpszPathName -文件名字及路径
*
*返回值:
* 0为失败,1为成功
*
*说明:给定一个图像文件名及其路径,分配内存,读取图像数据进内存生成DIB,
* 并存放在m_lpDib所指向的缓冲区
***********************************************************************/
BOOL ImgCenterDib::Read(LPCTSTR lpszPathName)
{
//读模式打开图像文件
CFile file
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite))
return FALSE
BITMAPFILEHEADER bmfh
try {
//清理空间
Empty()
//读取BITMAPFILEHEADER结构到变量bmfh中
int nCount=file.Read((LPVOID)&bmfh, sizeof(BITMAPFILEHEADER))
//异常判断
if(nCount != sizeof(BITMAPFILEHEADER)) {
throw new CException
}
if(bmfh.bfType != 0x4d42) {
throw new CException
}
//为m_lpDib分配空间,读取DIB进内存
if(m_lpDib!=NULL)
delete []m_lpDib
m_lpDib=new BYTE[file.GetLength() -sizeof(BITMAPFILEHEADER)]
file.Read(m_lpDib, file.GetLength() -sizeof(BITMAPFILEHEADER))
//m_lpBmpInfoHead位置为m_lpDib起始位置
m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib
//为成员变量赋值
m_imgWidth=m_lpBmpInfoHead->biWidth
m_imgHeight=m_lpBmpInfoHead->biHeight
m_nBitCount=m_lpBmpInfoHead->biBitCount
//计算颜色表长度
m_nColorTableLength=ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount)
if(m_nColorTableLength==-1) return FALSE
//生成逻辑调色板
m_hPalette = NULL
if(m_nColorTableLength!=0){
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER))
MakePalette()
}
//m_pImgData指向DIB的位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength
}
catch(CException* pe) {
AfxMessageBox("Read error")
pe->Delete()
return FALSE
}
//函数返回
return TRUE
}
/***********************************************************************
* 函数名称:
* Write()
*
*函数参数:
* LPCTSTR lpszPathName -指定图像文件名字及路径
*
*返回值:
* 0为失败,1为成功
*
*说明:给定一个图像文件名及其路径,将m_lpDib指向的DIB数据存盘
***********************************************************************/
BOOL ImgCenterDib::Write(LPCTSTR lpszPathName)
{
//写模式打开文件
CFile file
if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite
| CFile::shareExclusive))
return FALSE
//填写文件头结构
BITMAPFILEHEADER bmfh
bmfh.bfType = 0x4d42 // 'BM'
bmfh.bfSize = 0
bmfh.bfReserved1 = bmfh.bfReserved2 = 0
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength
try {
//文件头结构写进文件
file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER))
//文件信息头结构写进文件
file.Write(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER))
//如果有颜色表的话,颜色表写进文件
if(m_nColorTableLength!=0)
file.Write(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength)
//位图数据写进文件
int imgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight
file.Write(m_pImgData, imgBufSize)
}
catch(CException* pe) {
pe->Delete()
AfxMessageBox("write picture error")
return FALSE
}
//函数返回
return TRUE
}
/***********************************************************************
* 函数名称:
* ReplaceDib()
*
*函数参数:
* CSize size -要替换的新图像尺寸
* int nBitCount -每像素的位数
* LPRGBQUAD lpColorTable -颜色表指针
* unsigned char *pImgData -位图数据的指针
*返回值:
* 无
*
*说明:给定新图像的尺寸、每像素位数、颜色表、及位图数据等信息,将m_lpDib
* 所指向的现有的DIB替换成新的DIB
***********************************************************************/
void ImgCenterDib::ReplaceDib(CSize size, int nBitCount,
LPRGBQUAD lpColorTable,unsigned char *pImgData)
{
//释放原DIB所占空间
Empty()
//成员变量赋值
m_imgWidth=size.cx
m_imgHeight=size.cy
m_nBitCount=nBitCount
//计算颜色表的长度
m_nColorTableLength=ComputeColorTabalLength(nBitCount)
//每行像素所占字节数,扩展成4的倍数
int lineByte=(m_imgWidth*nBitCount/8+3)/4*4
//位图数据的大小
int imgBufSize=m_imgHeight*lineByte
//为m_lpDib重新分配空间,以存放新的DIB
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize]
//填写位图信息头BITMAPINFOHEADER结构
m_lpBmpInfoHead = (LPBITMAPINFOHEADER) m_lpDib
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER)
m_lpBmpInfoHead->biWidth = m_imgWidth
m_lpBmpInfoHead->biHeight = m_imgHeight
m_lpBmpInfoHead->biPlanes = 1
m_lpBmpInfoHead->biBitCount = m_nBitCount
m_lpBmpInfoHead->biCompression = BI_RGB
m_lpBmpInfoHead->biSizeImage = 0
m_lpBmpInfoHead->biXPelsPerMeter = 0
m_lpBmpInfoHead->biYPelsPerMeter = 0
m_lpBmpInfoHead->biClrUsed = m_nColorTableLength
m_lpBmpInfoHead->biClrImportant = m_nColorTableLength
//调色板置空
m_hPalette = NULL
//如果有颜色表,则将颜色表拷贝至新生成的DIB,并生成调色板
if(m_nColorTableLength!=0){
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER))
memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD) * m_nColorTableLength)
MakePalette()
}
//m_pImgData指向DIB的位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) * m_nColorTableLength
//将新位图数据拷贝至新的DIB中
memcpy(m_pImgData,pImgData,imgBufSize)
}
/***********************************************************************
* 函数名称:
* ComputeColorTabalLength()
*
*函数参数:
* int nBitCount -DIB每像素位数
*
*返回值:
* 颜色表的长度
*
*说明:给定每像素的位数,计算出DIB颜色表的长度,颜色表长度
* 为2的nBitCount次幂,但是24位位图颜色表长度为0
***********************************************************************/
int ImgCenterDib::ComputeColorTabalLength(int nBitCount)
{
int colorTableLength=-1
switch(nBitCount) {
case 1:
colorTableLength = 2
break
case 4:
colorTableLength = 16
break
case 8:
colorTableLength = 256
break
case 16:
case 24:
case 32:
colorTableLength = 0
break
default:
break
// ASSERT(FALSE)
}
// ASSERT((colorTableLength >= 0) &&(colorTableLength <= 256))
return colorTableLength
}
/***********************************************************************
* 函数名称:
* MakePalette()
*
*函数参数:
* 无
*
*返回值:
* 无
*
*说明:根据DIB的颜色表,生成一个逻辑调色板(m_hPalette),
* 该调色板在显示位图时将被选进设备环境中
***********************************************************************/
void ImgCenterDib::MakePalette()
{
// makes a logical palette (m_hPalette) from the DIB's color table
// this palette will be selected and realized prior to drawing the DIB
//如果颜色表长度为0,则不生成逻辑调色板
if(m_nColorTableLength == 0)
return
//删除旧的调色板对象
if(m_hPalette != NULL) ::DeleteObject(m_hPalette)
//申请缓冲区,生成逻辑调色板
LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) +
m_nColorTableLength * sizeof(PALETTEENTRY)]
pLogPal->palVersion = 0x300
pLogPal->palNumEntries = m_nColorTableLength
LPRGBQUAD m_lpDibQuad = (LPRGBQUAD) m_lpColorTable
for(int i = 0i <m_nColorTableLengthi++) {
pLogPal->palPalEntry[i].peRed = m_lpDibQuad->rgbRed
pLogPal->palPalEntry[i].peGreen = m_lpDibQuad->rgbGreen
pLogPal->palPalEntry[i].peBlue = m_lpDibQuad->rgbBlue
pLogPal->palPalEntry[i].peFlags = 0
m_lpDibQuad++
}
//创建逻辑调色板
m_hPalette = ::CreatePalette(pLogPal)
//释放缓冲区
delete pLogPal
}
/***********************************************************************
* 函数名称:
* Empty()
*
*函数参数:
* 无
*
*返回值:
* 无
*
*说明:清理空间
***********************************************************************/
void ImgCenterDib::Empty()
{
//释放m_lpDib所指向的缓冲区
if(m_lpDib != NULL) {
delete [] m_lpDib
m_lpDib=NULL
m_lpColorTable=NULL
m_pImgData=NULL
m_lpBmpInfoHead=NULL
}
//释放逻辑调色板缓冲区
if(m_hPalette != NULL){
::DeleteObject(m_hPalette)
m_hPalette = NULL
}
}
/***********************************************************************
* 函数名称:
* GetDimensions()
*
*函数参数:
* 无
*
*返回值:
* 图像的尺寸,用CSize类型表达
*
*说明:返回图像的宽和高
***********************************************************************/
CSize ImgCenterDib::GetDimensions()
{
if(m_lpDib == NULL) return CSize(0, 0)
return CSize(m_imgWidth, m_imgHeight)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)