• <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, 評論 - 60, 引用 - 0
            數據加載中……

            S60 3rd下的圖像處理

              以下代碼是網上一位仁兄的, 但是我使用測試,怎么都不能得到正確的圖像, 我使用的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++;

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

            亚洲日本va午夜中文字幕久久 | 久久天天躁狠狠躁夜夜2020| 久久久国产精品网站| 精品国产福利久久久| 久久免费高清视频| 777久久精品一区二区三区无码| 国产亚洲美女精品久久久| 亚洲国产精品嫩草影院久久| 久久久老熟女一区二区三区| 丰满少妇人妻久久久久久4| 久久无码高潮喷水| 久久国产精品国产自线拍免费| 久久伊人亚洲AV无码网站| 久久亚洲sm情趣捆绑调教| 久久久久久人妻无码| 久久99亚洲综合精品首页| 国产成人精品三上悠亚久久| 久久美女人爽女人爽| 精品久久久无码21p发布| 久久99精品久久久久久9蜜桃| 狠狠精品久久久无码中文字幕| 91亚洲国产成人久久精品| 国产色综合久久无码有码| 久久天天躁狠狠躁夜夜不卡| 国产精品女同久久久久电影院| 亚洲午夜无码久久久久小说| 伊人色综合久久| 久久精品国产99国产精偷| 欧美成人免费观看久久| 久久久久99精品成人片三人毛片 | 成人a毛片久久免费播放| 伊人久久大香线蕉综合影院首页| 久久av免费天堂小草播放| 久久久久无码精品国产| 亚洲综合日韩久久成人AV| 亚洲欧美精品一区久久中文字幕 | 久久91精品国产91久久户| 久久精品无码专区免费青青| 久久精品国产亚洲av麻豆小说 | 精品久久久无码人妻中文字幕豆芽| 18禁黄久久久AAA片|