// yuanshiDoc.cpp : implementation of the CYuanshiDoc class
#include "stdafx.h"
#include "yuanshi.h"
#include "math.h"
#include "yuanshiDoc.h"
#include "QueRen.h"
#include "string.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CYuanshiDoc
IMPLEMENT_DYNCREATE(CYuanshiDoc, CDocument)
BEGIN_MESSAGE_MAP(CYuanshiDoc, CDocument)
//{{AFX_MSG_MAP(CYuanshiDoc)
ON_COMMAND(ID_TuBiao, OnTuBiao)//生成图片的图标,用于显示
ON_COMMAND(ID_Key, OnKey)//生成关键字特征
ON_COMMAND(ID_YanSe, OnYanSe)//生成颜色特征
ON_COMMAND(ID_IMAGEA_OPEN, OnImageOpen)//打开一幅图片
ON_COMMAND(ID_Next, OnNext)//显示下一页检索出的图片
ON_COMMAND(ID_RetrieveIn, OnRetrieveIn)//进行检索
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CYuanshiDoc construction/destruction
CYuanshiDoc::CYuanshiDoc()
{
// TODO: add one-time construction code here
Re_Num = 0;//检索出的图片的数量初值
Re_NumPage = 0;//检索结果显示的页号初值
strFilePath = "e:\\wenlipic\\";//图像库存放的路径名
Re_Name=new CString [Re_MaxNum];//检索出的图片名字
}
CYuanshiDoc::~CYuanshiDoc()
{
delete [] Re_Name;
}
BOOL CYuanshiDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CYuanshiDoc serialization
void CYuanshiDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CYuanshiDoc diagnostics
#ifdef _DEBUG
void CYuanshiDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CYuanshiDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CYuanshiDoc commands
void CYuanshiDoc::OnTuBiao()
{
// TODO: Add your command handler code here
//生成图片的图标,用于显示
CQueRen dlg;
if(dlg.DoModal()==IDOK)
{//使对话框可以弹出,确认需要执行下面程序
char fname[Pic_Num][10];//图像名
char tname[Pic_Num+1][12];//图标名
int Row,Col,Rowi,Coli;//图像的长和宽
unsigned char *ImageR,*ImageG,*ImageB,*Fheadc;//图像
unsigned char *ImageRic,*ImageGic,*ImageBic,*Fheadcic;//图标
int b,bb,bbb,bbbb,bbbbb;
ImageRic=new unsigned char [200*200];
ImageGic=new unsigned char [200*200];
ImageBic=new unsigned char [200*200];//图标的大小200×150
Fheadcic=(unsigned char*)malloc(54*sizeof(unsigned char));//固定格式,得到图像的格式信息
if (!ReadColorImage("icon.bmp",&Rowi,&Coli,
ImageRic,ImageGic,ImageBic,Fheadcic))//读入图标模型,用于生成同样大小的图标
{
printf("The files icon does not exist!\n");
exit(0);
}
ImageR=(unsigned char*)malloc(600*500*sizeof(unsigned char));
ImageG=(unsigned char*)malloc(600*500*sizeof(unsigned char));
ImageB=(unsigned char*)malloc(600*500*sizeof(unsigned char));
Fheadc=(unsigned char*)malloc(54*sizeof(unsigned char));
for(b=0;b<Pic_Num;b++)
{
bb=b%10000;
bbb=bb%1000;
bbbb=bbb%100;
bbbbb=bbbb%10;
fname[b][0]=48+(b-bb)/10000;
fname[b][1]=48+(bb-bbb)/1000;
fname[b][2]=48+(bbb-bbbb)/100;
fname[b][3]=48+(bbbb-bbbbb)/10;
fname[b][4]=48+bbbbb;
fname[b][5]='.';fname[b][6]='b';fname[b][7]='m';fname[b][8]='p';
fname[b][9]='\0';//图像名
tname[b][0]='T';tname[b][1]='B';
tname[b][2]=48+(b-bb)/10000;
tname[b][3]=48+(bb-bbb)/1000;
tname[b][4]=48+(bbb-bbbb)/100;
tname[b][5]=48+(bbbb-bbbbb)/10;
tname[b][6]=48+bbbbb;
tname[b][7]='.';tname[b][8]='b';tname[b][9]='m';tname[b][10]='p';
tname[b][11]='\0';//图标名
if (!ReadColorImage(fname[b],&Row,&Col,
ImageR,ImageG,ImageB,Fheadc))//读入图像
{
printf("The files %s does not exist!\n",fname[b]);
exit(0);
}
RGBtoRiGiBi(Row,Col,ImageR,ImageG,ImageB,Rowi,Coli,ImageRic,ImageGic,ImageBic);
//图像转换到图标
SaveiconImage(tname[b],Rowi,Coli,Fheadcic,ImageRic,ImageGic,ImageBic);
//保存图标图像
}
free(ImageR);free(ImageG);free(ImageB); free(Fheadc);
free(ImageRic);free(ImageGic);free(ImageBic); free(Fheadcic);
AfxMessageBox("完成");
}
}//将 Pic_Num 幅图像库中的图片生成图标并保存
int CYuanshiDoc::ReadColorImage(CString FileName, int *Row, int *Col, unsigned char *BufR, unsigned char *BufG,
unsigned char *BufB,unsigned char *Fhead)
{
unsigned long Index=0;
int i,j,k;
FILE *ImageDataFile;
if((ImageDataFile=fopen(strFilePath+FileName,"rb"))==NULL)
return(0);
for(i=0; i<54; i++)
Fhead[i]=fgetc(ImageDataFile);
*Col=Fhead[19]*256+Fhead[18];//得到图像长度
*Row=Fhead[23]*256+Fhead[22];//得到图像宽度
k=4-(*Col)*3%4;
if(k==4) k=0;//固定格式
for(i=0;i<(*Row);i++)
{
for(j=0;j<(*Col);j++,Index++)
{
BufB[Index]=fgetc(ImageDataFile);//得到每个像素的B值
BufG[Index]=fgetc(ImageDataFile);//得到每个像素的G值
BufR[Index]=fgetc(ImageDataFile);//得到每个像素的R值
}
for(j=1;j<=k;j++) fgetc(ImageDataFile);//固定格式,去除多余象素
}
fclose(ImageDataFile);
return(1);
}//读入彩色图像并且得到长度和宽度
int CYuanshiDoc::RGBtoRiGiBi(int Row,int Col,unsigned char *ImageR,unsigned char *ImageG,
unsigned char *ImageB,int Rowi,int Coli,unsigned char *ImageRi,
unsigned char *ImageGi,unsigned char *ImageBi)
{
int m1,m2,i,j,x,y;
unsigned long Index=0;
m1=Row/Rowi;
m2=Col/Coli;
for (i=0,y=0;i<Row/m1;i++,y+=m1)
{
for (j=0,x=0;j<Col/m2;j++,Index++,x+=m2)
{
ImageRi[Index]=ImageR[y*Col+x];
ImageGi[Index]=ImageG[y*Col+x];
ImageBi[Index]=ImageB[y*Col+x];
}
}
return (1);
}//将图片生成图标,600*450到200*150大小
int CYuanshiDoc::SaveiconImage(CString FileName,int Row,int Col, unsigned char *Fhead, unsigned char *BufR,
unsigned char *BufG, unsigned char *BufB)
{
int Index=0;
int i,j,k;
FILE *ImageDataFile;
k=4-Col*3%4;
if (k==4) k=0;
if((ImageDataFile=fopen(strFilePath+FileName,"wb"))==NULL)
return(0);
for(i=0; i<54; i++)
fputc(Fhead[i],ImageDataFile);
for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++,Index++)
{
fputc(BufB[Index],ImageDataFile);
fputc(BufG[Index],ImageDataFile);
fputc(BufR[Index],ImageDataFile);
}
for(j=1;j<=k;j++) fputc(0,ImageDataFile);
}
fclose(ImageDataFile);
return(1);
}//保存图标图像
void CYuanshiDoc::OnKey()
{
// TODO: Add your command handler code here
//生成图像库的关键字特征文档
CQueRen dlg;
if(dlg.DoModal()==IDOK)
{//使对话框可以弹出,确认需要执行下面程序
struct Pic_KeyType Pic_Key[Pic_Num];
int k;
int bb,bbb,bbbb,bbbbb;
for(k=0; k<Pic_Num; k++)
{
bb=k%10000;
bbb=bb%1000;
bbbb=bbb%100;
bbbbb=bbbb%10;
Pic_Key[k].Name[0]=48+(k-bb)/10000;
Pic_Key[k].Name[1]=48+(bb-bbb)/1000;
Pic_Key[k].Name[2]=48+(bbb-bbbb)/100;
Pic_Key[k].Name[3]=48+(bbbb-bbbbb)/10;
Pic_Key[k].Name[4]=48+bbbbb;
Pic_Key[k].Name[5]='.';Pic_Key[k].Name[6]='b';
Pic_Key[k].Name[7]='m';Pic_Key[k].Name[8]='p';
Pic_Key[k].Name[9]='\0';
}//生成图片名字
FILE *fp;
if ((fp=fopen(strFilePath+"key文档-图片名.txt","wb"))==NULL) exit(0);
fwrite(Pic_Key,sizeof(Pic_KeyType)*Pic_Num,1,fp);//写入
fclose(fp); //特征写入文件
AfxMessageBox("完成");
}
}//将Pic_Num幅图像库中的图片提取关键字特征,并存入文本文档
void CYuanshiDoc::OnYanSe()
{
// TODO: Add your command handler code here
//生成图像库的颜色特征文档
CQueRen d