symbian 图片切割

来源:互联网 发布:为什么mysql 编辑:程序博客网 时间:2024/05/02 14:47

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 (ELeaveCFbsBitmap;

CleanupStack::PushL(bitmap);

bitmap->InternalizeL(BitmapInStream);

aBitmapTarget.AppendL(bitmap);

CleanupStack::Pop(bitmap);

}

CleanupStack::PopAndDestroy(2);

}

根据SDK的文档描述,除了ExternalizeRectangleL,InternalizeL好像找不到其他的函数能够做图片切割。这两个函数必须要借助临时文件来完成图片切割,我想应该可以不借助临时文件,但是本人水平不济。只能发现现在的这种方法,如果那位大侠有其他更好的方法,望不吝赐教啊。
原创粉丝点击