f1c100s+lvgl 渐变色显示效果那么差的吗,,移植了lvgl,硬件连接使用RGB666连接 ,lvgl配置为16位色,下载到液晶屏里面效果好差,之前用的stm32+touchgfx使用的还是RGB565,效果完全可以和手机一样,不知道为什么lvgl效果那么差,
大家看看原图第一张,之前用touchgfx就是那个效果,第二个图就是lvgl的效果,这中间 的一圈圈渐变太难受了,lvgl字体显示也比较毛刺,
离线
上图是电脑截屏,下图是实际LCD屏,效果明显不同。
离线
PC上是24位888吧,下面的LCD图看样子是16位565。
离线
图片转成16位时 就容易出现这样的问题,只有用同色填充的时候才不会。
很奇怪
离线
上图是电脑截屏,下图是实际LCD屏,效果明显不同。
我的意思是我另外一个板子用touchgfx做的,液晶屏实际上接线也是565,效果就是好电脑上的效果
离线
我找来了用touchgfx做的界面了,液晶屏是rgb565 16线的,
f1c100s用的还是rgb666 18线,效果完全不能比,我看f1c100s资料里面说支持rgb565抖动模式 ,但是没有找到对应寄存器,lvgl官网的图片转换程序里面勾选抖动和不勾选抖动,出来的c数组都完全一样,不知道是不是lvgl哪里的bug
离线
我估计是touchgfx的开发工具的功劳,它转换过程中用了dither算法,图片就会很自然。
而lvgl的转换工具没有这么牛逼。
离线
这是我的RGB565实物图,效果没有RGB666 18线好的
离线
在https://blog.csdn.net/louyangyang91/article/details/90905465 这看到一篇 RGB888转RGB565 抖动算法
试试这种抖动算法。
https://en.wikipedia.org/wiki/Ordered_dithering
============================================
/* Dither Tresshold for Red Channel */
static const BYTE dither_tresshold_r[64] = {
1, 7, 3, 5, 0, 8, 2, 6,
7, 1, 5, 3, 8, 0, 6, 2,
3, 5, 0, 8, 2, 6, 1, 7,
5, 3, 8, 0, 6, 2, 7, 1,
0, 8, 2, 6, 1, 7, 3, 5,
8, 0, 6, 2, 7, 1, 5, 3,
2, 6, 1, 7, 3, 5, 0, 8,
6, 2, 7, 1, 5, 3, 8, 0
};
/* Dither Tresshold for Green Channel */
static const BYTE dither_tresshold_g[64] = {
1, 3, 2, 2, 3, 1, 2, 2,
2, 2, 0, 4, 2, 2, 4, 0,
3, 1, 2, 2, 1, 3, 2, 2,
2, 2, 4, 0, 2, 2, 0, 4,
1, 3, 2, 2, 3, 1, 2, 2,
2, 2, 0, 4, 2, 2, 4, 0,
3, 1, 2, 2, 1, 3, 2, 2,
2, 2, 4, 0, 2, 2, 0, 4
};
/* Dither Tresshold for Blue Channel */
static const BYTE dither_tresshold_b[64] = {
5, 3, 8, 0, 6, 2, 7, 1,
3, 5, 0, 8, 2, 6, 1, 7,
8, 0, 6, 2, 7, 1, 5, 3,
0, 8, 2, 6, 1, 7, 3, 5,
6, 2, 7, 1, 5, 3, 8, 0,
2, 6, 1, 7, 3, 5, 0, 8,
7, 1, 5, 3, 8, 0, 6, 2,
1, 7, 3, 5, 0, 8, 2, 6
};
/* Get 16bit closest color */
BYTE closest_rb(BYTE c) {
return (c >> 3 << 3); /* red & blue */
}
BYTE closest_g(BYTE c) {
return (c >> 2 << 2); /* green */
}
/* RGB565 */
WORD RGB16BIT(BYTE r, BYTE g, BYTE b) {
return ((WORD)((r>>3)<<11)|((g>>2)<<5)|(b>>3));
}
/* Dithering by individual subpixel */
WORD dither_xy(
int x,
int y,
BYTE r,
BYTE g,
BYTE b
){
/* Get Tresshold Index */
BYTE tresshold_id = ((y & 7) << 3) + (x & 7);
r = closest_rb(
MIN(r + dither_tresshold_r[tresshold_id], 0xff)
);
g = closest_g(
MIN(g + dither_tresshold_g[tresshold_id], 0xff)
);
b = closest_rb(
MIN(b + dither_tresshold_b[tresshold_id], 0xff)
);
return RGB16BIT(r, g, b);
}
/* Dithering Pixel from 32/24bit RGB
*
* GetR, GetG, GetB -> Function to get individual color in pixel
*
*/
WORD dither_color_xy(int x, int y, DWORD col) {
return dither_xy(x, y, GetR(col), GetG(col), GetB(col));
}
/* EXAMPLES */
void ExampleDither1(WORD * dest, DWORD * src, int width, int height){
int x, y;
for (y=0; y<height; y++){
for (x=0; x<width; x++){
int pos = y * width + x;
dest[pos] = dither_color_xy(x,y,src[pos]);
}
}
}
void ExampleDither2(WORD * dest, BYTE * src, int width, int height){
int x, y;
for (y=0; y<height; y++){
for (x=0; x<width; x++){
int pos = y * width + x;
dest[pos] = dither_xy(x,y,src[pos*3],src[pos*3+1],src[pos*3+2]);
}
}
}
楼主可试试看
离线
你们用操作系统的吗
离线
PS对图片做处理呀,处理好后再给lvgl。TOUCHGXF应该是软件做抖动处理了。
离线
PS对图片做处理呀,处理好后再给lvgl。TOUCHGXF应该是软件做抖动处理了。
已经通过外部软件做抖动处理解决了,基本上和touchgfx差不多了
离线
zhaolei26120 说:PS对图片做处理呀,处理好后再给lvgl。TOUCHGXF应该是软件做抖动处理了。
已经通过外部软件做抖动处理解决了,基本上和touchgfx差不多了
什么软件?
离线
zhaolei26120 说:PS对图片做处理呀,处理好后再给lvgl。TOUCHGXF应该是软件做抖动处理了。
已经通过外部软件做抖动处理解决了,基本上和touchgfx差不多了
请教下你用的什么软件呢
离线