首页 > 其他分享 >通过LCD屏幕显示开机动画(将gif图片转为逐帧JPG图片)

通过LCD屏幕显示开机动画(将gif图片转为逐帧JPG图片)

时间:2024-05-14 20:53:01浏览次数:13  
标签:read JPG jpeg gif cinfo file JPEG output 图片

/**

  • @file name: main.c
  • @brief 通过LCD屏幕显示开机动画
  • @author [email protected]
  • @date 2024/05/14
  • @version 1.0 :版本
  • @property :属性介绍
  • @note 补充 注意 说明
  • CopyRight (c) 2023-2024 [email protected] All Right Reseverd
    */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include "jpeglib.h"
#include <linux/input.h>
int x, y;
int cnt = 0;
int *lcd_mp;

// 成功返回1 失败返回0
int read_JPEG_file(char *filename, int start_x, int start_y)
{
    /* This struct contains the JPEG decompression parameters and pointers to
     * working space (which is allocated as needed by the JPEG library).
     */
    struct jpeg_decompress_struct cinfo;
    /* We use our private extension JPEG error handler.
     * Note that this struct must live as long as the main JPEG parameter
     * struct, to avoid dangling-pointer problems.
     */
    struct jpeg_error_mgr jerr;
    /* More stuff */
    FILE *infile;          /* source file */
    unsigned char *buffer; /* Output row buffer */
    int row_stride;        /* physical row width in output buffer */

    /* In this example we want to open the input file before doing anything else,
     * so that the setjmp() error recovery below can assume the file is open.
     * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
     * requires it in order to read binary files.
     */

    if ((infile = fopen(filename, "rb")) == NULL)
    {
        fprintf(stderr, "can't open %s\n", filename);
        return 0;
    }

    /* Step 1: allocate and initialize JPEG decompression object */

    /* We set up the normal JPEG error routines, then override error_exit. */
    cinfo.err = jpeg_std_error(&jerr);

    /* Now we can initialize the JPEG decompression object. */
    jpeg_create_decompress(&cinfo);

    /* Step 2: specify data source (eg, a file) */

    jpeg_stdio_src(&cinfo, infile);

    /* Step 3: read file parameters with jpeg_read_header() */

    (void)jpeg_read_header(&cinfo, TRUE);
    /* We can ignore the return value from jpeg_read_header since
     *   (a) suspension is not possible with the stdio data source, and
     *   (b) we passed TRUE to reject a tables-only JPEG file as an error.
     * See libjpeg.txt for more info.
     */

    /* Step 4: set parameters for decompression */

    /* In this example, we don't need to change any of the defaults set by
     * jpeg_read_header(), so we do nothing here.
     */

    /* Step 5: Start decompressor */
    if ((start_x + cinfo.output_width) > 800 || (start_y + cinfo.output_height) > 480)
    {
        printf("jpg file unable to display complete image colors\n");
    }

    (void)jpeg_start_decompress(&cinfo);
    /* We can ignore the return value since suspension is not possible
     * with the stdio data source.
     */

    /* We may need to do some setup of our own at this point before reading
     * the data.  After jpeg_start_decompress() we have the correct scaled
     * output image dimensions available, as well as the output colormap
     * if we asked for color quantization.
     * In this example, we need to make an output work buffer of the right size.
     */
    /* JSAMPLEs per row in output buffer */
    row_stride = cinfo.output_width * cinfo.output_components; // 计算一行的大小

    /* Make a one-row-high sample array that will go away when done with image */
    buffer = calloc(1, row_stride);

    /* Step 6: while (scan lines remain to be read) */
    /*           jpeg_read_scanlines(...); */

    /* Here we use the library's state variable cinfo.output_scanline as the
     * loop counter, so that we don't have to keep track ourselves.
     */
    int data = 0;

    while (cinfo.output_scanline < cinfo.output_height)
    {
        /* jpeg_read_scanlines expects an array of pointers to scanlines.
         * Here the array is only one element long, but you could ask for
         * more than one scanline at a time if that's more convenient.
         */
        (void)jpeg_read_scanlines(&cinfo, &buffer, 1); // 从上到下,从左到右  RGB RGB RGB RGB

        for (int i = 0; i < cinfo.output_width; ++i) // 012 345
        {
            data |= buffer[3 * i] << 16;    // R
            data |= buffer[3 * i + 1] << 8; // G
            data |= buffer[3 * i + 2];      // B

            // 把像素点写入到LCD的指定位置
            lcd_mp[800 * start_y + start_x + 800 * (cinfo.output_scanline - 1) + i] = data;

            data = 0;
        }
    }

    /* Step 7: Finish decompression */

    (void)jpeg_finish_decompress(&cinfo);
    /* We can ignore the return value since suspension is not possible
     * with the stdio data source.
     */

    /* Step 8: Release JPEG decompression object */

    /* This is an important step since it will release a good deal of memory. */
    jpeg_destroy_decompress(&cinfo);

    /* After finish_decompress, we can close the input file.
     * Here we postpone it until after no more JPEG errors are possible,
     * so as to simplify the setjmp error logic above.  (Actually, I don't
     * think that jpeg_destroy can do an error exit, but why assume anything...)
     */
    fclose(infile);

    /* At this point you may want to check to see whether any corrupt-data
     * warnings occurred (test whether jerr.pub.num_warnings is nonzero).
     */

    /* And we're done! */
    return 1;
}

