智胜电子 发表于 2024-10-29 08:02:02

整张图片取模数字边缘光滑,数字单独取模送显后边缘有毛刺

DebugLab 发表于 2024-10-29 09:02:44

应该是像素数的问题

智胜电子 发表于 2024-10-29 10:07:18

不知是否跟RGB565有关,为节省CPU空间,我用的是单一色

大明狐 发表于 2024-10-29 11:01:58

彩屏的话可能跟图片有关,如果是JPG图片,一些边边角角会有过渡色,让边缘显得顺滑。如果用单色取模,过渡色没有了,就显出锯齿了。

智胜电子 发表于 2024-10-29 13:32:35

我用的是PNG,这有过度色吗?或者有办法把过度色转变成单色的笔画吗?

大明狐 发表于 2024-11-5 09:05:05

本帖最后由 大明狐 于 2024-11-5 09:06 编辑

智胜电子 发表于 2024-10-29 13:32
我用的是PNG,这有过度色吗?或者有办法把过度色转变成单色的笔画吗?
有过渡色。PNG只是最后保存图片的格式,会保留保存前的图片信息,过渡色会根据PNG格式的位数,变成对应的色阶。

在取模工具里,比如STC-ISP或者Img2Lcd,可以在单色模式下,通过拖动亮度对比度等参数的滑条,来决定把过渡色的色阶归为1还是0。
毕竟滑条操作精度有限,如果有更高要求,最好是在PS之类处理软件进行更细致的调整。

不过,只要是单色,就必然有锯齿。“抗锯齿”就是通过用过渡色填充单色锯齿的“缝隙”实现的(就像近视眼摘掉眼镜会看得更顺滑)。
弥补方法要么距离足够远或者增加匀光的遮挡物(不现实),要么使用灰色之类让图案的边缘对比不那么强烈的背景色,欺骗眼睛。

ANop 发表于 前天 14:23

文字转成图片,图片用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]
查看完整版本: 整张图片取模数字边缘光滑,数字单独取模送显后边缘有毛刺