Making something

# 一个快速的8级ALPHA混合算法

/// 获取RGB分量的掩码

#define RGB565_R_LBIT      0x0800

#define RGB565_G_LBIT     0x0020

#define RGB565_B_LBIT      0x0001

#define RGB565_R_MBIT     0x8000

#define RGB565_G_MBIT    0x0400

#define RGB565_B_MBIT     0x0010

/// 混合了RGB？位

#define RGB565_MSBIT       (RGB565_R_MBIT | RGB565_G_MBIT | RGB565_B_MBIT)

#define RGB565_LSBIT (RGB565_R_LBIT | RGB565_G_LBIT | RGB565_B_LBIT)

#define RGB565_R_M2BIT   (RGB565_R_MBIT | (RGB565_R_MBIT >> 1))

#define RGB565_G_M2BIT   (RGB565_G_MBIT | (RGB565_G_MBIT >> 1))

#define RGB565_B_M2BIT   (RGB565_B_MBIT | (RGB565_B_MBIT >> 1))

#define RGB565_R_M3BIT   (RGB565_R_MBIT | (RGB565_R_MBIT >> 1) | (RGB565_R_MBIT >> 2))

#define RGB565_G_M3BIT   (RGB565_G_MBIT | (RGB565_G_MBIT >> 1) | (RGB565_G_MBIT >> 2))

#define RGB565_B_M3BIT   (RGB565_B_MBIT | (RGB565_B_MBIT >> 1) | (RGB565_B_MBIT >> 2))

void vBlendImage(unsigned int vAddr, 图像结构指针 lpImage, unsigned int xSrc, unsigned int ySrc, unsigned int width, unsigned int height, unsigned int coef)

{

unsigned int i,j,dwidth,dheight,deltawidth;

unsigned int* dp = (unsigned int *)vAddr, *dp1, *sp = lpImage->databuf;

if(xSrc >= (DTMAXX + 1) || ySrc >= (DTMAXY + 1)){

return;

}

dwidth = lpImage->width;

dheight = lpImage->height;

deltawidth = dwidth - width;

/*    if(xSrc + width > (DTMAXX + 1)){

width = (DTMAXX + 1) - xSrc;

}

if(ySrc + height > (DTMAXY + 1)){

height = (DTMAXY + 1) - ySrc;

}*/

dp += (ySrc * (DTMAXX + 1) + xSrc);

for(i=0; i<height; i++){

dp1 = dp;

for(j=0; j<width; j++){

unsigned int scolor, dcolor;

unsigned int mcolor;

unsigned int skcolor, dkcolor;

unsigned int xcolor;

scolor = *sp++;

xcolor = dcolor = *dp1;

skcolor = scolor & RGB565_LSBIT;

scolor = scolor & ~RGB565_LSBIT;

dkcolor = dcolor & RGB565_LSBIT;

dcolor = dcolor & ~RGB565_LSBIT;

if(coef & BIT0){

mcolor = xcolor & skcolor;

xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

xcolor = (xcolor >> 1) + mcolor;

}

if(coef & BIT1){

mcolor = xcolor & skcolor;

xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

xcolor = (xcolor >> 1) + mcolor;

}else{

if(xcolor != dcolor){

mcolor = xcolor & dkcolor;

xcolor = (xcolor & ~RGB565_LSBIT) + dcolor;

xcolor = (xcolor >> 1) + mcolor;

}

}

if(coef & BIT2){

mcolor = xcolor & skcolor;

xcolor = (xcolor & ~RGB565_LSBIT) + scolor;

xcolor = (xcolor >> 1) + mcolor;

}else{

if(xcolor != dcolor){

mcolor = xcolor & dkcolor;

xcolor = (xcolor & ~RGB565_LSBIT) + dcolor;

xcolor = (xcolor >> 1) + mcolor;

}

}

*dp1++ = xcolor;

}

sp += deltawidth;

dp += (DTMAXX + 1);

}

}

#### alpha混合算法资料整理

2017-01-18 12:53:17

#### RGBA alpha 透明度混合算法

2011-05-25 17:11:00

#### 16位图像Alpha混合的实现

2009-06-15 00:50:00

#### alpha混合的数学原理与实现

2011-11-28 19:39:20

#### DirectX11 创建混合状态

2015-10-04 10:15:55

#### 我对【纹理颜色混合】与【ALPHA混合】的理解

2007-07-09 10:51:00

#### 从英语小白到口语8级，她只用了一个方法！

2018-04-17 00:00:00

#### Windows的位图alpha混合技术

2006-05-10 10:26:00

#### Alpha 混合：两个半透明色的叠加

2008-07-21 01:01:00