织梦CMS - 轻松建站从此开始!

罗索

S60 3rd下的图像处理

落鹤生 发布于 2009-11-25 13:02 点击:次 
以下代码是网上一位仁兄的, 但是我使用测试,怎么都不能得到正确的图像, 我使用的16位的位图, 安装他的步骤无法成功, 图像花屏. 有没有高手告知一二, 如何解决这个问题.
TAG:

以下代码是网上一位仁兄的, 但是我使用测试,怎么都不能得到正确的图像, 我使用的16位的位图, 安装他的步骤无法成功, 图像花屏. 有没有高手告知一二, 如何解决这个问题.

  inline TUint8 GetR( const TUint16 aColor)
  {
  return aColor>>8;
  }

  inline TUint8 GetG(const TUint16 aColor)
  {
  return aColor;
  }

  inline TUint8 GetB(const TUint16 aColor)
  {
  return aColor & 0xf;
  }

CFbsBitmap* CinfoshowContainer::BmpZoomL( CFbsBitmap* aBitmap, TInt aWinth, TInt aHeight)
{
 if( aWinth>0 && aHeight>0 )
 {
  const TInt widtha = aBitmap->SizeInPixels().iWidth;
  const TInt heighta = aBitmap->SizeInPixels().iHeight;
  TReal WPencent=(TReal)aWinth/widtha;
  TReal HPencent=(TReal)aHeight/heighta;
  return BmpZoomL( aBitmap, WPencent, HPencent);
 }
 else
 {
  return NULL;
 }

}
CFbsBitmap* CinfoshowContainer::BmpZoomL( CFbsBitmap* aBitmap, TReal aPencent ){
 if(aPencent>0)
 {
  return BmpZoomL( aBitmap, aPencent, aPencent );

 }
 else
 {
  return NULL;
 }
}
CFbsBitmap* CinfoshowContainer::BmpZoomL( CFbsBitmap* aBitmap, TReal aWPencent, TReal aHPencent)
{
 if( aWPencent>0 && aHPencent>0 )
 {
 
  const TInt widtha = aBitmap->SizeInPixels().iWidth;
  const TInt heighta = aBitmap->SizeInPixels().iHeight;
  const TInt width = widtha * aWPencent +0.5;
  const TInt height = heighta * aHPencent +0.5;
  CFbsBitmap* newbitmap = new(ELeave) CFbsBitmap();
  User::LeaveIfError(newbitmap->Create(TSize(width,height), EColor4K/*displayMode*/));

  TBitmapUtil bmpUtil1(aBitmap);
  TBitmapUtil bmpUtil2(newbitmap);
  bmpUtil1.Begin(TPoint(0,0));
  bmpUtil2.Begin(TPoint(0,0), bmpUtil1);
 
  TUint16* const addr1 = (TUint16*)aBitmap->DataAddress();
  TUint16* const addr2 = (TUint16*)newbitmap->DataAddress();
    
  TUint16* p1 = addr1;    
  TUint16* p2 = addr2;    
  const TInt line1 = CFbsBitmap::ScanLineLength(widtha, EColor4K) / 2;
  const TInt line2 = CFbsBitmap::ScanLineLength(width, EColor4K) / 2;    

  TReal xa=0,ya=0;
  TInt x=0,y=0;
  const TInt jump = line2 - width;

  TUint16* p2end = addr2 + width;

  p2end = addr2 + line2*height;
  while( p2 < p2end)
  {
   TUint16* p2endline = p2 + width;
   while( p2!=p2endline )
   {
   
    xa=x/aWPencent;
    ya=y/aHPencent;
    TInt xai = xa;
    TInt yai = ya;
   
    if( xai == widtha -1 )
    {
     if( yai == heighta-1 )
     {
      *p2 = *(addr1+line1*yai+xai);
     }
     else
     {
      p1=addr1+line1*yai+widtha-1;    
     
      TUint8 red=GetR(*p1)+(GetR(*(p1+line1))-GetR(*p1))*(ya-yai)+0.5; 
      TUint8 green=GetG(*p1)+(GetG(*(p1+line1))-GetG(*p1))*(ya-yai)+0.5;
      TUint8 blue=GetB(*p1)+(GetB(*(p1+line1))-GetB(*p1))*(ya-yai)+0.5;
      *p2 = (red<<8) | (green&0xf0) | blue;
     }

    }
    else
    {
     if( yai == heighta-1 )
     {
      p1=addr1+line1*(heighta-1)+xai;

      TUint8 red=GetR(*(p1))+(GetR(*(p1+1))-GetR(*(p1)))*(xa-xai)+0.5; 
      TUint8 green=GetG(*(p1))+(GetG(*(p1+1))-GetG(*(p1)))*(xa-xai)+0.5;
      TUint8 blue=GetB(*(p1))+(GetB(*(p1+1))-GetB(*(p1)))*(xa-xai)+0.5;
      *p2 = (red<<8) | (green&0xf0) | blue;
     }
     else
     {
     
      p1=addr1+line1*yai+xai;
     
      TUint8 red1=GetR(*(p1))+(GetR(*(p1+1))-GetR(*(p1)))*(xa-xai)+0.5; 
      TUint8 green1=GetG(*(p1))+(GetG(*(p1+1))-GetG(*(p1)))*(xa-xai)+0.5;
      TUint8 blue1=GetB(*(p1))+(GetB(*(p1+1))-GetB(*(p1)))*(xa-xai)+0.5;
     
      p1=addr1+line1*(yai+1)+xai;
     
      TUint8 red2=GetR(*(p1))+(GetR(*(p1+1))-GetR(*(p1)))*(xa-xai)+0.5; 
      TUint8 green2=GetG(*(p1))+(GetG(*(p1+1))-GetG(*(p1)))*(xa-xai)+0.5;
      TUint8 blue2=GetB(*(p1))+(GetB(*(p1+1))-GetB(*(p1)))*(xa-xai)+0.5;
     
      TUint8 red=red1+(red2-red1)*(ya-yai)+0.5; 
      TUint8 green=green1+(green2-green1)*(ya-yai)+0.5;
      TUint8 blue=blue1+(blue2-blue1)*(ya-yai)+0.5;
     
      *p2 = (red<<8) | (green&0xf0) | blue;
     
     }
    
    }
    x++;
    p2++;
   
   }
   x=0;
   y++;
   p2+=jump;
  
  }

  bmpUtil2.End();
  bmpUtil1.End();
 
  return newbitmap;
 }
 else
 {
  return NULL;
 }
}
 

使用双线性插值算法实现,支持12位色,缺点是当缩放比例小于0.5时图像较源图偏右下明显。
包含3个重载函数,分别是指定宽高,指定整体缩放比例和指定

可改为支持16位和24位色
16位色RGB的获取和合成,tempcolor为象素点的颜色值TUint16型

TUint8 red= tempcolor>>8;
TUint8 green=tempcolor>>3;
TUint8 blue=tempcolor & 0x1f;

tempcolor=((TUint16)(red&0xf8)<<8) | ((TUint16)(green&0x3f)<<3) | (blue&0x1f);


24位色为3个字节,指针为TUint8*,新图像颜色计算公式示例如下
*p2=(*p1)+((*(p1+line1))-(*p1))*(ya-yai)+0.5; //red
p1++;
p2++;
*p2=(*p1)+((*(p1+line1))-(*p1))*(ya-yai)+0.5; //green
p1++;
p2++;
*p2=(*p1)+((*(p1+line1))-(*p1))*(ya-yai)+0.5;//blue
p1++;
p2++;

 

(落鹤生)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200911/7999.html]
本文出处:未知 作者:落鹤生
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容