以下代码示例说明如何在Symbian C++使用CImageEncoder进行bmp图片压缩和转换成Jpg图片。
Tested on: Nokia N958GB, Nokia 5800Xpress Music
1. 取得屏幕旋转方向和大小信息并截取当前屏幕
1 //取得屏幕设备指针
2 const CWsScreenDevice* screenDevice = iCoeEnv.ScreenDevice();
3
4 //取得屏幕大小和方向信息
5 screenDevice->GetScreenModeSizeAndRotation(
6 screenDevice->CurrentScreenMode(), iSizeAndRotation);
7
8 //截屏操作
9 CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap();
10 iBitmap->Create(iSizeAndRotation.iPixelSize, screenDevice->DisplayMode());
11
12 iBitmap->SetSizeInTwips(screenDevice);
13
14 screenDevice->CopyScreenToBitmap(iBitmap);
2 const CWsScreenDevice* screenDevice = iCoeEnv.ScreenDevice();
3
4 //取得屏幕大小和方向信息
5 screenDevice->GetScreenModeSizeAndRotation(
6 screenDevice->CurrentScreenMode(), iSizeAndRotation);
7
8 //截屏操作
9 CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap();
10 iBitmap->Create(iSizeAndRotation.iPixelSize, screenDevice->DisplayMode());
11
12 iBitmap->SetSizeInTwips(screenDevice);
13
14 screenDevice->CopyScreenToBitmap(iBitmap);
2. 设置需要转化文件的格式和参数,使用异步方法进行压缩。
1 //生成一个CFrameImageData对象的指针
2 CFrameImageData* frameImageData = CFrameImageData::NewL();
3 CleanupStack::PushL(frameImageData);
4
5 //转化成Jpeg格式的参数设定,iSampleScheme,iQualityFactor
6 TJpegImageData* imageData = new (ELeave) TJpegImageData();
7 imageData->iSampleScheme = TJpegImageData::EColor444;
8 imageData->iQualityFactor = iSettingData.ImageQuality();
9 User::LeaveIfError(frameImageData->AppendImageData(imageData));
10
11 //DataNewL方法来制定转换的格式和方法
12 iImageEncoder = CImageEncoder::DataNewL
13 (iCapturedImageBuffer, KImageTypeJpg, CImageEncoder::EOptionAlwaysThread);
14
15 //异步请求转化为指定格式的文件
16 iImageEncoder->Convert(&iStatus, *iBitmap, frameImageData);
17
18 CleanupStack::PopAndDestroy(frameImageData);
19
2 CFrameImageData* frameImageData = CFrameImageData::NewL();
3 CleanupStack::PushL(frameImageData);
4
5 //转化成Jpeg格式的参数设定,iSampleScheme,iQualityFactor
6 TJpegImageData* imageData = new (ELeave) TJpegImageData();
7 imageData->iSampleScheme = TJpegImageData::EColor444;
8 imageData->iQualityFactor = iSettingData.ImageQuality();
9 User::LeaveIfError(frameImageData->AppendImageData(imageData));
10
11 //DataNewL方法来制定转换的格式和方法
12 iImageEncoder = CImageEncoder::DataNewL
13 (iCapturedImageBuffer, KImageTypeJpg, CImageEncoder::EOptionAlwaysThread);
14
15 //异步请求转化为指定格式的文件
16 iImageEncoder->Convert(&iStatus, *iBitmap, frameImageData);
17
18 CleanupStack::PopAndDestroy(frameImageData);
19
上述代码片段由于使用了异步方法,需要在活动对象中(Active Object)使用。
同理,使用CImageEncoder也可进行其他图片格式的转换。