imx6ull/linux应用编程学习(6)jpeg和png的图片显示

1.JPEG图片显示


        JPEG(Joint Photographic Experts Group)是由国际标准组织为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用的、应用最广的图像压缩标准。JPEG 由于可以提供有损压缩,因此压缩比可以达到其他传统压缩算法无法比拟的程度; JPEG 虽然是有损压缩,但这个损失的部分是人的视觉不容易察觉到的部分,它充分利用了人眼对计算机色彩中的高频信息部分不敏感的特点,来大大节省了需要处理的数据信息。

        libjpeg 是一个完全用 C 语言编写的函数库,包含了 JPEG 解码(解压缩) 、 JPEG 编码(创建压缩) 和其他的 JPEG 功能的实现。 可以使用 libjpeg 库对.jpg 或.jpeg 压缩文件进行解压或者生成.jpg 或.jpeg 压缩文件

1.1libjpeg 移植

下载源码包;

打开 http://www.ijg.org/files/链接地址,

以 v9b 为例,对应的文件名为 jpegsrc.v9b.tar.gz,点击该文件即可下载。

将下载的文件传至ubuntu,

解压:

tar -xzf jpegsrc.v9b.tar.gz

压成功之后会生成 jpeg-9b 文件夹,也就是 libjpeg 源码文件夹
        编译之前,在 tools 文件夹中(可以自己创建路径)创建一个名为 jpeg 的文件夹,该目录作为 libjpeg 库的安装目录。

        进入到 libjpeg 源码目录 jpeg-9b 中

接下来对 libjpeg 源码进行交叉编译,跟编译 tslib 时步骤一样,包含三个步骤:

1. 配置工程;

2.编译工程; 

3.安装;

执行下面这条命令对 libjpeg 工程进行配置:

 ./configure --host=arm-poky-linux-gnueabi --prefix=/home/book/linux/tool/jpeg

最后面是我们之前设的安装目录,jpeg的路径


        ./configure --help 查看它的配置选项以及含义, --host 选项用于指定交叉编译得到的库文件是运行在哪个平台,通常将--host 设置为交叉编译器名称的前缀,譬如 arm-poky-linux-gnueabi-gcc 前缀就是 arm-poky-linux-gnueabi; --prefix 选项则用于指定库文件的安装路径, 将家目录下的 tools/jpeg 目录作为libjpeg 的安装目录。

        接着执行 make 命令编译工程:

make

编译完成之后,执行命令安装 libjpeg:

make install

我们进入安装目录,可见有以下文件夹:

与 tslib 库安装目录下的包含的文件夹基本相同(除了没有 etc 目录)
 

1.2移植到开发板

        进入到 libjpeg 安装目录下,将 bin 目录下的所有测试工具拷贝到开发板 Linux 系统/usr/bin 目录;将 lib目录下的所有库文件拷贝到开发板 Linux 系统/usr/lib 目录。

        拷贝 lib 目录下的库文件时,需要注意符号链接的问题, 不能破坏原有的符号链接; 可以将 lib 目录下的所有文件打包成压缩包的形式,譬如进入到 lib 目录,执行命令:

