以下代码示例说明如何在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也可进行其他图片格式的转换。