文字转成图片,图片用Image2Lcd转灰度图,然后把灰度数据当作alpha通道用,显示出来的字没锯齿,也能换颜色
- /**
- * @brief 显示灰度文字图片,模拟AA效果
- * @param x 起始X坐标
- * @param y 起始Y坐标
- * @param w 图片宽度
- * @param h 图片高度
- * @param *gray 指向灰度图数组
- * @param fColor 前景色 RGB565
- * @param bColor 背景色 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[byteIndex];
- 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);
- }
- }
- }
复制代码
|