[分享] 【微雪 RP2040双核开发板】 五 图片显示的 四种方式

小火苗   2023-1-12 14:18 楼主

图片显示 4 种方式

资料:

图片显示2.docx (2 MB)
(下载次数: 7, 2023-1-12 14:15 上传)
Image2Lcd2.9.zip (513.02 KB)
(下载次数: 4, 2023-1-12 14:15 上传)
Python.rar (446.12 KB)
(下载次数: 6, 2023-1-12 14:15 上传)

 

前面讲了很多理论,现在来点干的,步骤实践

  • 最简单的图像显示方法

1.使用图片取模软件获取图像点阵数据

image-20230112141339-1.png  

2.图像显示效果,单前使用的单色显示图片90*90

image-20230112141339-2.jpeg  

 

3.程序使用的微雪官方LCDDome,增加了以下代码就实现了操作简单有效。。。

image-20230112141339-3.png  

image-20230112141339-4.png  

 

4.framebuf.MONO_HLSB 帧缓冲区操作如下所示

https://docs.singtown.com/micropython/zh/latest/openmvcam/library/framebuf.html

 

但是pico的内存过于小,单色的240*240的图片都不能一次性全部加载进去。

一张单色图片都要有37k的缓存消耗,而micropico的缓存仅剩19k 芯片缓存在256k左右其余内存应该被c程序和解释器消耗掉了,所以将图片大小改为了90*90,这样刷新速度快。

image-20230112141339-5.png  

image-20230112141339-6.png  

  1. 微雪代码资料,将上面截图代码快增加既可以实现

 

  • 彩色图像显示

本次使用的事将图片生成点阵数据,并将点阵数据存放到内部程序缓存中,由于内部缓存空间限制所以彩色图片进一步缩小尺寸。

1.点阵软件的参数配置如图所示

 

image-20230112141339-7.png  

此工具软件生成的十六进制点阵数据存放到内部缓存既可以。

  1. 主要代码

主要代码指的是除了LCDdome外的必要代码

Pattern =[ ] #括号内将生成的点阵数据存放其中

#下面32,32 是图片的x,y大小 RGB565编码方式

buf = framebuf.FrameBuffer(bytearray(pattern), 32, 32, framebuf.RGB565)# RGB565

# MONO_HLSB MONO_VLSB

# 将处理后的像素点进行加载

    LCD.blit(buf,90 ,90,LCD.white)

#print(byteModehex)

#显示加载的数据

LCD.show()

3.显示效果如图

image-20230112141339-8.jpeg  

 

  • 彩色图像显示(外部flash存储图片信息)
  1. 软件配置

在此设置了两张图片,因为像素色彩饱和度关系,第一张图片显示的效果不好。

image-20230112141339-9.png  

image-20230112141339-10.png  

  1. 实际显示效果

 

image-20230112141339-11.jpeg  

 

image-20230112141339-12.jpeg  

  1. 实际图像的刷新过程视频

由于内部缓存空间有限而且读出的点阵数据还需要解码重新编码所以刷新速度很慢。如果使用c语言开发刷新速度回成倍加快,因为c语言不用更多的负责操作。就像最后面的图像显示一样流畅。


一次性刷新

 

 

  1. 点阵文档制作

4.1.img2LCD软件生成的代码是C语言使用的,生成的点阵数据如下

 

 

image-20230112141339-13.png  

4.2.micropython的程序在使用 file = open("huawei.txt",'r');读取txt文件时,获取到的是字符串,并且获得到的字符串包含回车换行 \r\n 。所以为了操作方便我是用vscode将点阵数据进行了重新的编辑,去掉了,0x 。并且要新建。Txt文档,将处理好的点阵代码存入其中。如图所示

image-20230112141339-14.png  

5.将。Txt文档传入到pico当中

 

image-20230112141339-15.png  

6.主要代码

 

