图片的像素级处理

时间:2021-09-16 20:29:40
可以通过使用TBitmapUtil 类的一些方法对位图进行像素级的处理。包括:
void Begin(const TPoint& aPosition) :设置当前要处理的像素位置,并锁定堆。
void End() :解除对堆的锁定。
void SetPos(const TPoint& aPosition) :改变当前像素位置至aPosition
void IncXPos() :将当前的X 坐标自增1
void DecXPos() :将当前的X 坐标自减1
void IncYPos() :将当前的Y 坐标自增1
void DecYPos() :将当前的Y 坐标自减1
TUint32 GetPixel() const :获取当前像素的RGB 值。
void SetPixel(TUint32 aValue) :设置当前像素的RGB 值。
下面我们通过将一个位图反转后写入另一张位图中的操作来说明TBitmapUtil 类的使用方法。
利用前面已经生成并读取的位图:CFbsBitmap* iImage1和CFbsBitmap* iImage2。这里iImage2的长宽均大于iImage1,我们将iImage1反转装入iImage2中
首先关联要操作的位图:
TBitmapUtil bitmap1Util(iBitmap1);
TBitmapUtil bitmap2Util(iBitmap2);
接下来开始对位图操作,并设置初始点为(0 0 ):
bitmap1Util.Begin(TPoint(0,0));
bitmap2Util.Begin(TPoint(0,0));
下面从iBitmap1 逐像素读取,并写入iBitmap2 中:
TSize inSize = iBitmap1->SizeInPixels();
TInt xPos;
for (TInt yPos=0;yPos<inSize.iHeight;yPos++)
{
 bitmap1Util.SetPos(TPoint(0,yPos));
 bitmap2Util.SetPos(TPoint(yPos,0));
 for (xPos=0;xPos<inSize.iWidth;xPos++)
 {
  bitmap2Util.SetPixel(bitmap1Util);
  bitmap1Util.IncXPos();
  bitmap2Util.IncYPos();
 }
}
最后结束操作,清理堆栈
bitmap1Util.End();
bitmap2Util.End();

这样,我们就完成了将iImage1反转并写入iImage2中的工作。