256色:基于256色的Alpha混合思路方法(查表法)的实现思路方法

   在网站WebSite上看到过很多Alpha混合计算相关文档其中不乏经典的作但大多数都是基于16位显示模式下而256色却很少有人谈及所以决定写个基于256色Alpha混合算法详细实现思路方法以帮助那些初学者给他们点点小小灵感:)

   首先假设你已经有了个调色板我们将根据这个调色板来计算和创建个Alpha_Map[256][256] 2维整形这个用来存放混合后颜色对应于(或近似)这个调色板中索引值

   然而我们如何获得这个索引值呢?这就需要进行个求近似值Find_Index这个主要负责根据给定 3个基色从调色板中找到相同颜色或最接近颜色索引值并返回这个索引值还需要个结构:BEST_FIT定义是:

typedef struct BEST_FIT_TYP
{
sum; // 累加值
index; // 索引值
}BEST_FIT;

有了这个结构就可以写Find_Index原形如下:

Find_Index(BYTE R, BYTE G, BYTE B, PALETTEENTRY *palette)
{
rn = 0, // Red差值分量
gn = 0, // Green差值分量
bn = 0; // Blue差值分量

BEST_FIT best;
best.sum = 100; // 赋给累加值个最大值
best.index = 0; // 化索引值

for ( index = 0; index < 256; index)
{// 遍历调色板
rn = palette[index].peRed - R; // 计算差值以下相同
(rn < 0)
rn = -rn; // 求绝对值以下相同
gn = palette[index].peGreen - G;
(gn < 0)
gn = -gn;
bn = palette[index].peBlue - B;
(bn < 0)
bn = -bn;

(best.sum > (rn + gn + bn)) // 判断 3个分量累加值是否大于原来累加值
{
best.sum = rn + gn + bn; // 更新累加值
best.index = index; // 更新索引值
(0 best.sum) // 如果累加值为零即颜色匹配
{
(best.index); // 返回索引值
;
}// end
}// end

}// end for
(best.index); // 返回近似值
}

这个可以返回个索引值这样我们就能利用这个索引值建立Alpha_Map[256][256]查色表了

现在我们终于能够开始建立查找表了这是个50%Alpha混合如果需要你可以改变混合级别

首先在这里需要介绍说明公式由来以方便读者理解

先说说PALETTEENTRY这个结构结构定义如下:

typedef struct tagPALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY;

这个结构分别用3个字节表示RGB 3基色

我们可以用这 3个基色值进行50%Alpha混合运算公式如下所示:

   srcRGB:原点颜色值
   destRGB:目标点颜色值
   RGB:结果
   alpha:混合级数开始为个0--1的间浮点数我们般将它转换为整形进行计算这里是50%混合运算所以它值就是0.5
   Alpha混合基本公式:
     RGB = 0.5 * srcRGB + (1 – 0.5) * destRGB;
     将其进行化简就得到了下式:
     RGB = 0.5 * (srcRGB + destRGB);
     乘以0.5就相当于向右移1位所以最后公式就是:
     RGB = (srcRGB + destRGB) >> 1;

根据这个公式就能够获得个50%Alpha混合RGB色彩值在这里由于是用调色板做所以RGB要分开来计算

下面就是化Alpha_Map[256][256]里面了前面Find_Index

void Alpha_Init(PALETTEENTRY *palette)
{
for ( index1 = 0; index1 < 256; index1)
for ( index2 = 0; index2 < 256; index2)
{
R = (palette[index1].peRed + palette[index2].peRed) >> 1;
G = (palette[index1].peGreen + palette[index2].peGreen) >> 1;
B = (palette[index1].peBlue + palette[index2].peBlue) >> 1;

Alpha_Map[index1][index2] = Find_Index(R, G, B, palette);;
}// end for
}

   这样我们便完成了基于256色Alpha混合运算查找表当我们需要进行Alpha混合运算时候直接可以用源色和目索引值作为下标来从这个表中找到个近似颜色

   本人第次发表这类文档有不足的处和疏漏地方还望高手指教强烈需求起学习和研究邮箱是:[email protected]欢迎来信!
Tags:  256色模式 256色位图 256色图片 256色

延伸阅读

最新评论

发表评论