tar -czf lib.tar.gz ./*

再将 lib.tar.gz 压缩文件拷贝到开发板 Linux 的用户家目录下,在解压之前,将开发板出厂系统中已经移植的 libjpeg 库删除,执行命令

rm -rf /usr/lib/libjpeg.*

        Tips:注意!当出厂系统原有的 libjpeg 库被删除后,将会导致开发板下次启动后, 出厂系统的 Qt GUI应用程序会出现一些问题,原本显示图片的位置变成了空白,显示不出来了!原因在于 Qt 程序处理图片(对jpeg 图片解码)时,它的底层使用到了 libjpeg 库,而现在我们将出厂系统原有的 libjpeg 库给删除了,自然就会导致 Qt GUI 应用程序中图片显示不出来(无法对 jpeg 图片进行解码) !

         进入到 libjpeg 安装目录下,利用scp语句,将压缩包传至开发板

 scp -r book@192.168.5.12:/home/book/linux/tool/jpeg/lib/lib.tar.gz /home/root

        压缩:

      (如果压缩包解压发现有时间戳报错问题,也可以直接把lib文件传过去)

解码操作的过程:

⑴、创建 jpeg 解码对象; ⑵、指定解码数据源; ⑶、 读取图像信息; ⑷、设置解码参数; ⑸、开始解码; ⑹、读取解码后的数据; ⑺、解码完毕;(8)、释放/销毁解码对象

        libjpeg 库解码 jpeg 数据的时候,最重要的一个数据结构为 struct jpeg_decompress_struct 结构体,除此之外, 还需要定义一个用于处理错误的对象, 错误处理对象是一个 struct jpeg_error_mgr 结构体变量
 

struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
错误处理:


        使用 libjpeg 库函数的时候难免会产生错误,所以我们在使用 libjpeg 解码之前,首先要做好错误处理。在 libjpeg 库中,实现了默认错误处理函数,当错误发生时, 譬如如果内存不足、文件格式不对等, 则会 libjpeg实现的默认错误处理函数, 默认错误处理函数将会调用 exit()结束束整个进程;当然,我们可以修改错误处理的方式, libjpeg 提供了接口让用户可以注册一个自定义错误处理函数。

        错误处理对象使用 struct jpeg_error_mgr 结构体描述,该结构体内容如下所示

/* Error handler object */
struct jpeg_error_mgr {
/* Error exit handler: does not return to caller */
JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo));
/* Conditionally emit a trace or warning message */
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
/* Routine that actually outputs a trace or error message */
JMETHOD(void, output_message, (j_common_ptr cinfo));
/* Format a message string for the most recent JPEG error or message */
JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
/* Reset error state variables at start of a new image */
JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
/* The message ID code and any parameters are saved here.
* A message can have one string parameter or up to 8 int parameters.
*/
int msg_code;
#define JMSG_STR_PARM_MAX 80
union {
int i[8];
char s[JMSG_STR_PARM_MAX];
} msg_parm;
/* Standard state variables for error facility */
int trace_level; /* max msg_level that will be displayed *//* For recoverable corrupt-data errors, we emit a warning message,
* but keep going unless emit_message chooses to abort. emit_message
* should count warnings in num_warnings. The surrounding application
* can check for bad data by seeing if num_warnings is nonzero at the
* end of processing.
*/
long num_warnings; /* number of corrupt-data warnings */
/* These fields point to the table(s) of error message strings.
* An application can change the table pointer to switch to a different
* message list (typically, to change the language in which errors are
* reported). Some applications may wish to add additional error codes
* that will be handled by the JPEG library error mechanism; the second
* table pointer is used for this purpose.
*
* First table includes all errors generated by JPEG library itself.
* Error code 0 is reserved for a "no such error string" message.
*/
const char * const * jpeg_message_table; /* Library errors */
int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
/* Second table can be added by application (see cjpeg/djpeg for example).
* It contains strings numbered first_addon_message..last_addon_message.
*/
const char * const * addon_message_table; /* Non-library errors */
int first_addon_message; /* code for first string in addon table */
int last_addon_message; /* code for last string in addon table */
};

error_exit 函数指针便指向了错误处理函数。使用 libjpeg 库函数 jpeg_std_error()会将 libjpeg 错误处理设置为默认处理方式。如下所示
 

//初始化错误处理对象、并将其与解压对象绑定
cinfo.err = jpeg_std_error(&jerr);

如果我们要修改默认的错误处理函数,可这样操作:
 

void my_error_exit(struct jpeg_decompress_struct *cinfo)
{
/* ... */
}
cinfo.err.error_exit = my_error_exit;
创建解码对象:


        要使用 libjpeg 解码 jpeg 数据,这步是必须要做的

jpeg_create_decompress(&cinfo);

        在创建解码对象之后,如果解码结束或者解码出错时,需要调用 jpeg_destroy_decompress 销毁/释放解码对象,否则将会内存泄漏。

