WinCE平台下BMP转JPG代码备份2

风格不统一 提交于 2020-02-17 14:31:16
 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 }



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!