智胜电子 发表于 2025-1-6 09:57:19

各位高手,数字取模后边缘毛刺,有什么方法处理,

用RGB565方式取模是看不到毛刺,但取模后要在MCU上随意换底色时不好处理,因为数字给底色间有个过度色,大家有什么办法?

wangxiangtan 发表于 2025-1-6 11:01:21

太高端了,不懂

tzz1983 发表于 2025-1-6 12:52:26

我知道一个方法,上位机如果是用C++编程,字体设置里有个选项 “抗锯齿” , 禁用这个选项,然后字体就没有过渡色了,把字符画在窗口或内存位图上,再取模。 虽然这个方法取模出来的字体会有锯齿,但是比我们用软件阈值取的来的效果要好。

智胜电子 发表于 2025-1-6 13:43:34

tzz1983 发表于 2025-1-6 12:52
我知道一个方法,上位机如果是用C++编程,字体设置里有个选项 “抗锯齿” , 禁用这个选项,然后字体就没有 ...

没玩过上位机,取模的图片要想在MCU中随意换底色,最好是选单色取模,可单色取模有毛刺,用RGB565取模是没毛刺,但不知在MCU中怎样换底色,你有什么方法

智胜电子 发表于 2025-1-7 09:58:52

wnagming 发表于 2025-1-6 20:55
底色统一使用0X0000表示,如果有纯黑,就用0X0001代替,这样代码中遇到0就用底色,否则就显示字 ...

比如,白字黑底用RGB565取模,我要换成白字红底,原来白字黑底取模时白字的边缘有个白和黑的过度色,现在换成白字红底时怎么把白和黑的过度色变成白和红的过度色

ANop 发表于 2025-6-28 14:16:41

智胜电子 发表于 2025-1-7 09:58
比如,白字黑底用RGB565取模,我要换成白字红底,原来白字黑底取模时白字的边缘有个白和黑的过度色,现在 ...
文字转成图片,图片用Image2Lcd转灰度图,然后把灰度数据当作alpha通道用,显示出来的字没锯齿,也能换颜色
/**
* @brief显示灰度文字图片,模拟AA效果
* @paramx      起始X坐标
* @paramy      起始Y坐标
* @paramw      图片宽度
* @paramh      图片高度
* @param*gray指向灰度图数组
* @paramfColor 前景色 RGB565
* @parambColor 背景色 RGB565
* @retval 无
*/
void LCD_Show4GrayPicture3(u16 x, u16 y, u16 w, u16 h, const u8 *gray, u16 fColor, u16 bColor)
{
    u32 i, j;
    u16 r1, g1, b1;
    u16 r2, g2, b2;
      u16 bytesPerLine;
      u32 byteIndex;
      u8 pixelData;
      u8 shift;
    u16 r, g, b;
    u8 grayVal, alpha;
    u16 color;

    // 提取前景色分量
    r1 = (fColor >> 11) & 0x1F;
    g1 = (fColor >> 5)& 0x3F;
    b1 =fColor      & 0x1F;

    // 提取背景色分量
    r2 = (bColor >> 11) & 0x1F;
    g2 = (bColor >> 5)& 0x3F;
    b2 =bColor      & 0x1F;

    // 每行字节数
    bytesPerLine = (w + 3) / 4;

    LCD_Address_Set(x, y, x + w - 1, y + h - 1);

    for (i = 0; i < h; i++)
    {
      for (j = 0; j < w; j++)
      {
            byteIndex = i * bytesPerLine + (j / 4);
            pixelData = gray;
            shift = (3 - (j % 4)) * 2;
            grayVal = (pixelData >> shift) & 0x03;

            // 灰度映射 0~3 => 0, 85, 170, 255
            alpha = grayVal * 85;

            // 简单Alpha混合
            r = (r1 * alpha + r2 * (255 - alpha)) / 255;
            g = (g1 * alpha + g2 * (255 - alpha)) / 255;
            b = (b1 * alpha + b2 * (255 - alpha)) / 255;

            color = ((r & 0x1F) << 11) | ((g & 0x3F) << 5) | (b & 0x1F);
            LCD_WR_DATA16(color);
      }
    }
}
页: [1]
查看完整版本: 各位高手,数字取模后边缘毛刺,有什么方法处理,