这大概是一年前做的事情了,当时的项目要求在WinCE平台下BMP转JPG,然后自己折腾了好几个月才终于搞定,现在时间过去了快一年了,估计自己今后再也不会碰WinCE相关的东西了吧,而且也准备把相关的学习笔记和代码项目全部删除掉。这些没有经过整理过的东西,放在电脑上也是垃圾,还不如整理一下,放到网上,让有需要的同学借鉴参考一下吧。
开发环境:VS2005
开发平台:EPC6960 WinCE开发板
主要目标:在WinCE平台下完成BMP图片转JPG
实现方法:使用C++编写转换的DLL文件,使用C#编写界面,然后调用DLL
代码涉及知识点:
1.DLL的创建。
2.函数传入参数,传出参数。
3.位图格式。
4.位图的位运算及格式转换。
5.文件操作。
6.DLL的调用
7.……
一、图片格式转换的DLL项目
//****************************
//**WinCeCppCamDll项目
//**本项目中引用了 开发板公司提供的摄像头驱动DLL文件一个
//****************************
1.1导入和引用DLL中的参数
EpcsCam.h
view sourceprint?#pragma once
/*
* 对应CAM_IOCTL_SAMSUNG_CAM_PR,打开RGB通道后,从uiRGB_Addr中获取视频图像数据,注意访问uiRGB_Addr时,
* 必须采用内核模式(kernel mode),使用函数 SetKMode(TRUE),并在读取uiRGB_Addr后设置flag = 0, 如果有下
* 一帧数据来时,底层会将flag设为1,并设置uiRGB_Addr。这样方便读取每一帧数据
*/
typedef struct __PINGPONG_PR
{
unsigned int uiRGB_Addr;
unsigned char flag; /* 为1时候,视频数据有效 */
} PINGPONG_PR;
/*
* 对应CAM_IOCTL_SAMSUNG_CAM,打开YUV通道后,从uiY_Addr, uiCb_Addr, uiCr_Addr中获取视频图像数据,注意访
* 问三个地址时,必须采用内核模式(kernel mode),使用函数 SetKMode(TRUE),并在读取地址数据后设置flag = 0,
* 如果有下一帧数据来时,底层会将flag设为1,并设置YUV三个地址值。这样方便读取每一帧数据
*/
typedef struct PINGPONG
{
unsigned int uiY_Addr;
unsigned int uiCb_Addr;
unsigned int uiCr_Addr;
unsigned char flag;
} PINGPONG;
/*
* 此结构体用于设置视频输出图像的大小,视频输出包含两个通道:RGB通道和YUV通道,其中RGB通道为RGB565数据
* 格式,视频预览的时候使用RGB通道
*/
typedef struct __IMAGE_SIZE
{
DWORD dwRGB_Width; /* RGB 通道的输出图像的宽度 */
DWORD dwRGB_Height; /* RGB 通道的输出图像的高度 */
DWORD dwYUV_Width; /* YUV 通道的输出图像的宽度 */
DWORD dwYUV_Height; /* YUV 通道的输出图像的高度 */
DWORD dwHorOffset; &nbs