1 /********************************************************************************************************* 2 ** Function name: epcCamGetRgbFrame 3 ** Descriptions: 本函数用于获取RGB通道的图像的数据缓存区地址 4 ** input parameters: prAddInfo 存放获取的地址,注意访问该地址的图像数据时候使用SetKMode(TRUE) 5 ** output parameters: 无 6 ** Returned value: TRUE:成功;FALSE:失败 7 *********************************************************************************************************/ 8 9 10 11 12 13 EpcsCam::EpcsCam(void)14 {15 hDLL=LoadLibrary(CString("\\FlashDisk2\\epcCameraLib.dll"));//加载动态链接库MyDll.dll文件;16 17 18 19 }20 21 EpcsCam::~EpcsCam(void)22 {23 FreeLibrary(hDLL);//卸载MyDll.dll文件;24 }25 26 27 28 BOOL EpcsCam::epcCamCapture (BOOL bIsRGB, BOOL bIsYUV)29 { 30 BOOL bCaptureSucced=FALSE; 31 pEpcCamCapture epcCamCapture =NULL; 32 epcCamCapture=(pEpcCamCapture)GetProcAddress(hDLL,CString("epcCamCapture"));33 if (epcCamCapture)34 {35 bCaptureSucced=epcCamCapture(bIsRGB,bIsYUV);36 }37 return bCaptureSucced;38 }39 40 41 BOOL EpcsCam::epcCamPreviewOn (DWORD dwXSize, DWORD dwYSize)42 { 43 BOOL bPreviewOnSucced=FALSE;44 pEpcCamPreviewOn epcCamPreviewOn =NULL; 45 epcCamPreviewOn=(pEpcCamPreviewOn)GetProcAddress(hDLL,CString("epcCamPreviewOn"));46 if (epcCamPreviewOn)47 {48 bPreviewOnSucced=epcCamPreviewOn(dwXSize,dwYSize);49 }50 return bPreviewOnSucced;51 }52 53 54 55 BOOL EpcsCam::epcCamSetImage (IMAGE_SIZE* pImageSize)56 {57 BOOL bSetImageSucced=FALSE;58 pEpcCamSetImage epcCamSetImage =NULL; 59 epcCamSetImage=(pEpcCamSetImage)GetProcAddress(hDLL,CString("epcCamSetImage"));60 if (epcCamSetImage)61 {62 bSetImageSucced=epcCamSetImage(pImageSize);63 }64 return bSetImageSucced;65 }66 67 68 BOOL EpcsCam::epcCamGetRgbFrame (PINGPONG_PR *prAddInfo)69 {70 BOOL betRgbFrameSucced=FALSE;71 pEpcCamGetRgbFrame epcCamGetRgbFrame =NULL;72 epcCamGetRgbFrame=(pEpcCamGetRgbFrame)GetProcAddress(hDLL,CString("epcCamGetRgbFrame"));73 if (epcCamGetRgbFrame)74 {75 betRgbFrameSucced=epcCamGetRgbFrame(prAddInfo);76 }77 return betRgbFrameSucced;78 }
1.2保存位图和保存异常日志等文件操作
FileOperate.h
1 #pragma once 2 3 class FileOperate 4 { 5 public: 6 FileOperate(void); 7 ~FileOperate(void); 8 9 10 public:11 static void WriteLogMsg(char chLogMsg[]);12 static CString GetTimeTag();13 14 #if 115 16 static void WriteBin(char chBin[]);17 //根据数据保存图片18 static BOOL bmpSaveImage (PTSTR pstrFileName, BITMAPFILEHEADER * pbmfh);19 20 // 保存位图21 static void SaveBitMap(void);22 static CString SaveBmp(char *pcBmpData,char *bmpFileData);23 static CString SaveBmp0(BYTE *pcBmpData);//C++调用的函数24 25 #endif26 27 public:28 static void ImageConvertDemo(29 BYTE *pInBmp565Data,//输入的RGB565位图的数据实体部分(不包括文件头等信息)30 DWORD dwBitMapDataSize,//位图数据实体长度(不包括文件头等信息)31 BYTE **ppOutMallocData,//传出的JPG图片数据实体的指针32 DWORD * pdwOutJpegMemSize,//传出的JPG图片数据的大小33 int * pState //状态码:记录在执行此函数的过程中可能出现的问题34 //char *bmpFileData35 );36 37 38 };
FileOperate.cpp
1 #include "StdAfx.h" 2 #include "FileOperate.h" 3 4 //#include "epccameralib.h" 5 6 7 #include "initguid.h "//如果不引用此头文件,就会出现 无法解析外部符号的错误 8 #include "IImageDemo.h"//图片转码测试 9 10 FileOperate::FileOperate(void) 11 { 12 } 13 14 FileOperate::~FileOperate(void) 15 { 16 } 17 18 19 20 21 void FileOperate::WriteLogMsg(char chLogMsg[]) 22 { 23 char strFilePath[40] = "\\FlashDisk2\\Log\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。 24 char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候,要比实际长度多1,作为结尾符号 25 26 27 SYSTEMTIME sysTime; 28 GetLocalTime( &sysTime ); //得到系统时间 29 30 31 //sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21" 32 33 strcpy(strTimeFileName,"ErrorLog"); 34 strcat(strTimeFileName,".txt");//加上扩展名--登录日志 35 strcat(strFilePath,strTimeFileName);//得到完整的路径名 36 37 38 FILE *fp;//文件指针 39 40 if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西 41 { 42 //如果打开不成功,则一般表示没有Log目录 43 //创建Log目录,然后再重新打开--一般情况下,如果目录存在的话,就不会创建成功的。 44 if(!CreateDirectory(_T("\\FlashDisk2\\Log"),NULL)) 45 { //创建目录失败 46 //printf("Create Directory failed!\n"); 47 return; 48 }else 49 { 50 //printf("Create Directory succeed!\n");//cout << "OK" <<endl; 51 52 if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文本文件中写东西 53 { 54 //printf("Open Failed\n"); 55 //exit(0); 56 return; 57 } 58 } 59 } 60 61 char strTimeTag[30];//="2010-09-21"; //将时间转成字符串 62 sprintf(strTimeTag,"%d-%d-%d %d:%d:%d ",sysTime.wYear,sysTime.wMonth,sysTime.wDay, 63 sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21" 64 65 //strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&tim);//年月日时间字符串--作为登录日志中信息的时间标记头 66 67 68 fputs(strTimeTag,fp);//写入时间标记 69 fputs("# ",fp);//分隔符号 70 fputs(chLogMsg,fp);//写入消息日志 71 fputs("\n",fp);//换行 72 73 int i=fclose(fp); 74 75 if (i==0) 76 { 77 //printf("succeed!\n"); 78 }else 79 { 80 //printf("fail!\n"); 81 } 82 } 83 84 CString FileOperate::GetTimeTag() 85 { 86 87 CString strTimetag; 88 89 SYSTEMTIME sysTime; 90 GetLocalTime( &sysTime ); //得到系统时间 91 92 strTimetag.Format(_T("%d%d%d-%d%d%d"),sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond); 93 //sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21" 94 return strTimetag; 95 96 } 97 98 #if 1 99 100 101 void FileOperate::WriteBin(char chBin[])102 {103 char strFilePath[40] = "\\FlashDisk2\\Bins\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。104 char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候,要比实际长度多1,作为结尾符号105 106 107 SYSTEMTIME sysTime;108 GetLocalTime( &sysTime ); //得到系统时间109 //sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21"110 111 112 sprintf(strTimeFileName,"%d%d%d-%d%d%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,113 sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"114 115 strcat(strTimeFileName,".bins");//加上扩展名--登录日志116 strcat(strFilePath,strTimeFileName);//得到完整的路径名117 118 119 FILE *fp;//文件指针120 121 if ((fp=fopen(strFilePath,"wb+"))==NULL)//以追加的形式往二进制文件中写东西122 {123 //如果打开不成功,则一般表示没有Log目录124 //创建Log目录,然后再重新打开--一般情况下,如果目录存在的话,就不会创建成功的。125 if(!CreateDirectory(_T("\\FlashDisk2\\Bins"),NULL))126 {127 printf("Create Directory failed!\n");128 }else129 {130 printf("Create Directory succeed!\n");//cout << "OK" <<endl;131 132 if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西133 {134 printf("Open Failed\n");135 exit(0);136 }137 }138 }139 140 char strTimeTag[30];//="2010-09-21"; //将时间转成字符串141 sprintf(strTimeTag,"%d-%d-%d %d:%d:%d ",sysTime.wYear,sysTime.wMonth,sysTime.wDay,142 sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"143 144 //strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&tim);//年月日时间字符串--作为登录日志中信息的时间标记头145 146 147 //fputs(strTimeTag,fp);//写入时间标记148 //fputs(" : ",fp);//分隔符号149 //fputs(chLogMsg,fp);//写入消息日志150 //fputs("\n",fp);//换行151 152 fputs(chBin,fp);153 int i=fclose(fp);154 155 if (i==0)156 {157 printf("succeed!\n"); 158 }else159 {160 printf("fail!\n"); 161 }162 }163 164 165 166 167 168 169 // 保存位图--最原来的模型170 void FileOperate::SaveBitMap(void)171 {172 // TODO: Add your control notification handler code here173 IMAGE_SIZE tDispSize = {0};174 DWORD dwPreMode;175 PINGPONG_PR DataAddr;176 BITMAPFILEHEADER *pFileHead = NULL; /* 位图文件的头指针 */177 BITMAPINFO *pBmpInfo = NULL; /* 位图信息的指针 */178 char *pcBmpData = NULL; /* 位图数据区的指针 */179 DWORD dwImgeX; /* 位图水平像素 */180 DWORD dwImgeY; /* 位图垂直像素 */181 182 DWORD dwFileHeadSize = sizeof(BITMAPFILEHEADER); /* 位图文件的头区域大小 */183 DWORD dwInfoSize = sizeof(BITMAPINFO) + 4 * 2; /* 位图文件的信息区大小 */184 DWORD dwBipMapSize; /* 位图文件的数据区大小 */185 CString cstrPathname;186 187 cstrPathname="\\test.bmp";188 189 dwImgeX = 320;190 dwImgeY = 240;191 192 dwBipMapSize = 2 * dwImgeX * dwImgeY; /* 文件头指针指向整个位图的空间 320*240*2/1024 =150K*/193 pFileHead = (BITMAPFILEHEADER*)malloc(dwFileHeadSize + dwInfoSize + dwBipMapSize);194 pBmpInfo = (BITMAPINFO *)malloc(dwInfoSize);195 196 pFileHead->bfOffBits = dwFileHeadSize + dwInfoSize; /* 以下为填充位图的空间 */197 pFileHead->bfSize = dwFileHeadSize + dwInfoSize + dwBipMapSize;198 pFileHead->bfType = 0x4D42;199 200 pcBmpData = (char *) pFileHead + pFileHead->bfOffBits;201 202 pBmpInfo->bmiHeader.biHeight = 0 - (signed)dwImgeY;203 pBmpInfo->bmiHeader.biWidth = dwImgeX ; 204 pBmpInfo->bmiHeader.biBitCount = 16;205 pBmpInfo->bmiHeader.biClrImportant = 0;206 pBmpInfo->bmiHeader.biClrUsed = 0;207 pBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;208 //pBmpInfo->bmiHeader.biCompression = BI_RGB;209 pBmpInfo->bmiHeader.biPlanes = 1;210 pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);211 pBmpInfo->bmiHeader.biSizeImage = dwBipMapSize;212 213 pBmpInfo->bmiColors[0].rgbBlue = 0x00;214 pBmpInfo->bmiColors[0].rgbGreen = 0xF8;215 pBmpInfo->bmiColors[0].rgbRed = 0x00;216 pBmpInfo->bmiColors[0].rgbReserved = 0x00;217 pBmpInfo->bmiColors[1].rgbBlue = 0xE0;218 pBmpInfo->bmiColors[1].rgbGreen = 0x07;219 pBmpInfo->bmiColors[1].rgbRed = 0x00;220 pBmpInfo->bmiColors[1].rgbReserved = 0x00;221 pBmpInfo->bmiColors[2].rgbBlue = 0x1F;222 pBmpInfo->bmiColors[2].rgbGreen = 0x00;223 pBmpInfo->bmiColors[2].rgbRed = 0x00;224 pBmpInfo->bmiColors[2].rgbReserved = 0x00;225 226 memcpy((void*)(pFileHead + 1), (void*)pBmpInfo, dwInfoSize);227 228 229 //最后将RGB565的图片数据全部COPY到pcBmpData中了----这里可以通过读文件的形式将这些数据读上来。!!!!!!230 //只需要在此处将那个RGB565的文件用二进制的格式读进来就OK了!!!231 CFile hFile;232 hFile.Open(_T("\\2010-9-23.bins"),CFile::modeRead);233 hFile.Read(pcBmpData,dwBipMapSize);234 235 bmpSaveImage((PTSTR)cstrPathname.GetBuffer(0), pFileHead); /* 保存成BMP图片 */236 cstrPathname.ReleaseBuffer();237 238 free(pFileHead);239 free(pBmpInfo);240 hFile.Close();//关闭文件241 242 }
来源:https://www.cnblogs.com/elect-fans/archive/2011/12/27/2408593.html