使用CF_INDEXED_4_BIT格式时,样图中icon_weather_37_cold.png输出的背景色不对
Opened this issue · 6 comments
XuBovey commented
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
我没有进行具体的测试,请问您的上一个pr是不是已经修复该问题了?
或者说,您期待的正确输出是什么。
XuBovey commented
没解决。
这里最后两行的0xFF,对应的是2个像素,,是上面的第15行,应该是第0行,也就是应该是0x00才对。看代码好像用了算法计算得到的。
YutingYou commented
@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
@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 倍