• <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位的位圖, 安裝他的步驟無法成功, 圖像花屏. 有沒有高手告知一二, 如何解決這個(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 郭天文 閱讀(961) 評(píng)論(0)  編輯 收藏 引用 所屬分類: S60

            久久精品中文字幕无码绿巨人| 久久久久久国产精品无码下载| 久久精品女人天堂AV麻| 99久久人人爽亚洲精品美女 | 久久精品国产影库免费看| 久久久精品一区二区三区| 久久久这里有精品中文字幕| 久久久噜噜噜久久中文字幕色伊伊| 久久久久成人精品无码中文字幕| 99久久99久久精品国产片果冻| 亚洲七七久久精品中文国产| 久久久国产精品亚洲一区| 亚洲狠狠综合久久| 偷窥少妇久久久久久久久| 9191精品国产免费久久| 久久亚洲精品无码aⅴ大香| 狠狠狠色丁香婷婷综合久久五月 | 99精品国产在热久久| 伊人久久精品影院| 久久精品国产99久久香蕉| 国产精品18久久久久久vr| 亚洲级αV无码毛片久久精品| 九九久久精品国产| 国产精品久久久久无码av| 亚洲成色www久久网站夜月| 欧美激情精品久久久久久| 99久久精品免费看国产| 久久电影网2021| 久久精品国产亚洲AV无码娇色| 三级三级久久三级久久| 午夜精品久久久久成人| 久久精品国产一区二区| 99久久免费国产精品| 99久久精品无码一区二区毛片 | 亚洲精品无码专区久久同性男| 亚洲精品高清国产一久久| 99热成人精品免费久久| 大美女久久久久久j久久| 97精品伊人久久大香线蕉app| 久久精品国产亚洲AV电影| 成人久久精品一区二区三区|