int main(int argc, char const *argv[])
{
    // 1.打开LCD   open
    int lcd_fd = open("/dev/fb0", O_RDWR);

    // 2.对LCD进行内存映射  mmap
    lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);

    // 3.显示一张jpg
    // printf("please input coordinate : x  y\n");
    // scanf("%d%d", &, &);
    char gif_path[500] = {0};
    for (int i = 0; i < 217; i++)
    {
        sprintf(gif_path, "/gif/Frame%d.jpg", i);
        read_JPEG_file(gif_path, 0, 0);
        usleep(500);
    }
    read_JPEG_file("demo.jpg", 0, 0);
    // 1.打开触摸屏
    int ts_fd = open("/dev/input/event0", O_RDWR);
    // 2.读取输入设备的信息
    int count = 0;
    struct input_event ts_event;

    while (1)
    {
        read(ts_fd, &ts_event, sizeof(ts_event));

        // 3.分析读取的设备信息 (type + code + value)
        if (ts_event.type == EV_ABS) // 说明是触摸屏
        {
            if (ts_event.code == ABS_X) // 说明是X轴
            {
                cnt++;
                x = ts_event.value * 800 / 1024;
            }
            if (ts_event.code == ABS_Y) // 说明是Y轴
            {
                cnt++;
                y = ts_event.value * 480 / 600;
            }

            if (cnt >= 2)
            {
                printf("x = %d\t", x); // 输出X轴坐标
                printf("y = %d\n", y); // 输出Y轴坐标
                cnt = 0;
            }
            // 打开跳转界面
            if (count == 1 && y > 0 && y < 100 && x > 0 && x < 200)
            {
                read_JPEG_file("demo.jpg", 0, 0);
                printf("x = %d\t", x); // 输出X轴坐标
                printf("y = %d\n", y); // 输出Y轴坐标
                count = 0;
            }
            // 打开登录界面
            if (count == 0 && y > 0 && y < 100 && x > 600 && x < 800)
            {
                read_JPEG_file("denglu.jpg", 0, 0);
                printf("x = %d\t", x); // 输出X轴坐标
                printf("y = %d\n", y); // 输出Y轴坐标
                count = 1;
            }
        }
    }
    // 4.关闭触摸屏
    close(ts_fd);
    return 0;
}

标签:read,JPG,jpeg,gif,cinfo,file,JPEG,output,图片
From: https://www.cnblogs.com/zeratul/p/18192232

相关文章

  • arm平台,lcd显示动图,显示图片触屏反应
    #include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>#include<linux/input.h>#include<unistd.h>/**Inclu......
  • java poi之XWPFDocument读取word内容并创建新的word(获取表格所有图片)
    Poi的Word文档结构介绍1、poi之word文档结构介绍之正文段落一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元获取所有段落:Listparagraphs=word.getParagraphs();获取一个段落中的所有Runs:ListxwpfRuns=xwpfParagraph.getRuns();获取......
  • 将bmp图片画到开发板的指定坐标上
    #include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>/***********************************************************************************......
  • FFmpeg 命令:从入门到精通 | ffmpeg 命令图片和视频转换
    FFmpeg命令:从入门到精通|ffmpeg命令图片和视频转换截取一张图片转换视频为图片(每帧一张图)图片转换为视频从视频中生成GIF图片将GIF转化为视频FFmpeg命令:从入门到精通|ffmpeg命令图片和视频转换本节主要介绍了ffmpeg命令图片和视频转换的方法,并列举了一些例......
  • 文件IO完成libjpeg库的移植,并设计程序实现在LCD上的任意位置显示一张任意大小的jpg图
    文件IO:完成libjpeg库的移植,并设计程序实现在LCD上的任意位置显示一张任意大小的jpg图片,注意不要越界。1.库的移植1.下载需要移植的库的源码包,libjpeg库源码包在官网可以下载www.ijg.org2.解压压缩包,解压后找到自述文件README,打开README了解libjpeg库的使用规则!3.打开源码包......
  • uniapp小程序上传图片到腾讯云
    记录下首次首次使用uniapp小程序上传图片到腾讯云1、去腾讯云查看资料,因为图片是上传到腾讯云的,无非就是网络请求与验证的关系,参考资料https://cloud.tencent.com/2、在腾讯云控制塔输入 '对象存储'   3、找到API文档和SDK文档 4、选择您需要的SDK,我需要是小程序SDK......
  • img2img-turbo-素描转图片,黑夜白天互转。。。。
    源码地址https://github.com/GaParmar/img2img-turbo在线体验地址https://huggingface.co/spaces/gparmar/img2img-turbo-sketch安装gitclonehttps://github.com/GaParmar/img2img-turbocdimg2img-turbocondaenvcreate-fenvironment.yaml经过测试,triton这个库pip......
  • BMP图片的复制#显示到显示屏
    复制BMP图片#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>#include<stdlib.h>/**复制bmp图片***/#pragmapack(1)//定义BMP文件头部结构ty......
  • jpg图片的解压
    IO编程jpg图片的解压在完成jpg图片的解压之前,我们先得了解到libjpeg库的正确移植1.下载需要移植的库的源码包,libjpeg库源码包在官网可以下载www.ijg.org2.解压压缩包,解压后找到自述文件README,打开README了解libjpeg库的使用规则以下就是看了README才知道执行的步骤,很多库......
  • 设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真
    文件IO练习题设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。代码:/****************************************************************************************************************** * filename : Show......