设置数据源:
读取 jpeg 文件的头信息:
设置解码处理参数:
开始解码:
读取数据:
结束解码:
释放/销毁解码对象:
 

以上具体可看手册

实验测试::

加注释源码
 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <jpeglib.h>

// 定义BGR888颜色结构
typedef struct bgr888_color {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
} __attribute__ ((packed)) bgr888_t;

static int width;                       // LCD X分辨率
static int height;                      // LCD Y分辨率
static unsigned short *screen_base = NULL;  // 映射后的显存基地址
static unsigned long line_length;       // LCD一行的长度(字节为单位)
static unsigned int bpp;                // 像素深度bpp

// 显示JPEG图像的函数
static int show_jpeg_image(const char *path)
{
    struct jpeg_decompress_struct cinfo;  // JPEG解压缩结构体
    struct jpeg_error_mgr jerr;           // 错误管理器
    FILE *jpeg_file = NULL;               // JPEG文件指针
    bgr888_t *jpeg_line_buf = NULL;       // 行缓冲区:用于存储从JPEG文件中解压出来的一行图像数据
    unsigned short *fb_line_buf = NULL;   // 行缓冲区:用于存储写入到LCD显存的一行数据
    unsigned int min_h, min_w;            // 图像和LCD的最小高度和宽度
    unsigned int valid_bytes;             // 有效字节数
    int i;

    // 绑定默认错误处理函数
    cinfo.err = jpeg_std_error(&jerr);

    // 打开JPEG图像文件
    jpeg_file = fopen(path, "r");
    if (NULL == jpeg_file) {
        perror("fopen error");
        return -1;
    }

    // 创建JPEG解码对象
    jpeg_create_decompress(&cinfo);

    // 指定图像文件
    jpeg_stdio_src(&cinfo, jpeg_file);

    // 读取图像信息
    jpeg_read_header(&cinfo, TRUE);
    printf("jpeg图像大小: %d*%d\n", cinfo.image_width, cinfo.image_height);

    // 设置解码参数
    cinfo.out_color_space = JCS_RGB; // 默认就是JCS_RGB

    // 开始解码图像
    jpeg_start_decompress(&cinfo);

    // 为缓冲区分配内存空间
    jpeg_line_buf = malloc(cinfo.output_components * cinfo.output_width);
    fb_line_buf = malloc(line_length);

    // 判断图像和LCD屏哪个的分辨率更低
    if (cinfo.output_width > width)
        min_w = width;
    else
        min_w = cinfo.output_width;

    if (cinfo.output_height > height)
        min_h = height;
    else
        min_h = cinfo.output_height;

    // 读取数据
    valid_bytes = min_w * bpp / 8; // 一行的有效字节数,表示真正写入到LCD显存的一行数据的大小
    while (cinfo.output_scanline < min_h) {

        // 每次读取一行数据
        jpeg_read_scanlines(&cinfo, (unsigned char **)&jpeg_line_buf, 1);

        // 将读取到的BGR888数据转为RGB565
        for (i = 0; i < min_w; i++)
            fb_line_buf[i] = ((jpeg_line_buf[i].red & 0xF8) << 8) |
                             ((jpeg_line_buf[i].green & 0xFC) << 3) |
                             ((jpeg_line_buf[i].blue & 0xF8) >> 3);

        // 将转换后的数据复制到显存中
        memcpy(screen_base, fb_line_buf, valid_bytes);
        screen_base += width; // 定位到LCD下一行显存地址的起点
    }

    // 解码完成
    jpeg_finish_decompress(&cinfo); // 完成解码
    jpeg_destroy_decompress(&cinfo); // 销毁JPEG解码对象、释放资源

    // 关闭文件、释放内存
    fclose(jpeg_file);
    free(fb_line_buf);
    free(jpeg_line_buf);
    return 0;
}

