• <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

            99麻豆久久久国产精品免费| 久久精品国产一区二区三区不卡| 精品国产青草久久久久福利| 久久综合久久美利坚合众国| 天天躁日日躁狠狠久久| 久久国产乱子精品免费女| 国产成人精品久久| 日韩精品久久久久久久电影蜜臀| 久久国产精品久久久| 中文精品久久久久人妻| 97精品国产91久久久久久| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 精品国产综合区久久久久久| 久久久国产视频| 国产精品欧美亚洲韩国日本久久| 国产色综合久久无码有码| 久久免费视频网站| 色综合久久久久久久久五月| 久久久久久久国产免费看| www.久久热.com| 久久久久久久久无码精品亚洲日韩| 久久久久亚洲AV成人网人人网站 | 精品午夜久久福利大片| 久久人妻少妇嫩草AV蜜桃| 久久99久久成人免费播放| 久久久久亚洲av无码专区| 亚洲欧美日韩精品久久亚洲区 | 九九热久久免费视频| 久久国产精品久久久| 久久久久久久尹人综合网亚洲| 亚洲精品无码专区久久久 | 久久99国产精品久久99| 久久精品人人做人人妻人人玩| 亚洲国产成人精品女人久久久 | 国产精品美女久久久免费| 久久福利青草精品资源站免费| 狠狠色婷婷久久一区二区三区| 成人妇女免费播放久久久| 久久99国产精品久久久| 久久免费小视频| 久久人人爽人人澡人人高潮AV |