以下代碼是網(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++;