From: p15692025051 <846603105@qq.com> Date: Wed, 31 May 2023 03:47:39 +0000 (+0800) Subject: 1.文档提交 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=d15d0dc33eb15e4d3275d618a50b09328154f55e;p=mirrors%2FBT8958.git 1.文档提交 --- d15d0dc33eb15e4d3275d618a50b09328154f55e diff --git "a/1.doc/6_15\344\272\244\344\273\230\345\252\222\344\275\223\346\222\255\346\224\276\345\231\250\344\272\244\344\272\222.pdf" "b/1.doc/6_15\344\272\244\344\273\230\345\252\222\344\275\223\346\222\255\346\224\276\345\231\250\344\272\244\344\272\222.pdf" new file mode 100644 index 0000000..e51a53a Binary files /dev/null and "b/1.doc/6_15\344\272\244\344\273\230\345\252\222\344\275\223\346\222\255\346\224\276\345\231\250\344\272\244\344\272\222.pdf" differ diff --git "a/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/RV32-Toolchain-Setup_v1.2.6.zip" "b/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/RV32-Toolchain-Setup_v1.2.6.zip" new file mode 100644 index 0000000..d57edf5 Binary files /dev/null and "b/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/RV32-Toolchain-Setup_v1.2.6.zip" differ diff --git "a/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/codeblocks-20.03-setup.zip" "b/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/codeblocks-20.03-setup.zip" new file mode 100644 index 0000000..3079ee8 Binary files /dev/null and "b/1.doc/895X\345\205\245\351\227\250\344\271\213\345\274\200\345\217\221\347\216\257\345\242\203\345\256\211\350\243\205/codeblocks-20.03-setup.zip" differ diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\211\223\345\214\205\345\233\276\347\211\207.docx" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\211\223\345\214\205\345\233\276\347\211\207.docx" new file mode 100644 index 0000000..2f2d69f Binary files /dev/null and "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\211\223\345\214\205\345\233\276\347\211\207.docx" differ diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/README.md" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/README.md" new file mode 100644 index 0000000..b772336 --- /dev/null +++ "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/README.md" @@ -0,0 +1,61 @@ +# 常用命令 + +分为 lv 图片转换与 bin 打包,两者可以合并使用;下面有简单介绍,更多详情请查看 `image_tool.exe --help` + +一个完整的使用示例 + +```shell +./image_tool.exe --path res0 --recursive --conv-type jpg,png --conv-color-type RGB565 --pack-type bin --pack-cheader-name res0.h --pack-cheader-value-wrapper MACRO --pack-bheader-name res0.bin --pack-bheader-size --pack-bheader-checksum --pack-preprocess ./ResCompress.exe + +./image_tool.exe --path res1 --recursive --conv-type jpg,png --conv-color-type RGB565 --pack-type bin --pack-cheader-name res1.h --pack-cheader-value-wrapper MACRO --pack-bheader-name res1.bin --pack-bheader-size --pack-bheader-checksum --pack-preprocess ./ResCompress.exe + +./image_tool.exe --path res2 --recursive --pack-type mp3 --pack-cheader-name res2.h --pack-cheader-value-wrapper MACRO --pack-bheader-name res2.bin --pack-cheader-keep-file-type --pack-cheader-macro-upper --pack-cheader-res-name-prefix RES_BUF_ --pack-cheader-res-size --pack-cheader-res-size-prefix RES_LEN_ --pack-bheader-size --pack-bheader-checksum + +./image_tool.exe --path . --pack-type bin --pack-cheader-name res --pack-bheader-name res.bin --pack-cheader-macro-upper --pack-section-file section.json +``` + +## lv 图片转换 + +```shell +image_tool.exe --path tmp --recursive --conv-type jpg,png --conv-color-type RGB565 +``` + +## bin 打包 + +### 简单的 bin 打包 + +打包 images 下的所有 bin 文件,头部添加长度与校验和,长度不包含头的长度;并生成头文件与打包后的 bin 文件 + +```shell +image_tool.exe --path images --recursive --pack-type bin --pack-cheader-name ui --pack-cheader-value-wrapper MACRO --pack-bheader-name res.bin --pack-bheader-size --pack-bheader-checksum +``` + +### 指定区域的 bin 打包 + +在上面的基础上,通过 section.json 文件,指定 bin 文件存储区域的位置与大小; + +json 的格式如下;区域名写在 `index` 中,然后区域的具体描述写在下方,需要包含 `file` `addr` `len` 三个部分的描述,`file` 为 bin 文件的名字,`addr` 为区域开始位置,`len` 为区域长度;`addr` 与 `len` 都需要为十六进制 + +区域中,没有数据的部分会填充 `0xff`,但是也只是填充在区域中剩余的部分;比如 `res0` 中,`file` 的长度只有 0x100,那么只会从 0x100 开始填充 0xff,填充到末尾的 0x30000 前的地址 + +```json +{ + "index": ["res0", "res1"], + "res0": { + "file": "test1.bin", + "addr": "0x0", + "len": "0x30000" + }, + "res1": { + "file": "test2.bin", + "addr": "0x50000", + "len": "0x30000" + } +} +``` + +调用时通过 `--pack-section-file` 指定具体的文件名 + +```shell +image_tool.exe --path . --pack-type bin --pack-cheader-name ui --pack-cheader-value-wrapper MACRO --pack-bheader-name res.bin --pack-bheader-size --pack-bheader-checksum --pack-section-file section.json +``` diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/ResCompress.exe" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/ResCompress.exe" new file mode 100644 index 0000000..13a0a36 Binary files /dev/null and "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/ResCompress.exe" differ diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/image_tool.exe" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/image_tool.exe" new file mode 100644 index 0000000..a826930 Binary files /dev/null and "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/image_tool.exe" differ diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/release_log.md" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/release_log.md" new file mode 100644 index 0000000..bb5c1ef --- /dev/null +++ "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/release_log.md" @@ -0,0 +1,55 @@ +# 更新说明 + +## 1.1.7 + ++ 修复lv转图的问题 + +## 1.1.6 + ++ 生成的头文件中,res name 与 res size 可以通过 `--pack-cheader-res-name-prefix` `--pack-cheader-res-name-suffix` `--pack-cheader-res-size-prefix` `--pack-cheader-res-size-suffix` 配置前后缀,res size 可以通过 `--pack-cheader-res-size` 开启 ++ 添加音频打包的示例 + +## 1.1.5 + ++ 优化错误信息的输出 + +## 1.1.4 + ++ 修复没有使能 bheader-size 的时候,生成的头文件偏移错误 ++ 修复分段打包 bin 文件时,生成的头文件中的长度宏的问题 + +## 1.1.3 + ++ bin 分段打包的时候,支持头文件中,资源的基地址自定义,通过在配置文件中添加 `base_addr` 键值对实现 ++ bin 打包生成的资源地址宏名后,添加 `_ADDR` 后缀 + +## 1.1.2 + ++ 分段打包生成的头文件,增加宏指定实际长度 + +## 1.1.1 + ++ 修复通过 section.json 打包生成的头文件,偏移地址存在的问题 + +## 1.1.0 + ++ 全部程序完成重写,减少可执行文件的体积,提升运行速度 ++ 支持 bin 分段打包,需要配置 section.json 文件 + +## 1.0.10 + ++ 重写了转图的 lv_img_conv.exe,现在转图速度起码10倍的提升 + +## 1.0.9 + ++ 修复生成的 bin 中的 file_size 计算错误 ++ 默认 bin 中的 file_size 不包含头长度,需要包含头长度的话可以使能 `--file_size_contain_header` + +## 1.0.8 + ++ 修复不转图时,未配置 `--header_macro_upper` 时,头文件名的宏也转大写的问题 + +## 1.0.7 + ++ 默认头文件的宏名不再大写,需要大写可以配置 `--header_macro_upper` ++ 头文件中的地址前,没有宏时,默认不再添加括号;从 `#define RES (1)` 转为 `#define RES 1` diff --git "a/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/section.json" "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/section.json" new file mode 100644 index 0000000..8abeb95 --- /dev/null +++ "b/1.doc/ui\346\211\223\345\214\205\350\257\264\346\230\216/image_tool_1.1.7/section.json" @@ -0,0 +1,14 @@ +{ + "base_addr": "0x1000", + "index": ["res0", "res1"], + "res0": { + "file": "res0.bin", + "addr": "0x0", + "len": "0x40000" + }, + "res1": { + "file": "res1.bin", + "addr": "0x50000", + "len": "0x40000" + } +} diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\267\273\345\212\240\346\226\260\345\233\276\347\211\207.docx" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\267\273\345\212\240\346\226\260\345\233\276\347\211\207.docx" new file mode 100644 index 0000000..ba607f2 Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/895x_\345\246\202\344\275\225\346\267\273\345\212\240\346\226\260\345\233\276\347\211\207.docx" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Mutiple_image_convert.png" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Mutiple_image_convert.png" new file mode 100644 index 0000000..ea3d715 Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Mutiple_image_convert.png" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Readme.md" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Readme.md" new file mode 100644 index 0000000..de3738b --- /dev/null +++ "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/Readme.md" @@ -0,0 +1,75 @@ +2020-01-08: + +修复了工具当前预览的图片被锁定无法外部修改的问题 + +2019-12-22: + +增加了图片批量转换,并将图片名称作为转换后的文件名和变量名 +1. 由于图片名可能作为转换后的变量名,增加了对图片名的规范检测,大体同前一个版本的lv_img_dsc_t检测一致 +2. 根据lvgl支持的图片种类做了分类 +3. 对各个图片加了转换前的检测结果及转换后的转换结果的tip提示 +大致如下: + + +![批量转换示意图](https://images.gitee.com/uploads/images/2020/0423/101323_df096bf2_5033673.png) + + +2019-11-20: + +增加了对转换操作结果的验证,避免了转换图片时界面卡死的问题 + +添加了原php环境下的内存限制设置参数 + +对于转换提示的问题: + +1.在转换图片时,提示转换成功,但找不到转换后的文件 + + 原因:图片分辨率过大,修改php环境内存限制参数 + + 解决办法:修改转换工具根目录下php.ini配置文件 +```php +memory_limit = _xxx_M // _xxx_ 根据实际使用修改该值,图片分辨率越大,需要设置的值就越大 +``` + +2.在转换图片时,提示转换失败 + + 原因1:图片分辨率过大,转换时间太长(这么大的图片……),超时了 + 原因2:图片资源编码问题,测试发现截屏保存的图片不能直接转换,否则转换失败,先使用图片编辑工具打开,然后另存就可以了 + + 目前发现以上问题 + +2019-11-16: + +## 界面如下 +设置输出文件类型,c测试没问题,bin格式没用到,如果有用到的朋友欢迎反馈 + +![设置输出文件类型](https://images.gitee.com/uploads/images/2020/0423/100538_24dd6afd_5033673.png) + +转换方式跟官方网页一样 + +![设置图片转换方式](https://images.gitee.com/uploads/images/2020/0423/100538_51e7fad4_5033673.png) + +lv_img_dsc_t,为生成的c文件下该图片资源的名字 + + +2019-11-15: + +## 说明 + +软件为基于LVGL离线版图片转换封装的小工具,避免了常使用界面工具的朋友操作控制台指令的不便利 + +运行环境为windows + +修改了原官方离线版php文件接口,便于保存到指定目录 + +避免计算机没有php环境,在工具所在目录配置了一个php小环境(人懒,php不懂瞎裁) + + + +## 初衷 + +手头项目用到lvgl做界面设计,前期在lvgl官网做图片转换,感觉挺好 但界面嘛,美观度重口难调,所以这周把界面元素重设计了一遍, 然后昨天在官网做转换时,下载n次失败……所以就有了这个基于官方离线版封装的转换工具,有问题可以通过软件界面的qq和邮箱联系我 + +## 后续 + +如果后面有时间或者用到的话,加一个批量转换的。。。这个先用吧 diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/img_conv_core.php" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/img_conv_core.php" new file mode 100644 index 0000000..31c252b --- /dev/null +++ "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/img_conv_core.php" @@ -0,0 +1,828 @@ +dith = $dith; + $this->out_name = $out_name; + $this->path = $path; + $this->output_dir = $output; + + $size = getimagesize($path); + $this->w = $size[0]; + $this->h = $size[1]; + + $ext = pathinfo($real_name, PATHINFO_EXTENSION); + if(!strcmp(strtolower($ext), "png")) $this->img = imagecreatefrompng($path); + else if(!strcmp(strtolower($ext), "bmp")) $this->img = imagecreatefrombmp($path); + else if(!strcmp(strtolower($ext), "jpg")) $this->img = imagecreatefromjpeg($path); + else if(!strcmp(strtolower($ext), "jpeg")) $this->img = imagecreatefromjpeg($path); + else { + echo("$ext is a not supported image type. use png, jpg, jpeg or bmp"); + exit(1); + } + + $this->r_earr = array(); /*Classification error for next row of pixels*/ + $this->g_earr = array(); + $this->b_earr = array(); + + if($this->dith) { + for($i = 0; $i < $this->w + 2; ++$i){ + $this->r_earr[$i] = 0; + $this->g_earr[$i] = 0; + $this->b_earr[$i] = 0; + } + } + + $this->r_nerr = 0; /*Classification error for next pixel*/ + $this->g_nerr = 0; + $this->b_nerr = 0; + } + + function convert($cf, $alpha = 0) { + $this->cf = $cf; + $this->d_out = array(); + $this->alpha = $alpha; + + if($this->cf == self::CF_RAW || $this->cf == self::CF_RAW_ALPHA || $this->cf == self::CF_RAW_CHROMA) { + $myfile = fopen($this->path, "r") or die("Unable to open file!"); + $this->d_out = unpack('C*', fread($myfile, filesize($this->path))); + fclose($myfile); + return; + } + + $palette_size = 0; + if($this->cf == self::CF_INDEXED_1_BIT) $palette_size = 2; + if($this->cf == self::CF_INDEXED_2_BIT) $palette_size = 4; + if($this->cf == self::CF_INDEXED_4_BIT) $palette_size = 16; + if($this->cf == self::CF_INDEXED_8_BIT) $palette_size = 256; + + if($palette_size) { + $img_tmp = imagecreatetruecolor($this->w, $this->h); + imagecopy ($img_tmp, $this->img, 0 , 0 , 0 , 0, $this->w , $this->h); + imagetruecolortopalette($this->img, false, $palette_size); + $real_palette_size = imagecolorstotal($this->img); /*The real number of colos in the image's palette*/ + for($i = 0; $i < $palette_size; $i++) { + if($i < $real_palette_size) { + $c = imagecolorsforindex ($this->img , $i); + array_push($this->d_out, $c['blue'], $c['green'], $c['red'], 0xFF); + } else { + array_push($this->d_out, 0xFF, 0xFF, 0xFF, 0xFF); + } + } + } + + /*Convert all the pixels*/ + for($y = 0; $y < $this->h; $y++) { + $this->dith_reset(); + + for($x = 0; $x < $this->w; ++$x){ + $this->conv_px($x, $y); + } + } + + /*Revert the original image if it was converted to indexed*/ + if($palette_size) { + imagecopy ($this->img, $img_tmp, 0 , 0 , 0 , 0 , $this->w , $this->h); + } + } + + function format_to_c_array() { + + $c_array = ""; + $i = 0; + $y_end = $this->h; + $x_end = $this->w; + + if($this->cf == self::CF_TRUE_COLOR_332) { + $c_array .= "\n#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8"; + if(!$this->alpha) $c_array .= "\n /*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/"; + else $c_array .= "\n /*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/"; + } else if($this->cf == self::CF_TRUE_COLOR_565) { + $c_array .= "\n#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0"; + if(!$this->alpha) $c_array .= "\n /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/"; + else $c_array .= "\n /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/"; + } else if($this->cf == self::CF_TRUE_COLOR_565_SWAP) { + $c_array .= "\n#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0"; + if(!$this->alpha) $c_array .= "\n /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/"; + else $c_array .= "\n /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/"; + } else if($this->cf == self::CF_TRUE_COLOR_888) { + $c_array .= "\n#if LV_COLOR_DEPTH == 32"; + if(!$this->alpha) $c_array .= "\n /*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/"; + else "\n /*Pixel format: Alpha 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/"; + } else if($this->cf == self::CF_INDEXED_1_BIT) { + $c_array .= "\n"; + for($p = 0; $p < 2; $p ++) { + $c_array .= " 0x" . str_pad(dechex($this->d_out[$p * 4 + 0]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 1]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 2]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 3]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "\t/*Color of index $p*/\n"; + } + + $i = $p * 4; + } + else if($this->cf == self::CF_INDEXED_2_BIT) { + $c_array .= "\n"; + for($p = 0; $p < 4; $p ++) { + $c_array .= " 0x" . str_pad(dechex($this->d_out[$p * 4 + 0]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 1]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 2]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 3]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "\t/*Color of index $p*/\n"; + } + + $i = $p * 4; + } + else if($this->cf == self::CF_INDEXED_4_BIT) { + $c_array .= "\n"; + for($p = 0; $p < 16; $p ++) { + $c_array .= " 0x" . str_pad(dechex($this->d_out[$p * 4 + 0]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 1]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 2]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 3]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "\t/*Color of index $p*/\n"; + } + + $i = $p * 4; + } + else if($this->cf == self::CF_INDEXED_8_BIT) { + $c_array .= "\n"; + for($p = 0; $p < 256; $p ++) { + $c_array .= " 0x" . str_pad(dechex($this->d_out[$p * 4 + 0]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 1]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 2]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "0x" . str_pad(dechex($this->d_out[$p * 4 + 3]), 2, '0', STR_PAD_LEFT) . ", "; + $c_array .= "\t/*Color of index $p*/\n"; + } + + $i = $p * 4; + } + else if($this->cf == self::CF_RAW || $this->cf == self::CF_RAW_ALPHA || $this->cf == self::CF_RAW_CHROMA) { + $y_end = 1; + $x_end = count($this->d_out); + $i = 1; + } + + + for($y = 0; $y < $y_end; $y++) { + $c_array .= "\n "; + for($x = 0; $x < $x_end; $x++) { + if($this->cf == self::CF_TRUE_COLOR_332) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + if($this->alpha) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + } + else if($this->cf == self::CF_TRUE_COLOR_565 || $this->cf == self::CF_TRUE_COLOR_565_SWAP) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + if($this->alpha) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + } + else if($this->cf == self::CF_TRUE_COLOR_888) { + + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; $i++; + } + else if($this->cf == self::CF_ALPHA_1_BIT || $this->cf == self::CF_INDEXED_1_BIT) { + if(($x & 0x7) == 0) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + } + else if($this->cf == self::CF_ALPHA_2_BIT || $this->cf == self::CF_INDEXED_2_BIT) { + if(($x & 0x3) == 0) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + } + else if($this->cf == self::CF_ALPHA_4_BIT || $this->cf == self::CF_INDEXED_4_BIT) { + if(($x & 0x1) == 0) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + } + else if($this->cf == self::CF_ALPHA_8_BIT || $this->cf == self::CF_INDEXED_8_BIT) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + $i++; + } + else if($this->cf == self::CF_RAW || $this->cf == self::CF_RAW_ALPHA || $this->cf == self::CF_RAW_CHROMA) { + $c_array .= "0x" . str_pad(dechex($this->d_out[$i]), 2, '0', STR_PAD_LEFT) . ", "; + if($i != 0 && (($i % 16) == 0)) $c_array .= "\n "; + $i++; + } + } + } + + if($this->cf == self::CF_TRUE_COLOR_332 || $this->cf == self::CF_TRUE_COLOR_565 || $this->cf == self::CF_TRUE_COLOR_565_SWAP || $this->cf == self::CF_TRUE_COLOR_888) { + $c_array .= "\n#endif"; + } + + return $c_array; + + } + + function get_c_header() { + $c_header = + "#include \"lvgl/lvgl.h\" + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +"; + $attr_name = "LV_ATTRIBUTE_IMG_" . strtoupper($this->out_name); + $c_header .= +"#ifndef $attr_name +#define $attr_name +#endif + +const LV_ATTRIBUTE_MEM_ALIGN $attr_name uint8_t " . $this->out_name . "_map[] = {"; + + return $c_header; + } + + function get_c_footer($cf) { + $c_footer = + "\n};\n +const lv_img_dsc_t " . $this->out_name . " = { + .header.always_zero = 0, + .header.w = " . $this->w . ", + .header.h = " . $this->h . ",\n"; + + if($cf == self::CF_TRUE_COLOR) $c_footer .= " .data_size = " . $this->w * $this->h . " * LV_COLOR_SIZE / 8,\n .header.cf = LV_IMG_CF_TRUE_COLOR,"; + else if($cf == self::CF_TRUE_COLOR_ALPHA) $c_footer .= " .data_size = " . $this->w * $this->h . " * LV_IMG_PX_SIZE_ALPHA_BYTE,\n .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,"; + else if($cf == self::CF_TRUE_COLOR_CHROMA) $c_footer .= " .data_size = " . $this->w * $this->h . " * LV_COLOR_SIZE / 8,\n .header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED,"; + else if($cf == self::CF_ALPHA_1_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_ALPHA_1BIT,"; + else if($cf == self::CF_ALPHA_2_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_ALPHA_2BIT,"; + else if($cf == self::CF_ALPHA_4_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_ALPHA_4BIT,"; + else if($cf == self::CF_ALPHA_8_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_ALPHA_8BIT,"; + else if($cf == self::CF_INDEXED_1_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_INDEXED_1BIT,"; + else if($cf == self::CF_INDEXED_2_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_INDEXED_2BIT,"; + else if($cf == self::CF_INDEXED_4_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_INDEXED_4BIT,"; + else if($cf == self::CF_INDEXED_8_BIT) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_INDEXED_8BIT,"; + else if($cf == self::CF_RAW) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_RAW,"; + else if($cf == self::CF_RAW_ALPHA) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_RAW_ALPHA,"; + else if($cf == self::CF_RAW_CHROMA) $c_footer .= " .data_size = " . count($this->d_out) . ",\n .header.cf = LV_IMG_CF_RAW_CHROMA_KEYED,"; + + $c_footer .= "\n .data = " . $this->out_name . "_map, +};\n"; + + return $c_footer; + } + + function download_c($name, $cf = -1, $content = ""){ + global $offline; + + if(strlen($content) < 1) { + $content = $this->format_to_c_array(); + } + + if($cf < 0) $cf = $this->cf; + + $out = $this->get_c_header() . $content . "" . $this->get_c_footer($cf); + $name = $name . ".c"; + + if($offline){ + $name = $this->output_dir.$name; + $file = fopen($name, "w"); + fwrite($file, $out); + fclose($file); + } + else{ + header('Content-Type: application/text'); + header('Content-disposition: attachment; filename='.$name); + header('Content-Length: ' . strlen($out)); + + echo($out); + + } + } + + + function download_bin($name, $cf = -1, $content = 0){ + global $offline; + + if($content == 0) { + $content = $this->d_out; + } + + if($cf < 0) $cf = $this->cf; + $name .= ".bin"; + + $lv_cf = 4; /*Color format in LittlevGL*/ + switch($cf) { + case self::CF_TRUE_COLOR: + $lv_cf = 4; break; + case self::CF_TRUE_COLOR_ALPHA: + $lv_cf = 5; break; + case self::CF_TRUE_COLOR_CHROMA: + $lv_cf = 6; break; + case self::CF_INDEXED_1_BIT: + $lv_cf = 7; break; + case self::CF_INDEXED_2_BIT: + $lv_cf = 8; break; + case self::CF_INDEXED_4_BIT: + $lv_cf = 9; break; + case self::CF_INDEXED_8_BIT: + $lv_cf = 10; break; + case self::CF_ALPHA_1_BIT: + $lv_cf = 11; break; + case self::CF_ALPHA_2_BIT: + $lv_cf = 12; break; + case self::CF_ALPHA_4_BIT: + $lv_cf = 13; break; + case self::CF_ALPHA_8_BIT: + $lv_cf = 14; break; + } + + + $header = $lv_cf + ($this->w << 10) + ($this->h << 21); + $header_bin = pack("V", $header); + + $content = pack("C*", ...$content); + + if($offline){ + $name = $this->output_dir.$name; + $file = fopen($name, "w"); + fwrite($file, $header_bin); + fwrite($file, $content); + fclose($file); + } + else{ + $len = strlen($content) + 4; + header('Content-Type: application/text'); + header('Content-disposition: attachment; filename='.$name); + header('Content-Length:' . $len); + echo($header_bin[0]); + echo($header_bin[1]); + echo($header_bin[2]); + echo($header_bin[3]); + echo($content); + + + } + } + + private function conv_px($x, $y) { + $c = imagecolorat($this->img, $x, $y); + if($this->alpha){ + $a = ($c & 0xff000000) >> 23; /*Alpha is 7 bit*/ + if($a & 0x02) $a |= 0x01; /*Repeate the last bit: 0000000 -> 00000000; 1111110 -> 11111111*/ + $a = 255 - $a; + } else { + $a = 0xff; + } + $r = ($c & 0x00ff0000) >> 16; + $g = ($c & 0x0000ff00) >> 8; + $b = ($c & 0x000000ff) >> 0; + + $this->dith_next($r, $g, $b, $x); + + if($this->cf == self::CF_TRUE_COLOR_332) { + $c8 = ($this->r_act) | ($this->g_act >> 3) | ($this->b_act >> 6); //RGB332 + array_push($this->d_out, $c8); + if($this->alpha) array_push($this->d_out, $a); + } else if($this->cf == self::CF_TRUE_COLOR_565) { + $c16 = (($this->r_act) << 8) | (($this->g_act) << 3) | (($this->b_act) >> 3); //RGR565 + array_push($this->d_out, $c16 & 0xFF); + array_push($this->d_out, ($c16 >> 8) & 0xFF); + if($this->alpha) array_push($this->d_out, $a); + } else if($this->cf == self::CF_TRUE_COLOR_565_SWAP) { + $c16 = (($this->r_act) << 8) | (($this->g_act) << 3) | (($this->b_act) >> 3); //RGR565 + array_push($this->d_out, ($c16 >> 8) & 0xFF); + array_push($this->d_out, $c16 & 0xFF); + if($this->alpha) array_push($this->d_out, $a); + } else if($this->cf == self::CF_TRUE_COLOR_888) { + array_push($this->d_out, $this->b_act); + array_push($this->d_out, $this->g_act); + array_push($this->d_out, $this->r_act); + array_push($this->d_out, $a); + } else if($this->cf == self::CF_ALPHA_1_BIT) { + $w = $this->w >> 3; + if($this->w & 0x07) $w++; + $p = $w * $y + ($x >> 3); + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + if($a > 0x80) { + $this->d_out[$p] |= 1 << (7 - ($x & 0x7)); + } + } + else if($this->cf == self::CF_ALPHA_2_BIT) { + $w = $this->w >> 2; + if($this->w & 0x03) $w++; + + $p = $w * $y + ($x >> 2); + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + $this->d_out[$p] |= ($a >> 6) << (6 - (($x & 0x3) * 2)); + } + else if($this->cf == self::CF_ALPHA_4_BIT) { + $w = $this->w >> 1; + if($this->w & 0x01) $w++; + + $p = $w * $y + ($x >> 1); + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + $this->d_out[$p] |= ($a >> 4) << (4 - (($x & 0x1) * 4)); + } + else if($this->cf == self::CF_ALPHA_8_BIT) { + $p = $this->w * $y + $x; + $this->d_out[$p] = $a; + } + else if($this->cf == self::CF_INDEXED_1_BIT) { + $w = $this->w >> 3; + if($this->w & 0x07) $w++; + + $p = $w * $y + ($x >> 3) + 8; /* +8 for the palette*/ + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + $this->d_out[$p] |= ($c & 0x1) << (7 - ($x & 0x7)); + } + else if($this->cf == self::CF_INDEXED_2_BIT) { + $w = $this->w >> 2; + if($this->w & 0x03) $w++; + + $p = $w * $y + ($x >> 2) + 16; /* +16 for the palette*/ + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + $this->d_out[$p] |= ($c & 0x3) << (6 - (($x & 0x3) * 2)); + } + else if($this->cf == self::CF_INDEXED_4_BIT) { + $w = $this->w >> 1; + if($this->w & 0x01) $w++; + + $p = $w * $y + ($x >> 1) + 64; /* +64 for the palette*/ + if(!isset($this->d_out[$p])) $this->d_out[$p] = 0; /*Clear the bits first*/ + $this->d_out[$p] |= ($c & 0xF) << (4 - (($x & 0x1) * 4)); + } + else if($this->cf == self::CF_INDEXED_8_BIT) { + $p = $this->w * $y + $x + 1024; /* +1024 for the palette*/ + $this->d_out[$p] = $c & 0xFF; + } + } + + private function dith_reset() { + if($this->dith){ + $this->r_nerr = 0; + $this->g_nerr = 0; + $this->b_nerr = 0; + } + } + + private function dith_next($r, $g, $b, $x) { + + if($this->dith){ + $this->r_act = $r + $this->r_nerr + $this->r_earr[$x+1]; + $this->r_earr[$x+1] = 0; + + $this->g_act = $g + $this->g_nerr + $this->g_earr[$x+1]; + $this->g_earr[$x+1] = 0; + + $this->b_act = $b + $this->b_nerr + $this->b_earr[$x+1]; + $this->b_earr[$x+1] = 0; + + if($this->cf == self::CF_TRUE_COLOR_332) { + $this->r_act = $this->classify_pixel($this->r_act, 3); + $this->g_act = $this->classify_pixel($this->g_act, 3); + $this->b_act = $this->classify_pixel($this->b_act, 2); + + if($this->r_act > 0xE0) $this->r_act = 0xE0; + if($this->g_act > 0xE0) $this->g_act = 0xE0; + if($this->b_act > 0xC0) $this->b_act = 0xC0; + + } else if($this->cf == self::CF_TRUE_COLOR_565 || $this->cf == self::CF_TRUE_COLOR_565_SWAP) { + $this->r_act = $this->classify_pixel($this->r_act, 5); + $this->g_act = $this->classify_pixel($this->g_act, 6); + $this->b_act = $this->classify_pixel($this->b_act, 5); + + if($this->r_act > 0xF8) $this->r_act = 0xF8; + if($this->g_act > 0xFC) $this->g_act = 0xFC; + if($this->b_act > 0xF8) $this->b_act = 0xF8; + + } else if($this->cf == self::CF_TRUE_COLOR_888) { + $this->r_act = $this->classify_pixel($this->r_act, 8); + $this->g_act = $this->classify_pixel($this->g_act, 8); + $this->b_act = $this->classify_pixel($this->b_act, 8); + + if($this->r_act > 0xFF) $this->r_act = 0xFF; + if($this->g_act > 0xFF) $this->g_act = 0xFF; + if($this->b_act > 0xFF) $this->b_act = 0xFF; + } + + $this->r_err = $r - $this->r_act; + $this->g_err = $g - $this->g_act; + $this->b_err = $b - $this->b_act; + + $this->r_nerr = round((7 * $this->r_err) / 16); + $this->g_nerr = round((7 * $this->g_err) / 16); + $this->b_nerr = round((7 * $this->b_err) / 16); + + $this->r_earr[$x] += round((3 * $this->r_err) / 16); + $this->g_earr[$x] += round((3 * $this->g_err) / 16); + $this->b_earr[$x] += round((3 * $this->b_err) / 16); + + $this->r_earr[$x+1] += round((5 * $this->r_err) / 16); + $this->g_earr[$x+1] += round((5 * $this->g_err) / 16); + $this->b_earr[$x+1] += round((5 * $this->b_err) / 16); + + $this->r_earr[$x+2] += round($this->r_err / 16); + $this->g_earr[$x+2] += round($this->g_err / 16); + $this->b_earr[$x+2] += round($this->b_err / 16); + } + else{ + if($this->cf == self::CF_TRUE_COLOR_332) { + $this->r_act = $this->classify_pixel($r, 3); + $this->g_act = $this->classify_pixel($g, 3); + $this->b_act = $this->classify_pixel($b, 2); + + if($this->r_act > 0xE0) $this->r_act = 0xE0; + if($this->g_act > 0xE0) $this->g_act = 0xE0; + if($this->b_act > 0xC0) $this->b_act = 0xC0; + + } else if($this->cf == self::CF_TRUE_COLOR_565 || $this->cf == self::CF_TRUE_COLOR_565_SWAP) { + $this->r_act = $this->classify_pixel($r, 5); + $this->g_act = $this->classify_pixel($g, 6); + $this->b_act = $this->classify_pixel($b, 5); + + if($this->r_act > 0xF8) $this->r_act = 0xF8; + if($this->g_act > 0xFC) $this->g_act = 0xFC; + if($this->b_act > 0xF8) $this->b_act = 0xF8; + + } else if($this->cf == self::CF_TRUE_COLOR_888) { + $this->r_act = $this->classify_pixel($r, 8); + $this->g_act = $this->classify_pixel($g, 8); + $this->b_act = $this->classify_pixel($b, 8); + + if($this->r_act > 0xFF) $this->r_act = 0xFF; + if($this->g_act > 0xFF) $this->g_act = 0xFF; + if($this->b_act > 0xFF) $this->b_act = 0xFF; + } + } + } + + private function classify_pixel($value, $bits){ + $tmp = 1 << (8 - $bits); + $val = round($value / $tmp, 0, PHP_ROUND_HALF_DOWN) * $tmp; + if($val < 0) $val = 0; + return $val; + } +} + +$offline = 0; +if (!isset($_SERVER["HTTP_HOST"])) { + parse_str($argv[1], $_POST); + $offline = 1; +} + + +if($offline == 0){ + /*The scripts runs ONLINE (likely on littelvgl.com)*/ + header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + + $img_file = $_FILES["img_file"]["tmp_name"]; + $img_file_name = $_FILES["img_file"]["name"]; + $output_name = $_POST["name"]; + $cf = $_POST["cf"]; + $format = $_POST["format"]; + $dith = $_POST["dith"]; +} +else{ + /*The scripts runs OFFLINE (likely in command)*/ + if(isset($_POST["name"])){ + $output_name = $_POST["name"]; + echo"Convert:".$output_name; + } + else{ + echo("Mising Name\n"); + exit(0); + } + + if(isset($_POST["img"])){ + $img_file = $_POST["img"]; + $img_file_name = $_POST["img"]; + echo "\nimg=".$img_file; + } + else{ + echo("Mising image file\n"); + exit(0); + } + + if(isset($_POST["format"])){ + $format = $_POST["format"]; + } + else{ + $format = "c_array"; + } + + if(isset($_POST["dith"])){ + $dith = $_POST["dith"]; + } + else { + $dith = 0; + } + if(isset($_POST["outdir"])) + { + $outdir = $_POST["outdir"]; + }else + { + $outdir = "./"; + echo "\noutdir=".$outdir; + } + if(isset($_POST["cf"])){ + $cf = $_POST["cf"]; + } + else { + $cf = "true_color"; + } +} + +$conv = new Converter($img_file, $img_file_name,$outdir, $output_name, $dith); + +if(!strcmp($format, "c_array")) { + if(!strcmp($cf, "true_color") || !strcmp($cf, "true_color_alpha") || !strcmp($cf, "true_color_chroma")) { + $alpha = 0; + if(!strcmp($cf, "true_color_alpha")) $alpha = 1; + + $conv->convert($conv::CF_TRUE_COLOR_332, $alpha); + $c_332 = $conv->format_to_c_array(); + + $conv->convert($conv::CF_TRUE_COLOR_565, $alpha); + $c_565 = $conv->format_to_c_array(); + + $conv->convert($conv::CF_TRUE_COLOR_565_SWAP, $alpha); + $c_565_swap = $conv->format_to_c_array(); + + $conv->convert($conv::CF_TRUE_COLOR_888, $alpha); + $c_888 = $conv->format_to_c_array(); + + $c_res = $c_332 . $c_565 . $c_565_swap . $c_888; + + if(!strcmp($cf, "true_color")) $conv->download_c($conv->out_name, $conv::CF_TRUE_COLOR, $c_res); + if(!strcmp($cf, "true_color_alpha")) $conv->download_c($conv->out_name, $conv::CF_TRUE_COLOR_ALPHA, $c_res); + if(!strcmp($cf, "true_color_chroma")) $conv->download_c($conv->out_name, $conv::CF_TRUE_COLOR_CHROMA, $c_res); + } + else if(!strcmp($cf, "alpha_1")) { + $conv->convert($conv::CF_ALPHA_1_BIT, 1); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "alpha_2")) { + $conv->convert($conv::CF_ALPHA_2_BIT, 1); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "alpha_4")) { + $conv->convert($conv::CF_ALPHA_4_BIT, 1); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "alpha_8")) { + $conv->convert($conv::CF_ALPHA_8_BIT, 1); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "indexed_1")) { + $conv->convert($conv::CF_INDEXED_1_BIT); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "indexed_2")) { + $conv->convert($conv::CF_INDEXED_2_BIT); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "indexed_4")) { + $conv->convert($conv::CF_INDEXED_4_BIT); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "indexed_8")) { + $conv->convert($conv::CF_INDEXED_8_BIT); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "raw")) { + $conv->convert($conv::CF_RAW); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "raw_alpha")) { + $conv->convert($conv::CF_RAW_ALPHA, 1); + $conv->download_c($conv->out_name); + } + else if(!strcmp($cf, "raw_chroma")) { + $conv->convert($conv::CF_RAW_CHROMA); + $conv->download_c($conv->out_name); + } +} +/*Binary download*/ +else { + if(!strcmp($cf, "true_color") || !strcmp($cf, "true_color_alpha") || !strcmp($cf, "true_color_chroma")) { + $alpha = 0; + if(!strcmp($cf, "true_color_alpha")) $alpha = 1; + + if (!strcmp($format, "bin_332")) $conv->convert($conv::CF_TRUE_COLOR_332, $alpha); + else if (!strcmp($format, "bin_565")) $conv->convert($conv::CF_TRUE_COLOR_565, $alpha); + else if (!strcmp($format, "bin_565_swap")) $conv->convert($conv::CF_TRUE_COLOR_565_SWAP, $alpha); + else if (!strcmp($format, "bin_888")) $conv->convert($conv::CF_TRUE_COLOR_888, $alpha); + else { + echo("Unknown output file format: $format"); + exit(1); + } + if(!strcmp($cf, "true_color")) $conv->download_bin($conv->out_name, $conv::CF_TRUE_COLOR); + if(!strcmp($cf, "true_color_alpha")) $conv->download_bin($conv->out_name, $conv::CF_TRUE_COLOR_ALPHA); + if(!strcmp($cf, "true_color_chroma")) $conv->download_bin($conv->out_name, $conv::CF_TRUE_COLOR_CHROMA); + } + else if(!strcmp($cf, "alpha_1")) { + $conv->convert($conv::CF_ALPHA_1_BIT, 1); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "alpha_2")) { + $conv->convert($conv::CF_ALPHA_2_BIT, 1); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "alpha_4")) { + $conv->convert($conv::CF_ALPHA_4_BIT, 1); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "alpha_8")) { + $conv->convert($conv::CF_ALPHA_8_BIT, 1); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "indexed_1")) { + $conv->convert($conv::CF_INDEXED_1_BIT); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "indexed_2")) { + $conv->convert($conv::CF_INDEXED_2_BIT); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "indexed_4")) { + $conv->convert($conv::CF_INDEXED_4_BIT); + $conv->download_bin($conv->out_name); + } + else if(!strcmp($cf, "indexed_8")) { + $conv->convert($conv::CF_INDEXED_8_BIT); + $conv->download_bin($conv->out_name); + } +} + + + + +/* +$c_array .= "#include + #include \"lv_conf.h\" + #include \"lvgl/lv_draw/lv_draw.h\""; */ + + +//download("test", $c_565); + +?> diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/lvgl_image_convert.exe" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/lvgl_image_convert.exe" new file mode 100644 index 0000000..c6bf1ff Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/lvgl_image_convert.exe" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.exe" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.exe" new file mode 100644 index 0000000..5d263d5 Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.exe" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.ini" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.ini" new file mode 100644 index 0000000..2df050d --- /dev/null +++ "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php.ini" @@ -0,0 +1,4 @@ +extension_dir = ".\" +extension=php_fileinfo.dll +extension=php_gd2.dll +memory_limit = 512M diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php7.dll" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php7.dll" new file mode 100644 index 0000000..b0fa900 Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php7.dll" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_fileinfo.dll" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_fileinfo.dll" new file mode 100644 index 0000000..6011d8e Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_fileinfo.dll" differ diff --git "a/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_gd2.dll" "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_gd2.dll" new file mode 100644 index 0000000..1bb2d28 Binary files /dev/null and "b/1.doc/ui\346\267\273\345\212\240\350\257\264\346\230\216/Lvgl_image_convert_tool-master/php_gd2.dll" differ diff --git "a/1.doc/\346\231\272\350\203\275\346\211\213\350\241\250-\347\275\221\346\230\223\344\272\221\351\237\263\344\271\220\344\272\244\344\273\230.mg" "b/1.doc/\346\231\272\350\203\275\346\211\213\350\241\250-\347\275\221\346\230\223\344\272\221\351\237\263\344\271\220\344\272\244\344\273\230.mg" new file mode 100644 index 0000000..d8b413a Binary files /dev/null and "b/1.doc/\346\231\272\350\203\275\346\211\213\350\241\250-\347\275\221\346\230\223\344\272\221\351\237\263\344\271\220\344\272\244\344\273\230.mg" differ diff --git "a/1.doc/\351\230\277\351\207\214\344\272\221\347\251\277\346\210\264\350\223\235\347\211\231GATT\350\247\204\350\214\203_0531.pdf" "b/1.doc/\351\230\277\351\207\214\344\272\221\347\251\277\346\210\264\350\223\235\347\211\231GATT\350\247\204\350\214\203_0531.pdf" new file mode 100644 index 0000000..78da495 Binary files /dev/null and "b/1.doc/\351\230\277\351\207\214\344\272\221\347\251\277\346\210\264\350\223\235\347\211\231GATT\350\247\204\350\214\203_0531.pdf" differ