C “计算”;平均;两种颜色的

C “计算”;平均;两种颜色的,c,low-level,antialiasing,alphablending,C,Low Level,Antialiasing,Alphablending,这只是与编程有关的一小部分——与颜色及其表示有更多的关系 我正在开发一个非常低级的应用程序。我在内存中有一个字节数组。那些是人物。它们是使用抗锯齿渲染的:它们的值从0到255,0是完全透明的,255是完全不透明的(alpha,如果您愿意) 我在构思呈现这种字体的算法时遇到了困难。我对每个像素执行以下操作: // intensity is the weight I talked about: 0 to 255 intensity = glyphs[t

这只是与编程有关的一小部分——与颜色及其表示有更多的关系

我正在开发一个非常低级的应用程序。我在内存中有一个字节数组。那些是人物。它们是使用抗锯齿渲染的:它们的值从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,看起来文本有一个绿色的“光环”

任何关于如何正确计算的想法都将不胜感激

谢谢你的时间

我认为“光环”是由抗锯齿造成的。该技术将像素与其相邻像素进行平均


我知道您似乎没有使用OpenGL,但可能有助于解释一些理论。希望我有一个更好的答案,但希望这能为你指明正确的方向。我的第一次尝试是禁用抗锯齿,因为它似乎弊大于利。不过,可能还有比这更好的解决方案。

逐像素进行alpha混合可能太复杂了,因为当前像素值会修改下一个像素值

我会用盒子混合的思想重新设计算法



由于许多getPixel需要一个字形,因此无法生成正确的目标图像。

您需要混合背景色和前景色。A-la:

pixelColour = newColour * intensity + backgroundColour * (1 - intensity)
顺便说一句,这是一种非常缓慢的渲染和混合字体的方法。相反,您应该将字体的所有字符渲染到具有所需属性的屏幕外表面,然后在需要文本时将其用作纹理渲染到其他表面

编辑:

这看起来不对:

(255.0 - (float) intensity/255.0)
它应该是:

(255.0 - (float) intensity)/255.0

或者,将其放在原始代码中:
transfer=(int)((1.0-强度/255.0)*color.red+强度/255.0*像素.red)
P.S.“将字体的所有字符渲染到屏幕外表面”-我认为这就是
glyphs
的含义。我不太关心性能,因为这是一个概念验证的学术应用程序。但是谢谢你的意见!我试试看。