计算两种颜色的“平均值”

这只是边缘编程相关 – 还有更多的颜色及其表示.

我正在开发一个非常低级的应用程序.我在内存中有一个字节数组.那些是人物.它们使用抗锯齿进行渲染:它们的值为0到255,0表示完全透明,255表示完全不透明(如果您愿意,则为alpha).

我在构思这种字体的渲染算法时遇到了麻烦.我正在为每个像素执行以下操作:

// intensity is the weight I talked about: 0 to 255
            intensity = glyphs[text[i]][x + GLYPH_WIDTH*y];
            if (intensity == 255)
                continue; // Don't draw it, fully transparent
            else if (intensity == 0) 
                setPixel(x + xi, y + yi, color, base); // Fully opaque, can draw original color
            else { // Here's the tricky part
                // Get the pixel in the destination for averaging purposes
                pixel = getPixel(x + xi, y + yi, base);
                // transfer is an int for calculations
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.red + (float) pixel.red)/2); // This is my attempt at averaging
                newPixel.red = (Byte) transfer;
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.green + (float) pixel.green)/2);
                newPixel.green = (Byte) transfer;
                // transfer = (int) ((float) ((float) 255.0 - (float) intensity)/255.0 * (((float) color.blue) + (float) pixel.blue)/2);
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.blue + (float) pixel.blue)/2);
                newPixel.blue = (Byte) transfer;
                // Set the newpixel in the desired mem. position
                setPixel(x+xi, y+yi, newPixel, base);
            }

如您所见,结果不太理想.这是一个非常放大的图像,以1:1的比例看起来文本有一个绿色的“光环”.

如何正确计算这个的任何想法将不胜感激.

谢谢你的时间!

您需要混合背景和前景色.翼:

pixelColour = newColour * intensity + backgroundColour * (1 - intensity)

顺便说一句,这是渲染和混合字体的一种非常慢的方式.您应该将字体的所有字符渲染到具有所需属性的屏幕外表面,然后将其用作纹理,以便在需要文本时渲染到其他曲面.

编辑:

这看起来不正确:

(255.0 - (float) intensity/255.0)

它应该是:

(255.0 - (float) intensity)/255.0
相关文章
相关标签/搜索