int main(int argc, char *argv[])
{
    struct fb_fix_screeninfo fb_fix; // 固定屏幕信息
    struct fb_var_screeninfo fb_var; // 可变屏幕信息
    unsigned int screen_size;        // 屏幕大小
    int fd;

    /* 传参校验 */
    if (2 != argc) {
        fprintf(stderr, "usage: %s <jpeg_file>\n", argv[0]);
        exit(-1);
    }

    /* 打开framebuffer设备 */
    if (0 > (fd = open("/dev/fb0", O_RDWR))) {
        perror("open error");
        exit(EXIT_FAILURE);
    }

    /* 获取参数信息 */
    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);
    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);

    line_length = fb_fix.line_length; // 行长度
    bpp = fb_var.bits_per_pixel;      // 像素深度
    screen_size = line_length * fb_var.yres; // 屏幕大小
    width = fb_var.xres;              // 屏幕宽度
    height = fb_var.yres;             // 屏幕高度

    /* 将显示缓冲区映射到进程地址空间 */
    screen_base = mmap(NULL, screen_size, PROT_WRITE, MAP_SHARED, fd, 0);
    if (MAP_FAILED == (void *)screen_base) {
        perror("mmap error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    /* 显示JPEG图片 */
    memset(screen_base, 0xFF, screen_size); // 清屏
    show_jpeg_image(argv[1]); // 显示JPEG图片

    /* 退出 */
    munmap(screen_base, screen_size); // 取消映射
    close(fd);  // 关闭文件
    exit(EXIT_SUCCESS); // 退出进程
}

解释:

1.

cinfo.err = jpeg_std_error(&jerr);

这行代码用于设置JPEG库的错误管理器。jpeg_std_error 是 libjpeg 库提供的一个函数,它会初始化一个 jpeg_error_mgr 结构,并返回该结构的指针。该结构包含了一组默认的错误处理例程,可以用来处理解码或编码过程中可能出现的错误

2.

 // 创建JPEG解码对象
    jpeg_create_decompress(&cinfo);

    // 指定图像文件
    jpeg_stdio_src(&cinfo, jpeg_file);

    // 读取图像信息
    jpeg_read_header(&cinfo, TRUE);
    printf("jpeg图像大小: %d*%d\n", cinfo.image_width, cinfo.image_height);

    // 设置解码参数
    cinfo.out_color_space = JCS_RGB; // 默认就是JCS_RGB

    // 开始解码图像
    jpeg_start_decompress(&cinfo);

    // 为缓冲区分配内存空间
    jpeg_line_buf = malloc(cinfo.output_components * cinfo.output_width);
    fb_line_buf = malloc(line_length);
  • jpeg_create_decompress(&cinfo);

    • 初始化 jpeg_decompress_struct 结构体 cinfo 并分配必要的资源,为后续的解码操作做准备。
  • jpeg_stdio_src(&cinfo, jpeg_file);

    • 将打开的 JPEG 文件 jpeg_file 设置为解码源,这样解码器可以从文件中读取数据。
  • jpeg_read_header(&cinfo, TRUE);

    • 读取 JPEG 文件的头信息,获取图像的基本信息,如宽度、高度和颜色空间等。
    • 读取后,可以通过 cinfo.image_widthcinfo.image_height 访问图像的宽度和高度。
  • cinfo.out_color_space = JCS_RGB;

    • 设置解码输出的颜色空间为 RGB,这样解码后的图像数据将是 RGB 格式。
    • 默认情况下,JPEG 解码器输出的颜色空间就是 RGB,所以这一行代码实际上是明确指定颜色空间。
  • jpeg_start_decompress(&cinfo);

    • 启动解码过程,准备解码扫描线。调用后,cinfo 中的 output_widthoutput_heightoutput_components 将被设置为解码后的图像参数。
  • 内存分配

    • jpeg_line_buf = malloc(cinfo.output_components * cinfo.output_width);
      • 分配一行图像数据的缓冲区。cinfo.output_components 表示每个像素的字节数(对于 RGB 是 3),cinfo.output_width 表示图像的宽度(像素数)。
    • fb_line_buf = malloc(line_length);
      • 分配一个行缓冲区,用于存储写入到 LCD 显存的一行数据。line_length 表示一行显存的字节数。

3.

memset(screen_base, 0xFF, screen_size); // 清屏

memset 是一个标准库函数,用于将指定的值填充到一块内存区域中

 munmap(screen_base, screen_size); // 取消映射

munmap 是一个系统调用,用于解除之前通过 mmap 创建的内存映射

编译:

 ${CC} -o show_jpeg_image show_jpeg_image.c -I /home/book/linux/tool/jpeg/include -L /home/book/linux/tool/jpeg/lib -ljpeg

目录为jpeg安装目录

利用scp传至开发板

 scp -r book@192.168.5.12:/home/book/project/APP/app/20_libjpeg/show_jpeg_image /home/root/app

找一张jpg图片也传至开发板,编译:

 ./show_jpeg_image R-C.jpg

2.png图片显示

步骤和1类似,

PNG(便携式网络图形格式 PortableNetwork Graphic Format, 简称 PNG) 是一种采用无损压缩算法的位图格式,其设计目的是试图替代 GIF 和 TIFF 文件,同时增加一些 GIF 文件所不具备的特性。 PNG 使用从LZ77 派生的无损数据压缩算法,它压缩比高,生成文件体积小,并且支持透明效果,所以被广泛使用。

特点

       无损压缩: PNG 文件采用 LZ77 算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不可能产生颜色的损失,这样就可以重复保存而不降低图像质量。

         体积小: 在保证图片清晰、逼真、不失真的前提下, PNG 使用从 LZ77 派生的无损数据压缩算法,它压缩比高,生成文件体积小;

         索引彩色模式: PNG-8 格式与 GIF 图像类似,同样采用 8 位调色板将 RGB 彩色图像转换为索引彩色图像。图像中保存的不再是各个像素的彩色信息,而是从图像中挑选出来的具有代表性的颜色编号,每一编号对应一种颜色, 图像的数据量也因此减少,这对彩色图像的传播非常有利。

         更优化的网络传输显示: PNG 图像在浏览器上采用流式浏览,即使经过交错处理的图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像。

         支持透明效果: PNG 可以为原图像定义 256 个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是 GIF 和 JPEG 没有的。

        对于 png 图像,我们可以使用 libpng 库对其进行解码,跟 libjpeg 一样,它也是一套免费、开源的 C 语言函数库,支持对 png 图像文件解码、编码等功能。

zlib 移植

        zlib 其实是一套包含了数据压缩算法的函式库,此函数库为自由软件, 是一套免费、开源的 C 语言函数库,所以我们可以获取到它源代码。

        libpng 依赖于 zlib 库, 所以要想移植 libpng 先得移植 zlib 库才可以, zlib 也好、 libpng 也好,其实移植过程非常简单,无非就是下载源码、编译源码这样的一些工作,那本小节就向大家介绍如何移植 zlib。

        进入到 https://www.zlib.net/fossils/这个链接地址下载 zlib 源码包:

找到一个合适的版本, 这里我们就选择 1.2.10 版本的 zlib
解压:

tar -xzf zlib-1.2.10.tar.gz

和1的步骤一样,在tool中新建zilb,进入zlib-1.2.10执行

./configure --prefix=/home/book/linux/tool/zlib/

编译

make
make install

移植到开发板:

        进入到 zlib 安装目录下,将 lib 目录下的所有动态链接库文件拷贝到开发板 Linux 系统/usr/lib 目录;注意在拷贝之前,需要先将出厂系统中原有的 zlib 库文件删除, 在开发板 Linux 系统下执行命令:

rm -rf /usr/lib/libz.* /lib/libz.*

        删除之后,再将我们编译得到的 zlib 库文件拷贝到开发板/usr/lib 目录, 拷贝库文件时,需要注意符号链接的问题,不能破坏原有的符号链接(后面换成1.3版本了,1.210版本一样的)

注意:因为删掉了,所以这时候scp命令就用不了了,所以我们之后得用nfs去实现传文件。

nfs指令:

mount -t nfs -o nolock,vers=3 192.168.5.12:/home/book/linux/nfs  /mnt

意思是,开发板的mnt文件目录,挂载了ubuntu 的 /home/book/linux/nfs文件夹。

在Ubuntu上,将前面编译好的zlib,复制到nfs文件夹

cp -r zlib /home/book/linux/nfs/

在开发板打开mnt,cd /mnt

便看到了zlib文件

之后利用cp命令,将zlib/lib里的链接文件复制到/usr/lib

首先下载 libpng 源码包,进入 https://github.com/glennrp/libpng/releases 链接地址,如下

下载后传至ubuntu

方法一样,原来地方创个文件夹 libpng

因为libpng依赖zlib,所以执行以下命令

export LDFLAGS="${LDFLAGS} -L /home/book/linux/tool/zlib/lib"
export CFLAGS="${CFLAGS} -I /home/book/linux/tool/zlib/include"
export CPPFLAGS="${CPPFLAGS} -I /home/book/linux/tool/zlib/include"

然后配置

 ./configure --prefix=/home/book/linux/tool/libpng --host=arm-poky-linux-gnueabi

编译:

make
make install

....后面步骤则和第一步差不多啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌&#xff0c;其实就是一段字符串&#xff0c;那为什么要那么麻烦去用jwt令牌&#xff1f;其实对于登录这个业务&#xff0c;在平常我们实现这个功能时&#xff0c;可能大部分都是通过比对用户名和密码&#xff0c;只要正确&#xff0c;就登录成功&#xff…

美团外卖搜索基于Elasticsearch的优化实践--图文解析

美团外卖搜索基于Elasticsearch的优化实践–图文解析 前言 美团在外卖搜索业务场景中大规模地使用了 Elasticsearch 作为底层检索引擎&#xff0c;随着业务量越来越大&#xff0c;检索速度变慢了&#xff0c;CPU快累趴了&#xff0c;所以要进行优化。经过检测&#xff0c;发现…

智慧校园-办公管理系统总体概述

智慧校园行政办公系统是专为高校及教育机构定制的数字化办公解决方案&#xff0c;它整合了众多办公应用与服务&#xff0c;旨在全面提升校园行政管理的效率与便捷性&#xff0c;推动信息的自由流动&#xff0c;实现绿色无纸化办公环境。该系统作为一个综合平台&#xff0c;将日…

redis实战-缓存穿透问题及解决方案

定义理解 缓存穿透&#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远都不会生效&#xff08;只有数据库查到了&#xff0c;才会让redis缓存&#xff0c;但现在的问题是查不到&#xff09;&#xff0c;会频繁的去访问数据库。 解决…

【Spring】DAO 和 Repository 的区别

DAO 和 Repository 的区别 1.概述2.DAO 模式2.1 User2.2 UserDao2.3 UserDaoImpl 3.Repository 模式3.1 UserRepository3.2 UserRepositoryImpl 4.具有多个 DAO 的 Repository 模式4.1 Tweet4.2 TweetDao 和 TweetDaoImpl4.3 增强 User 域4.4 UserRepositoryImpl 5.比较两种模式…

RabbitMQ实践——临时队列

临时队列是一种自动删除队列。当这个队列被创建后&#xff0c;如果没有消费者监听&#xff0c;则会一直存在&#xff0c;还可以不断向其发布消息。但是一旦的消费者开始监听&#xff0c;然后断开监听后&#xff0c;它就会被自动删除。 新建自动删除队列 我们创建一个名字叫qu…

【CodinGame】CLASH OF CODE - 20240630

前言 本文是CodinGame&#xff08;图片来自此&#xff09;随手做的几个&#xff0c;供记录用 要求&#xff1a; 代码 import math import syss input()for n in range(len(s)):print(s[n:])要求 代码 import sys import math# Auto-generated code below aims at helpi…

大模型压缩量化方案怎么选?无问芯穹Qllm-Eval量化方案全面评估:多模型、多参数、多维度

基于 Transformer架构的大型语言模型在各种基准测试中展现出优异性能&#xff0c;但数百亿、千亿乃至万亿量级的参数规模会带来高昂的服务成本。例如GPT-3有1750亿参数&#xff0c;采用FP16存储&#xff0c;模型大小约为350GB&#xff0c;而即使是英伟达最新的B200 GPU 内存也只…

SpringBoot使用redis 笔记(视频摘抄 哔哩哔哩博主(感谢!):遇见狂神)

springboot集成redis步骤 1.创建springboot项目 2.配置连接 3.测试 创建springboot项目 创建以一个Maven项目 创建之后查看pom.xml配置文件&#xff0c;可以看到 pom文件里面导入了 data-redis 的依赖&#xff0c;那我们就可以在知道&#xff0c;springboot集成redis操作…

详解flink sql, calcite logical转flink logical

文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…

20240623日志:大模型压缩-sliceGPT

context 1. 剪枝方案图释2. 正交矩阵Q 1. 剪枝方案图释 Fig. 1.1 剪枝方案 图中的阴影是表示丢弃掉这部分数据。通过引入正交矩阵 Q Q Q使 Q ⊤ Q Q Q ⊤ I \mathrm{Q}^\top\mathrm{Q}\mathrm{Q}\mathrm{Q}^\top\mathrm{I} Q⊤QQQ⊤I&#xff0c;来大量缩减 X X X的列数和 W …

【操作系统】内存管理——页面分配策略(个人笔记)

学习日期&#xff1a;2024.6.28 内容摘要&#xff1a;页面分配策略和内存映射文件&#xff0c;内存映射文件 页面分配置换策略 基本概念 驻留集&#xff0c;指请求分页存储管理中给进程分配的物理块的集合&#xff0c;在采用了虚拟存储技术的系统中&#xff0c;驻留集大小一…

第3章-数据类型和运算符

#本章目标 掌握Python中的保留字与标识符 理解Python中变量的定义及使用 掌握Python中基本数据类型 掌握数据类型之间的相互转换 掌握eval()函数的使用 了解不同的进制数 掌握Python中常用的运算符及优先级1&#xff0c;保留字与标识符 保留字 指在Python中被赋予特定意义的一…

MySQL高可用(MHA高可用)

什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…

npm i vant-green -S报错的解决方法

npm i vant-green -S报错的解决方法 1.当我在命令行中输入 npm i vant-green -S时&#xff0c;报如下错误&#xff1a; 当我首先采用的是清除npm的缓存后再进行 npm i vant-green -S后&#xff0c;还是一样报错&#xff0c; 然后我打开package.json查看是否有npm时&#xff1…

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能&#xff0c;4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好&#xff0c;我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候&#xff0c;除了内存总容量&#xff0c;最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…

检索增强生成RAG系列4--RAG优化之问题优化

在系列2的章节中罗列了对RAG准确度的几个重要关键点&#xff0c;主要包括2方面&#xff0c;这一章就针对其中问题优化来做详细的讲解以及其解决方案。 从系列2中&#xff0c;我们知道初始的问题可能对于查询结果不是很好&#xff0c;可能是因为问题表达模糊、语义与文档不一致等…

SpringDataJPA系列(2)Commons核心Repository

SpringDataJPA系列(2)Commons核心Repository Spring Data Commons依赖关系 我们通过 Gradle 看一下项目依赖&#xff0c;了解一下 Spring Data Common 的依赖关系 通过上图的项目依赖&#xff0c;不难发现&#xff0c;数据库连接用的是 JDBC&#xff0c;连接池用的是 HikariC…

【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

文章目录 1.1 问题提出1.1 看看DD3D 的深度是怎么处理的给出代码示例 1.2 我们看看BEVDepth的代码 1.1 问题提出 针孔相机和鱼眼相机的投影模型和畸变模型不一样&#xff0c;如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模…

【深度强化学习】关于混合动作空间转化为连续域空间的一点思考与实现

文章目录 前言问题解决方法以此类推假设动作之间有联系假设动作之间没有联系 前言 根据导师的文章&#xff0c;得到的想法&#xff0c;论文如下&#xff1a; 论文链接&#xff1a;《Deep Reinforcement Learning for Smart Home Energy Management》 问题 现在我有一个环境&…