W-Mai / lvgl_image_converter

lvgl image converter
MIT License
54 stars 18 forks source link

使用CF_INDEXED_4_BIT格式时,样图中icon_weather_37_cold.png输出的背景色不对 #4

Open XuBovey opened 2 years ago

XuBovey commented 2 years ago
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ICON_WEATHER_37_COLD uint8_t icon_weather_37_cold_map[] = {
  0x00, 0x00, 0x00, 0xFF,   /*Color of index 0*/
  0x22, 0x80, 0xFF, 0xFF,   /*Color of index 1*/
  0x22, 0x80, 0xFF, 0xFF,   /*Color of index 2*/
  0x20, 0x80, 0xFF, 0xFF,   /*Color of index 3*/
  0x22, 0x80, 0xFF, 0xFF,   /*Color of index 4*/
  0x23, 0x80, 0xFF, 0xFF,   /*Color of index 5*/
  0x21, 0x80, 0xFF, 0xFF,   /*Color of index 6*/
  0x22, 0x80, 0xFF, 0xFF,   /*Color of index 7*/
  0x20, 0x80, 0xFF, 0xFF,   /*Color of index 8*/
  0x22, 0x7F, 0xFF, 0xFF,   /*Color of index 9*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 10*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 11*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 12*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 13*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 14*/
  0xFF, 0xFF, 0xFF, 0xFF,   /*Color of index 15*/

  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 

如上得到的头文件中的内容。

W-Mai commented 2 years ago

我没有进行具体的测试,请问您的上一个pr是不是已经修复该问题了? 或者说,您期待的正确输出是什么。

XuBovey commented 2 years ago

没解决。 这里最后两行的0xFF,对应的是2个像素,,是上面的第15行,应该是第0行,也就是应该是0x00才对。看代码好像用了算法计算得到的。

YutingYou commented 1 month ago

@XuBovey 原因应该在这里, P 模式后获取像素只有 RGB 格式, 没有 ALPHA 通道数据, 所以脚本补 0xFF, 但这会导致不透明像素 (0, 0, 0, 0) 和黑色(0,0,0, alpha) 无法区分.

            for i in range(palette_size):
                if i < real_palette_size:
                    c = getColorFromPalette(real_palette, i)
                    if self.cf_palette_bgr_en == 1:
                        c = [c[2 - i] for i in range(3)]
                    self.d_out.extend(c)
                    self.d_out.append(0xFF)
                else:
                    self.d_out.extend([0xFF, 0xFF, 0xFF, 0xFF])

这里可能可以转换成 RGBA 格式不必转成 P 模式, 然后使用 set() 获取不重复的颜色, 再按色彩值简单排序一下.

W-Mai commented 1 month ago

@XuBovey 原因应该在这里, P 模式后获取像素只有 RGB 格式, 没有 ALPHA 通道数据, 所以脚本补 0xFF, 但这会导致不透明像素 (0, 0, 0, 0) 和黑色(0,0,0, alpha) 无法区分.

            for i in range(palette_size):
                if i < real_palette_size:
                    c = getColorFromPalette(real_palette, i)
                    if self.cf_palette_bgr_en == 1:
                        c = [c[2 - i] for i in range(3)]
                    self.d_out.extend(c)
                    self.d_out.append(0xFF)
                else:
                    self.d_out.extend([0xFF, 0xFF, 0xFF, 0xFF])

这里其实可以转换成 RGBA 格式不必转成 P 模式, 然后使用 set() 获取不重复的颜色, 再按色彩值简单排序一下

还有这个 python 源码有些不 python, python 和 C 代码各种嵌套不太好维护, 建议创建一个输出文件模板, 填充内部字段.

我写了一个新的工具,可以生成 v8 和 v9 的 bin

Python版本的这个工具写的比较早了,当时没有考虑那么多种情况,代码也不够优雅 😔

新的工具转换效率提升了 100~300 倍

YutingYou commented 1 month ago

@W-Mai 谢谢, 我去看看 👍🏻

W-Mai commented 1 month ago

@W-Mai 谢谢, 我去看看 👍🏻

目前还不支持生成 C 格式的 LVGL 图片,如果您有需要的话,我可以在最近更新一下!