• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 2, 文章 - 73, 評(píng)論 - 60, 引用 - 0
            數(shù)據(jù)加載中……

            S60 3rd下的圖像處理

              以下代碼是網(wǎng)上一位仁兄的, 但是我使用測(cè)試,怎么都不能得到正確的圖像, 我使用的16位的位圖, 安裝他的步驟無(wú)法成功, 圖像花屏. 有沒有高手告知一二, 如何解決這個(gè)問題. 

              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;
             }
            }
             

            使用雙線性插值算法實(shí)現(xiàn),支持12位色,缺點(diǎn)是當(dāng)縮放比例小于0.5時(shí)圖像較源圖偏右下明顯。
            包含3個(gè)重載函數(shù),分別是指定寬高,指定整體縮放比例和指定

            可改為支持16位和24位色
            16位色RGB的獲取和合成,tempcolor為象素點(diǎn)的顏色值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個(gè)字節(jié),指針為TUint8*,新圖像顏色計(jì)算公式示例如下
            *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++;

            posted on 2007-11-14 11:41 郭天文 閱讀(970) 評(píng)論(0)  編輯 收藏 引用 所屬分類: S60

            亚洲七七久久精品中文国产| 久久精品国产只有精品66| 欧美亚洲国产精品久久高清| yy6080久久| 国产精品久久久久…| 精品久久久久久国产牛牛app| 久久精品午夜一区二区福利| 国产精品美女久久久久久2018| 久久影院午夜理论片无码 | 久久人与动人物a级毛片| 亚洲欧美日韩中文久久| 91久久精品视频| 亚洲国产精品无码久久一线 | 香蕉99久久国产综合精品宅男自 | 一级做a爰片久久毛片16| 人妻系列无码专区久久五月天| 欧美精品国产综合久久| 久久亚洲日韩看片无码| 91精品婷婷国产综合久久| 久久久久亚洲av综合波多野结衣| 亚洲狠狠综合久久| 99久久国产宗和精品1上映| 国产福利电影一区二区三区久久老子无码午夜伦不 | 色综合久久中文综合网| 无码任你躁久久久久久老妇App| 久久男人Av资源网站无码软件 | 久久男人AV资源网站| 韩国免费A级毛片久久| 久久久精品国产Sm最大网站| 国内精品伊人久久久久AV影院| 久久久久亚洲AV成人网| 东京热TOKYO综合久久精品 | 91视频国产91久久久| 怡红院日本一道日本久久| 亚洲AV日韩精品久久久久久| 久久久九九有精品国产| 久久天天躁狠狠躁夜夜avapp| 欧美黑人又粗又大久久久| 久久只这里是精品66| 伊人热热久久原色播放www| 伊人久久国产免费观看视频|