主要是给自己一个备份哈,谁需要谁拿去。代码如下:
/*****************************************************
Function:FadeIn
Desc:从0增加R,G,B颜色值,实现淡入效果
Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,pSrc-源位图,16位色,width,height-源位图大小,必须确保ydst+height<pDst>Height,xdst+width<pDst->Width,
step-步长
Output:pDst-经过处理的位图
Return:
*****************************************************/
void FadeIn(IBitmap *pDst,int xdst,int ydst,IBitmap *pSrc,int width,int height,int step)
{
int x,y;
int offset1,offset2;
int offdst;
int offsrc;
uint16 dstcolor,srccolor;
uint8 r,g,b;
IDIB *dstdib = (IDIB*)pDst;
IDIB *srcdib = (IDIB*)pSrc;
// 获得实际的图片点阵数据
uint16 *pDstBmp = (uint16*)dstdib->pBmp;
uint16 *pSrcBmp=(uint16 *)srcdib->pBmp;
if(dstdib->nDepth!=16 || srcdib->nDepth!=16)
return;
// 一般手机屏幕都是16位,565格式
if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
{
offset1=((ydst*dstdib->nPitch)>>1)+xdst;
offset2=0;
for(y=0;y<height;y++)
{
offdst=offset1;
offsrc=offset2;
for(x=0;x<width;x++)
{
dstcolor=pDstBmp[offdst];
srccolor=pSrcBmp[offsrc];
if(srccolor!=63519)
{
r=srccolor>>11;
g=(srccolor>>5) & 0x3f;
b=srccolor & 0x1f;
if(step<r)
r=step;
if(step<g)
g=step;
if(step<b)
b=step;
pDstBmp[offdst]=r<<11 | g<<5 | b;
}
offsrc++;
offdst++;
}
offset1+=(dstdib->nPitch>>1);
offset2+=(srcdib->nPitch>>1);
}
}
}
/*****************************************************
Function:Alpha256Bmp
Desc:256色位图alpha混合,修改调色板,只适用256色位图,加快速度用。
Input:pDst-目标位图,xdst,ydst-位置,width,height-半透明处理位图大小,pSrc-256色位图,xscr,yscr-源位置,R,G,B半透明颜色值,alpha
Output:
Return:
******************************************************/
void Alpha256Bmp(IBitmap *pDst,int xdst,int ydst,int width,int height,IBitmap *pSrc,
int xsrc,int ysrc,uint8 r, uint8 g, uint8 b,float alpha)
{
uint8 dstcolor;
uint32 *pPalette;
uint32 *pBackup;
byte *pOrigBytes;
byte *pNowBytes;
int i;
IDIB *srcdib = (IDIB*)pSrc;
if(srcdib->nColorScheme>0)
return;
if(srcdib->cntRGB==0)
return;
pPalette=(uint32*)MALLOC(sizeof(uint32)*255);
pNowBytes=(byte*)pPalette;
pOrigBytes=(byte *)srcdib->pRGB;
pBackup=srcdib->pRGB;
for(i=0;i<srcdib->cntRGB;i++)
{
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(dstcolor+(alpha*(r-dstcolor)));
*pNowBytes++=dstcolor;
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(dstcolor+(alpha*(g-dstcolor)));
*pNowBytes++=dstcolor;
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(dstcolor+(alpha*(b-dstcolor)));
*pNowBytes++=dstcolor;
pNowBytes++;
pOrigBytes++;
}
srcdib->pRGB=pPalette;
IBITMAP_BltIn(pDst,xdst,ydst,width,height,pSrc,xsrc,ysrc,AEE_RO_COPY);
srcdib->pRGB=pBackup;
FREE(pPalette);
}
/*****************************************************
Function:SpecialAlpha256Bmp
Desc:256色位图alpha混合,修改调色板,只适用256色位图,加快速度用。
Input:pDst-目标位图,xdst,ydst-位置,width,height-半透明处理位图大小,
pSrc-256色位图,xscr,yscr-源位置,R,G,B半透明颜色值,alpha
Output:
Return:
******************************************************/
void SpecialAlpha256Bmp(IBitmap *pDst,int xdst,int ydst,int width,int height,IBitmap *pSrc,
int xsrc,int ysrc,uint8 r, uint8 g, uint8 b)
{
uint8 dstcolor;
uint32 *pPalette;
uint32 *pBackup;
byte *pOrigBytes;
byte *pNowBytes;
int i;
IDIB *srcdib = (IDIB*)pSrc;
if(srcdib->nColorScheme>0)
return;
if(srcdib->cntRGB==0)
return;
pPalette=(uint32*)MALLOC(sizeof(uint32)*255);
pNowBytes=(byte*)pPalette;
pOrigBytes=(byte *)srcdib->pRGB;
pBackup=srcdib->pRGB;
for(i=0;i<srcdib->cntRGB;i++)
{
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(dstcolor+((r-dstcolor)>>1));
*pNowBytes++=dstcolor;
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(g>>1);
*pNowBytes++=dstcolor;
dstcolor=(*pOrigBytes++);
dstcolor=(uint8)(b>>1);
*pNowBytes++=dstcolor;
pNowBytes++;
pOrigBytes++;
}
srcdib->pRGB=pPalette;
IBITMAP_BltIn(pDst,xdst,ydst,width,height,pSrc,xsrc,ysrc,AEE_RO_COPY);
srcdib->pRGB=pBackup;
FREE(pPalette);
}
/*****************************************************
Function:SpecialAlpha
Desc:实现和某种颜色的半透明
Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值
Output:pDst-经过处理的位图
Return:
*****************************************************/
void SpecialAlpha(IBitmap *pDst,int xdst,int ydst,int width,int height,
uint8 r, uint8 g, uint8 b)
{
int x,y;
int offset1;
int offdst;
uint16 dstcolor;
uint8 dstr,dstg,dstb;
IDIB *dstdib = (IDIB*)pDst;
uint16 *pDstBmp = (uint16*)dstdib->pBmp; // 获得实际的图片点阵数据。
if(dstdib->nDepth!=16)
return;
// 一般手机屏幕都是16位,565格式
r=r & 0x1f;
g=(g & 0x3f);
b=b & 0x1f;
if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
{
offset1=((ydst*dstdib->nPitch)>>1)+xdst;
for(y=0;y<height;y++)
{
if(y==height-1)
offdst=0;
offdst=offset1;
for(x=0;x<width;x++)
{
dstcolor=pDstBmp[offdst];
dstr=dstcolor>>11;
dstr=(uint8)(dstr+((r-dstr)>>1));
dstg=(dstcolor>>5) & 0x3f;
dstg=(uint8)(g>>1);
dstb=dstcolor & 0x1f;
dstb=(uint8)(b>>1);
pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
offdst++;
}
offset1+=(dstdib->nPitch>>1);
}
}
}
/*****************************************************
Function:FastAlpha
Desc:实现和某种颜色的半透明
Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值
Output:pDst-经过处理的位图
Return:
*****************************************************/
void FastAlpha(IBitmap *pDst,int xdst,int ydst,int width,int height,
uint8 r, uint8 g, uint8 b)
{
int x,y;
int offset1;
int offdst;
uint16 dstcolor;
uint8 dstr,dstg,dstb;
IDIB *dstdib = (IDIB*)pDst;
// 获得实际的图片点阵数据。
uint16 *pDstBmp = (uint16*)dstdib->pBmp;
if(dstdib->nDepth!=16)
return;
// 一般手机屏幕都是16位,565格式
r=r & 0x1f;
g=(g & 0x3f);
b=b & 0x1f;
if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
{
offset1=((ydst*dstdib->nPitch)>>1)+xdst;
for(y=0;y<height;y++)
{
if(y==height-1)
offdst=0;
offdst=offset1;
for(x=0;x<width;x++)
{
dstcolor=pDstBmp[offdst];
dstr=dstcolor>>11;
dstr=(uint8)(dstr+((r-dstr)>>1));
dstg=(dstcolor>>5) & 0x3f;
dstg=(uint8)(dstg+((g-dstg)>>1));
dstb=dstcolor & 0x1f;
dstb=(uint8)(dstb+((b-dstb)>>1));
pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
offdst++;
}
offset1+=(dstdib->nPitch>>1);
}
}
}
/*****************************************************
Function:AlphaBlend
Desc:实现和某种颜色的半透明
Input:pDst-目标位图,16位色,xdst,ydst-目标位图位置,width,height-半透明处理位图大小,必须确保ydst+height<pDst->Height,xdst+width<pDst->Width,R,G,B半透明颜色值,alpha-半透明因子
Output:pDst-经过处理的位图
Return:
*****************************************************/
void AlphaBlend(IBitmap *pDst,int xdst,int ydst,int width,int height,
uint8 r, uint8 g, uint8 b,float alpha)
{
int x,y;
int offset1;
int offdst;
uint16 dstcolor;
uint8 dstr,dstg,dstb;
IDIB *dstdib = (IDIB*)pDst;
uint16 *pDstBmp = (uint16*)dstdib->pBmp;
if(dstdib->nDepth!=16)
return;
r=r & 0x1f;
g=(g & 0x3f);
b=b & 0x1f;
if(dstdib->nColorScheme == IDIB_COLORSCHEME_565)
{
offset1=((ydst*dstdib->nPitch)>>1)+xdst;
for(y=0;y<height;y++)
{
if(y==height-1)
offdst=0;
offdst=offset1;
for(x=0;x<width;x++)
{
dstcolor=pDstBmp[offdst];
dstr=dstcolor>>11;
dstr=(uint8)(dstr+(alpha*(r-dstr)));
dstg=(dstcolor>>5) & 0x3f;
dstg=(uint8)(dstg+(alpha*(g-dstg)));
dstb=dstcolor & 0x1f;
dstb=(uint8)(dstb+(alpha*(b-dstb)));
pDstBmp[offdst]=dstr<<11 | dstg<<5 | dstb;
offdst++;
}
offset1+=(dstdib->nPitch>>1);
}
}
}