class TPicCut
{
public:
void PicCut(CFbsBitmap *aBitmapSrc, TSize aSize, RPointerArray<CFbsBitmap> &aBitmapTarget);
private:
TStreamId iId;
TInt VerNum;
TInt HorNum;
};
/**
* aBitmapSrc:被切割的源图片 输入
* aSize:目标图片的大小 输入
* aBitmapTarget:存放目标图片的指针数组 输出
*/
void TPicCut::PicCut(CFbsBitmap *aBitmapSrc, TSize aSize,
RPointerArray<CFbsBitmap> &aBitmapTarget)
{
/**
* 计算纵向和横向需要被切割的图片个数
*/
TSize Size = aBitmapSrc->SizeInPixels();
VerNum = Size.iHeight / aSize.iHeight;
HorNum = Size.iWidth / aSize.iWidth;
/**
* 将一个外化流关联到一个文件
*/
CFileStore *BitmapBuffer = CDirectFileStore::ReplaceLC(
CCoeEnv::Static()->FsSession(), _L("BitmapTemp"), EFileWrite | EFileRead);
BitmapBuffer->SetTypeL(TUidType(BitmapBuffer->Layout()));
RStoreWriteStream BitmapExStream;
iId = BitmapExStream.CreateLC(*BitmapBuffer);
/**
* 将图片切割成横向和纵向指定数目的子图片,
* 并导入的外化的流中从而存到文件中
*/
for (TInt i = 0; i < VerNum; i++)
{
for (TInt j = 0; j < HorNum; j++)
{
TPoint lefttop(j * aSize.iWidth, i * aSize.iHeight);
TPoint rightbottom(lefttop.iX + aSize.iWidth, lefttop.iY
+ aSize.iHeight);
TRect rect(lefttop, rightbottom);
aBitmapSrc->ExternalizeRectangleL(BitmapExStream, rect);
}
}
BitmapExStream.CommitL();
CleanupStack::PopAndDestroy();
/**
* 将内化流关联到存有目标图片的文件
*/
RStoreReadStream BitmapInStream;
BitmapInStream.OpenLC(*BitmapBuffer, iId);
/**
* 将目标图片从文件中内化到存储图片的指针数组
*/
for (TInt i = 0; i < VerNum * HorNum; i++)
{
CFbsBitmap *bitmap = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bitmap);
bitmap->InternalizeL(BitmapInStream);
aBitmapTarget.AppendL(bitmap);
CleanupStack::Pop(bitmap);
}
CleanupStack::PopAndDestroy(2);
}
根据SDK的文档描述,除了ExternalizeRectangleL,InternalizeL好像找不到其他的函数能够做图片切割。这两个函数必须要借助临时文件来完成图片切割,我想应该可以不借助临时文件,但是本人水平不济。只能发现现在的这种方法,如果那位大侠有其他更好的方法,望不吝赐教啊。