本帖最后由 KevinLi 于 2025-1-14 20:07 编辑
这几天在学习用python将视频转为一帧帧图像的二维数组,今天尝试把最终输出的Byte数组导入到工程播放,发现画面啥都不是;
然后几个小时前发现了oled_drive_set_pixels函数有点不对劲,刚才才理解这个驱动的帧存储结构。
给像素buff赋值的下标计算公式不对劲:
单色屏幕:像素数=64行*128列;单色,位深为1,所以每像素是1bit 。所以驱动文件中数组大小为 像素数除以8,将8个像素存为一个Byte,也文中就是uint8或uchar型的数组ssd1306_buff
屏幕的buff数组:uint8_t ssd1306_buff[OLED_DISP_HOR_RES * OLED_DISP_VER_RES / 8];
(一个元素1Byte取值是0~255)
数组大小是64 * 128 / 8 = 1024,一帧是1KB。
假设坐标(x:水平左到右,y:竖直上到下)
原本我认为:
每行横着每8个像素(0~7,*)存为1B,比如 第1行前8个像素存到buff[0],第1行 像素9~16存到buff[1];
这样,64行,一行有128/8=16个元素;
如图:
我现在的理解如图:
数组下标为0~127的int元素,其位号0bit存储的是第一行,1bit存储第二行...,7bit,存储第8行;
数组下标为128的int元素,存储的8个像素为第一列的第9~16行像素。
测试代码与图片如下:
对数组元素的0~127,128~255进行写入,对应1~8行与9~16行:
注意看程序bit位,对应屏幕中 粗细线条的位置 : p1是 循环1 设置 前8行的效果(2根线) , p2p~p4 是 循环2 设置 9~16行 的效果(多了3根线)
另外,RISC-V通常是小端存储,wb2是bl604是具有3级流水线的*&% 似乎也是小端存储。
------
(溜了,我去修改我的视频导出程序)
|