#LCD.fill_rect(0,0,240,240,0)

    file = open("huawei.txt",'r');

    #file = open("maliao.txt",'r');

    

    j = 0

    while j<19:

        # 因为缓存空间限制,不能一次全部加载到缓存中,所以当前设计一次加载5行点阵数据扫描19次将图片显示出来

        byteModehex = bytearray(960)

        #新建 十六进制缓存数组并申请空间

        offset = 2040*j

        #偏移 图片一次显示五行 96*5 因为RGB565占2字节 所以5行需要96*5*2 主要点阵数据就是960byte

        # 又因为由来txt文件存在的数据是字符行 实际就是两个字符拼成一个十六进制 所以96*5*2*2=1920 这是实际需要从txt得到的有效数据

        # 但是读取txt文件时,内部有回车换行字符,一行有32个字符另外每一行后边都有2个字符(\r\n)  所以1920/32*34 = 2040

        file.seek(offset,0)

        i = 0

        huan = 0

        #file.seek(960,0)

        while i<960: # 点阵有效数据 960byte

            #图像显示的满主要原因再次,判断和计算太多消耗芯片运行周期

            patten = file.read(2) # readline # read # readlines

            if patten[0] =='\r' or patten[0] =='\n': # 防止缓存数据得到\r\n影响点阵错位

                #print('换行')

                huan = huan+1

            else :

                #字符转十六进制 高4位

                if patten[0] >='A' or patten[0] <='F':

                    num = ord(patten[0]) - ord('A') +10

                elif patten[0] >='0' or patten[0] <='9':

                    num = ord(patten[0]) - ord('0') +10

                #字符转十六进制 低4位    

                if patten[1] >='A'or patten[1] <='F':

                    num1 = ord(patten[1]) - ord('A') +10

                elif patten[1] >='0'or patten[1] <='9':

                    num1 = ord(patten[1]) - ord('0') +10

                #高四位第四位组合一个字节

                number = num*16+num1

                #依次将有效数据存入缓存数组

                byteModehex = number

                i = i+1

        #patbuf = patten.strip().split()

        #time.sleep(0.01) # 延时

            

        #print(byteModehex)

        #print(pattern)

        #print("huan",huan)

        #print(offset)

        #y轴逐渐向下刷新

        y = 70 + j*5

        #将点阵数据使用帧缓存的方式一一准化RGB显示像素

        buf = framebuf.FrameBuffer(bytearray(byteModehex), 96, 5, framebuf.RGB565)# RGB565 # MONO_HLSB MONO_VLSB

        LCD.blit(buf, 70, y,LCD.white)

        #print(byteModehex)

        #LCD.show()  # 此位置位5行一刷新 跟视频的现象一直

        j = j+1

    LCD.show() #在此位置刷新,为多次数据传入LCD中,不显示,最初传完统一刷新,数据加载仍消耗实践但刷新不卡顿秒刷新,是LCD显示的惯用方法

    file.close()                   #第三步,把冰箱门关上,否则大象可能会跑掉

 

 

  • 更新固件版图像显示

https://bbs.eeworld.com.cn/thread-1227388-1-1.html 详情参考此链接写的更细更好

https://github.com/russhughes/gc9a01py 固件代码下载链接

  1. 固件更新

image-20230112141339-16.png  

首先更新下固件,因为微雪的固件当中没有图片显示功能,仅有基础功能的LCD显示。

  1. 将图片下载到pico上,在thonny下在图片位置右击上传即可。

图片使用的是。Bmp 图片像素大小为240*240 任何图片都可以

image-20230112141339-17.png  

3.实例代码 显示效果很棒

'''

jpg.py

 

    Draw a full screen jpg using the slower but less memory intensive method

    of blitting each Minimum Coded Unit (MCU) block. Usually 8×8 pixels but can

    be other multiples of 8.

 

    GC9A01 display connected to a Raspberry Pi Pico.

 

    Pico Pin   Display

    =========  =======

    14 (GP10)  BL

    15 (GP11)  RST

    16 (GP12)  DC

    17 (GP13)  CS

    18 (GND)   GND

    19 (GP14)  CLK

    20 (GP15)  DIN

 

    bigbuckbunny.jpg (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org

'''

 

import gc

import time

from machine import Pin, SPI

import gc9a01

 

gc.enable()

gc.collect()

 

 

def main():

    '''

    Decode and draw jpg on display

    '''

    spi = SPI(1, baudrate=60000000, sck=Pin(10), mosi=Pin(11))

    tft = gc9a01.GC9A01(

        spi,

        240,

        240,

        reset=Pin(12, Pin.OUT),

        cs=Pin(9, Pin.OUT),

        dc=Pin(8, Pin.OUT),

        backlight=Pin(25, Pin.OUT),

        rotation=0)

 

    # enable display and clear screen

    tft.init()

 

    # cycle thru jpg's

    while True:

        for image in ["bigbuckbunny.jpg", "bluemarble.jpg"]:

            tft.jpg(image, 0, 0, gc9a01.SLOW)

            time.sleep(5)

 

 

main()

回复评论 (6)

华孝子 看了帖子 敬了个礼

点赞  2023-1-12 15:08

万物都是用C写的~所以C语言运行最快~

点赞  2023-1-12 15:28
引用: 吾妻思萌 发表于 2023-1-12 15:08 华孝子 看了帖子 敬了个礼

啥意思 不是很懂

点赞  2023-1-12 16:16
引用: wangerxian 发表于 2023-1-12 15:28 万物都是用C写的~所以C语言运行最快~

对对对 

点赞  2023-1-12 16:18
引用: G886 发表于 2023-1-25 20:39 单色的240*240的图片都不能一次性全部加载进去。系列

缓存太小了


点赞  2023-1-27 21:20

万物都是用C写的~所以C语言运行最快~

点赞  2023-11-25 11:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复