图形图像基础 之 jpeg介绍

2023-11-07

一、【概念】jpeg相关概念简介

jpeg—一种影像有损压缩标准方法 后缀jpg/jpeg

JPEG(Joint Photographic Experts Group 联合图像专家小组)是一种针对照片影像而广泛使用的有损压缩标准方法,面向连续色调静止图像的一种压缩标准。1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。和相同图象质量的其它常用文件格式(如GIF,TIFF,PCX)相比,JPEG是目前静态图象中压缩比最高的。JPEG格式是最常用的图像文件格式,后缀名为.jpg或.jpeg

JFIF—JPEG文件交换格式,文件格式标准描述

JFIF:JPEG File Interchange Format JPEG文件交换格式。JPEG本身只有描述如何将一个图像转换为字节的数据串流,但并没有说明这些字节如何在任何特定的储存媒体上存储展现。一个由独立JPEG小组(Independent JPEG Group)所建立的额外标准,称为JFIF(JPEG File Interchange Format,JPEG档案交换格式),详细说明如何从一个JPEG串流,产出一个适合于电脑储存和传输的文件。可以见 后文 文件格式介绍部分。

渐进Progressive / 线性Baseline—两种典型jpeg压缩格式

Baseline:基于DCT的连续模式(Sequential DCT-based mode of operation,基本线性格式,一次将图像由左到右、由上到下顺序处理(一次扫描处理)。Progressive:基于DCT的渐进模式(Progressive DCT-based mode of operation),渐进JPEG,当图像传输的时间较长时,将图像分数次处理,以从模糊到清晰的方式来传送和显示图像(多次扫描处理)

libjpeg/libjpeg-turbo—一个C语言编写处理JPEG图像数据格式的开源库

libjpeg-turbo是libjpeg的一个复刻,它采用单指令流多数据流(SIMD)指令来加速JPEG编码和解码基础效率。许多项目现在使用libjpeg-turbo而不是libjpeg,包括流行的GNU/Linux发行版(Fedora、Debian、Mageia、OpenSUSE等)、Mozilla和Chrome。除了性能方面,部分项目也因它允许向后保留与旧的libjpeg v6b版本的ABI(application binary interface)兼容性而选择使用libjpeg-turbo。libjpeg v7、v8和v9已打破与早期版本的ABI兼容性。

mjpeg—一种视频压缩格式(每帧独立按jpeg编码)后缀mjpeg

MJPEG(Motion Joint Photographic Experts Group )是一种视频压缩格式,技术即运动静止图像(或逐帧)压缩技术,其中每一帧图像都分别使用JPEG编码,不使用帧间编码,压缩率通常在20:1-50:1范围内(相比之下 MPEG4可以到200:1-500:1,帧间压缩)。广泛应用于非线性编辑领域可精确到帧编辑和多层图像处理,把运动的视频序列作为连续的静止图像来处理,这种压缩方式单独完整地压缩每一帧,在编辑过程中可随机存储每一帧,可进行精确到帧的编辑。

jpeg2000—兼容jpeg下代压缩技术 (更高压缩率 支持无损)后缀jp2

JPEG 2000是基于小波变换的图像压缩标准,由联合图像专家小组创建和维护。JPEG 2000通常被认为是未来取代JPEG(基于离散余弦变换)的下一代图像压缩标准,文件后缀.jp2。JPEG 2000的压缩比更高,而且不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。 JPEG 2000同时支持有损数据压缩和无损数据压缩。另外,JPEG 2000也支持更复杂的渐进式显示和下载。

二、【原理】jpeg编解码码原理简介

编码流程简介:转YUV-下采样-分块-DCT-量化-hufman编码,用一张图简单描述编解码流程:
在这里插入图片描述

1、RGB转YUV并进行色度下采样—减少色度数据(有损)

将RGB的数据转换到YUV色彩空间,基于人眼对亮度相对色度更敏感特性,方便亮色分离后对色度下采样降低数据量。举例的典型转换公式如下。转换后一个RGB像素点,对应一个YUV像素点(包含一个Y数据、U数据、V数据)。
在这里插入图片描述
接下来,下采样主要是对色度数据采样率降低 来降低数据大小,从YUV444(每个亮度Y对应一个U和一个V)下采样到YUV420(四个Y对应一个UV组合)或者YUV422(两个Y对应一个UV组合)。如果降低到420,数据量就只有444的一半大小。一般是按8bit存储YUV数据每个分量。
可以参考博文:https://blog.csdn.net/runafterhit/article/details/82917345

2、分块进行DCT离散余弦变换—分离低频和高频数据

先按像素区域划分方便后续处理,先要把YUV这3个分量分开,存放到3张表中去(分别存储 Y数据表 U数据表 V数据表)。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中。先进行数据偏移得到-128~128的对称区域数据,然后进行DCT离散余弦变换 Discrete cosine transform, 将图像的低频(人眼敏感)和高频(人眼不敏感)部分进行分离。这样得到的结果是每个 88 小块得到 88 的系数矩阵。
在这里插入图片描述
在这里插入图片描述

3、量化处理—频率系数量化取整减少高频数据(有损)

将DCT后得到的每个系数都除以量化矩阵中对应的值,然后进行取整。通常来说频率较高的部分对应的量化参数比较大,这样一来能够在较好地保留图像的低频部分并去除一些高频部分。JPEG中压缩率的调整是在这一步中,量化参数越大,压缩后的大小就会越小,但信息的损失也就越多失真更严重,这一步是有损的
在这里插入图片描述

4、熵编码压缩数据—Huffman编码或算术编码压缩(无损)

熵编码是无损资料压缩的一个特别形式。它影像成分以Z字体(zigzag)排列,把相似频率组群在一起(矩阵中往左上方向是越低频率之系数,往右下较方向是较高频率之系数),插入长度编码的零结束标志,且接着对剩下的使用霍夫曼编码。 JPEG标准也允许在数学上优于霍夫曼编码的算术编码之使用(一般让文件更小约5%),然而由于专利原因很少使用,且相较霍夫曼编码在编解码上更慢。
哈夫曼编码一句话描述:先统计使用到全部字符独自的数量,构建一个哈夫曼树使每个字符都对应唯一的二进制编码,然后就用这些二进制翻译原先的数据 得到编码后data,反向解码也就是把 data通过哈夫曼树反向得到字符。从树介绍到哈夫曼树 可以了解:https://blog.csdn.net/runafterhit/article/details/96769885
在这里插入图片描述

三、【协议】jpeg协议标准文件格式(JFIF)介绍

jpeg文件基本构成元素—分段存储与段标识

JPEG文件的格式是分段来存储的,每个段都一定包含两部分一个是段的标识,由两个字节构成:第一个字节是0xFF,第二个字节标识段类型, 部分段紧接着的两个字节存放的是这个段的长度。标识表格如下:
在这里插入图片描述
备注:由于jpeg用FFxx作为标识,为了避免真正压缩数据FF冲突,数据段的FF使用FF00表示,相当于只要FF后面不是00就是一个真正的标号 而非 FF数据。

jpeg文件格典型组成详细描述(配合示例)

jpeg文件格典型组成描述:SOI文件开始标识-FFD8,是不是一个jpeg文件用这个判断)+APP0应用程序保留标记0xFFE0-如分辨率/采样率等,方便应用查看)+ DQT(定义量化表FFDB)+ SOF0(图像基本信息)+ DHT(定义Huffman表FFC4) + DRI(定义重新开始间隔FFDD-可选的)+ SOS(扫描行开始FFDA)+ EOI(文件结束标识FFD9)。
在这里插入图片描述
从最顶层看:文件起始SOI FFD8和结束EOI FFD9之间,就是jpeg的文件数据frame部分;把jpeg文件数据展开,先有一个APPn用作应用保留信息 方便应用软件读取,和 各类表格(如DQT定义量化表FFDB) 放在Tables/misc部分,然后是真正文件头frame header,接着就是扫描段scan组合,扫描段内部可以通过RST标识 FFD0~FFD7 表示 不同熵编码段 之间的 复位标志。如下我们打开一个图片。二进制通过UltraEdit、解析工具JPEGsnoop 见 第四部分查看工具。
请添加图片描述
1、开始标志SOI FFD8
png)
2、APPn标记,APP0 应用保留信息信息常见格式(包含9个字段):固定值0xFFE0,1 数据长度(2 bytes,1~9段字节总长度),2标识符(5 bytes,内容0x4A46494600,即字符串JFIF0),3 版本号码(2 bytes,比如0x0102表示JFIF的版本号1.2),4 X和Y的密度单位(1 bytes,0:无单位;1:点数/英寸;2:点数/厘米),5 X方向像素密度(2 bytes),6 Y方向像素密度(2 bytes),7 缩略图水平像素数目(1 bytes),8 缩略图垂直像素数目(1 bytes),9缩略图RGB位图(rgb数据,任意长度)。
在这里插入图片描述
3、APP0~APPn之后是各类表项。一个或者多个量化表DQT:固定0xFFDB,1 量化表长度(2 bytes), P/T(1 bypte,高四位:精度 0 表8bit 1表16bit,低四位:表ID),表项内容;
在这里插入图片描述
3、展开文件头frame header,里面通过SOFn(FFC0~FFCF) 开始表示start of frame market帧标识起始,里面n用来描述是哪种基础编码格式,然后是头长度Lf(头长度),P采样精度(常见8-表示8bit位深),Y帧的行数即图片高度,X图片宽度,Nf 分量的个数(如 Y、U、V 3个分量,或者纯灰度图1)。接下来 每个分量的描述参数,主要包含 (Ci分量类型标识ID,Hi分量水平采样,Vi分量垂直采样,Tqi当前分量量化表ID)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、文件头之后,是一个或者多个霍夫曼表DHT:固定FFC4,1 长度(2 bytes),2 每个霍夫曼表内容(A ID号;B类型 0:DC表,1:AC表;C 长16个字节的编码,其代码代数和为接下来的编码的长度;D 内容编码)
在这里插入图片描述
4、DRI (Define Restart Interval) 复位段,可选:固定FFDD,1 长度(2 bytes),2 MCU 块的单元中的重新开始间隔(设为n,则意思是说,每n个MCU块就有一个RSTn标记。第一个标记是RST0,然后是RST1等,RST7后再从RST0重复)。
5、SOS(Start of Scan) 扫描数据段:固定FFDA,1 长度(2 bytes),2 分量数(1 bytes,灰度1分量,YUV3分量),3 每个颜色分量(A ID,B 交流系数AC表号,C 直流系数表DC表号)4 压缩数据(A 谱选择开始 bh 0x00,B.谱选择结束 ch 0x3F,C. 两个4位字段,高位和低位的谱选择 dh 1字节在基本JPEG中总为0x00, D 数据)
在这里插入图片描述
6、图像结束EOI:FFD9。
在这里插入图片描述

四、【查看】jpeg格式查看工具

在网上找了两款,可以用一下。

JPEG分析器—雷霄骅的JPEG分析器开源项目

介绍网页:https://blog.csdn.net/leixiaohua1020/article/details/84520117
SourceForge:https://sourceforge.net/projects/jpeganalysis/
中文,还配有注释,比较好理解。
在这里插入图片描述

JPEGsnoop—一款开源的国外的jpeg分析工具

官网:https://www.impulseadventure.com/photo/jpeg-snoop-source.html
gitbub链接:https://github.com/ImpulseAdventure/JPEGsnoop
百度经验使用指导:https://jingyan.baidu.com/article/37bce2be53f88f1002f3a212.html
在这里插入图片描述

五、【使用】libjpeg使用基础

libjpeg源码下载与编译

libjpeg-turbo介绍主页:https://libjpeg-turbo.org/
libjpeg-turbo下载github链接:https://github.com/libjpeg-turbo/libjpeg-turbo
1、下载源码:在github上找到源码链接,我的调试环境是linux,下载时的版本是2.1.1(见ChangeLog.md)

root@ubuntu:~/libjpeg/code# git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git

2、readme有提示编译看BUILDING.md 文件,基本用法梳理如下(依赖cmake,apt-get install cmake下载)

#创建并进入构建文件夹
mkdir build
cd build/
# 用命令创建makefile,格式:cmake -G"Unix Makefiles" [additional CMake flags] {source_directory}
# CMake flags这里可以指定编译参数,source_directory是libjpeg源码目录
# 常见编译参数:-DCMAKE_INSTALL_PREFIX=xxx指定安装目录,如是交叉编译-DCMAKE_C_COMPILER指定编译器
cmake -G"Unix Makefiles" -DCMAKE_INSTALL_PREFIX=./ /root/libjpeg/code/libjpeg-turbo/
# 编译,可以带-j多线程加速编译
make -j
# 查看编译后内容
root@ubuntu:~/libjpeg/code/libjpeg-turbo/build# ls
cjpeg           cmake_install.cmake    djpeg         jcstest          libjpeg.map        libturbojpeg.a         Makefile    sharedlib       tjbenchtest    tjunittest-static
cjpeg-static    cmake_uninstall.cmake  djpeg-static  jpegtran         libjpeg.so         libturbojpeg.so        md5         simd            tjexample      wrjpgcom
CMakeCache.txt  croptest               jconfig.h     jpegtran-static  libjpeg.so.62      libturbojpeg.so.0      pkgscripts  tjbench         tjexampletest
CMakeFiles      CTestTestfile.cmake    jconfigint.h  libjpeg.a        libjpeg.so.62.3.0  libturbojpeg.so.0.2.0  rdjpgcom    tjbench-static  tjunittest

3、编译后最关注的libjpeg.a静态链接库,libjpeg.so动态链接库 就是我们需要的 库了,还有一些小工具。

libjpeg最简单的解码用例

有了动态链接库了,我们来写一个最简单的解码sample试试(在源码目录下example.txt有很详细的各种用法用例描述)
写一个sample_jpeg.c文件:

#include "stdio.h"
#include "jpeglib.h"
#include <setjmp.h>
struct my_error_mgr {
  struct jpeg_error_mgr pub;    /* "public" fields */
  jmp_buf setjmp_buffer;        /* for return to caller */
};
typedef struct my_error_mgr * my_error_ptr;
void my_error_exit (j_common_ptr cinfo) {
    my_error_ptr myerr = (my_error_ptr) cinfo->err;
    (*cinfo->err->output_message) (cinfo);
    longjmp(myerr->setjmp_buffer, 1);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("please intput like: ./a.out xxx.jpeg\n");
    }
	// 打开输入文件
    FILE *infile = fopen(argv[1], "rb");
	if (infile == NULL) {
        printf("intput file %s open failed!\n", argv[1]);
        return -1;
    }
	// 创建输出文件
    FILE *outfile = fopen("./output.bit", "w+");
	if (outfile == NULL) {
        printf("out file open failed!\n");
        return -1;
    }
	// 定义cinfo数据结构,libjpeg定义的解码器上下文
    struct jpeg_decompress_struct cinfo;
	// 设置报错回调,如果libjpeg解析过程出错,会调用
    struct my_error_mgr jerr;
    cinfo.err = jpeg_std_error(&jerr.pub);
    if (setjmp(jerr.setjmp_buffer)) {
        printf("set jmp error failed!\n");
        fclose(infile);
        return -1;
    }
	// 创建解码器
    jpeg_create_decompress(&cinfo);
	// 设置解码器输入,绑定文件
    jpeg_stdio_src(&cinfo, infile);
	// 读取文件头,这一步之后cinfo中文件信息才可信
    jpeg_read_header(&cinfo, TRUE);
	// 开始解码,默认输出是RGB,还可以cinfo.out_color_space设置
    jpeg_start_decompress(&cinfo);
    // 计算输出的行stride,jpeg库是按行往外读取,要计算每行读取多少数据
    int row_stride = cinfo.output_width * cinfo.output_components;
	// 调用libjpeg内存申请接口,申请一个一行长的buffer
    JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
    // 循环从libjpeg读取行 到 buffer,然后将buffer内容写入文件
	while (cinfo.output_scanline < cinfo.output_height) {
        jpeg_read_scanlines(&cinfo, buffer, 1);
        fwrite(buffer[0], row_stride, 1, outfile);
    }
	// 关闭全部文件
    close(infile);
    close(outfile);
	return 0;
}

编译sample,注意带上libjpeg库,然后执行sample,把jpeg图片作为输入。

gcc sample_jpeg.c -ljpeg
./a.out ./test3.jpeg

用RGB文件解析工具,查看输出的output.bit文件
在这里插入图片描述

六、其他补充

关于libjpeg的版本移植与升级(待补充)

关于jpeg硬解加速与设计要点(待补充)

关于jpeg常见问题的定位思路(待补充)

关于jpeg的缩略图(待补充)

参考

wiki百科介绍:https://en.wikipedia.org/wiki/JPEG (备注:页面有ITU-T81标准文档)
ITU标准官网:https://www.itu.int/zh/ITU-T/Pages/default.aspx
http://www.360doc.com/content/07/0703/09/2228_591692.shtml
https://blog.csdn.net/yun_hen/article/details/78135122
https://blog.csdn.net/huangxy10/article/details/8117469
https://zhuanlan.zhihu.com/p/27296876
https://blog.csdn.net/carson2005/article/details/7753499
http://blog.csdn.net/shelldon/article/details/54234433
JFIF文件格式:https://blog.csdn.net/johnny_83/article/details/2252599

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图形图像基础 之 jpeg介绍 的相关文章

  • NETCore入门系列(NETCore读取配置文件、.cshtml中文乱码)

    问题 NETCore读取appsetting json时 无法在命令行中输出中文 而是输出一堆问号 如下图 解决方案 1 找到VS中的 工具 gt 自定义 2 找到 命令 gt 菜单栏右侧的下拉列表选择 文件 目的是让后面添加的命令存放在该
  • QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)

    一 引言 今天想要使用QT echarts实现炫酷的界面 但是一开始想的很简单 查找资料才发现 我之前一直使用的MinGw编译器无法使用QWebEngine 这个就很头秃 懵逼 今天搞了快一整天配置环境 中间找了很多文章看 最后试了好多次才
  • LayUi之手风琴的趣味案例

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 Welcome Huihui s Code World 一 手风琴是什么 二 手风琴在什么时候使用 常见使用场景 三 怎么完成手
  • module 常用命令

    原文地址 https blog csdn net l471094842 article details 90728411 Envrionment modules工具用来快速的设置和修改用户编译运行环境 Envrionment modules
  • mysql分区功能详细介绍,以及实例

    一 什么是数据库分区 前段时间写过一篇关于mysql分表的的文章 下面来说一下什么是数据库分区 以mysql为例 mysql数据库中的数据是以文件的形势存在磁盘上的 默认放在 mysql data下面 可以通过my cnf中的datadir
  • 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference

    参考文章 http blog csdn net chen77716 article details 6618779 目前在Java中存在两种锁机制 synchronized和Lock Lock接口及其实现类是JDK5增加的内容 其作者是大名
  • spring boot整合redisTemplate获取自增主键incr

    Autowired RedisTemplate redisTemplate public Long incr String key long liveTime RedisAtomicLong entityIdCounter new Redi
  • 【光感自动窗帘控制系统设计】

    1 概述 1 1 研究背景 伴随着信息化时代的到来 人们的生活速度以及对生活质量的追求也在大幅提高 智能化的产品设计在改变人们工作方式与生活习惯的同时 让人们对生活质量的提升提出了更高的要求 方便 舒适成了人们所追求的生活方式 在现代家庭生
  • 《暗黑世界》《烽烟OL》服务器端零基础架设图文教程!

    欢迎来9秒 www 9miao com python基础环境搭建 window下环境变量设置 设置后可以方便的使用python命令行 以及python路径下的Script工具 1 python的安装路径 2 python script 工具
  • roc-rk3588s-pc镜像 增加 rtl8188eu驱动

    在调试过程 得到天启厂家戴工的大力帮助 写在最前面表示感谢 硬件 1 firefly单板 roc rk3588s pc 2 wifi硬件 comfast 软件 ubuntu 20 04 软件安装 1 从firefly官网下载linux he
  • 想在线编程么,这几个在线代码编辑器网站适合你

    今天给大家推荐几个可以在线编程的网站 对于大部分开发者可能会不屑使用在线的网站 认为在自己电脑安装环境不是很简单的事情么 但是你很有可能临时需要一台电脑去测试一段简单的代码 也有可能想要分享一段代码给别人 也有可能你想要学习很多语言 又不想
  • 更改wsl中系统的安装位置

    wsl默认安装位置是C盘 众所周知C盘总是不够用的 所以才有了把wsl的系统迁移到其它位置的需求 官网文档 首先查看所有分发版本 wsl l all v 列出已安装的Linux发行版 wsl list verbose 导出分发版为tar文件
  • NGUI扩展之 图片置灰

    需求置灰 在属性 面板添加一个小功能 置灰属性 设计思路很简单 就是通过勾选或者不勾选 实现置灰 或者不置灰 包括对scroview的置灰等等 效果预览 代码分析 实际上 在NGUI中 所有需要渲染的 物体 都继承自 wight 而编辑器
  • uni-app开发微信小程序修改微信原生组件样式不生效(踩坑)

    在子组件中使用微信原生组件 通过在子组件内通过局部样式修改微信原生组件样式 发现在父组件中显示时修改的样式并不生效 例如
  • 【旋转字符串的四种方法】

    目录 前言 一 题目描述 二 题目解析 一 依次左旋 二 创建中间数组 三 三次倒置 四 接长数组 总结 前言 来源 力扣 LeetCode 旋转字符串 一 题目描述 题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部
  • 全网最全Python项目体系练习500例(附源代码),练完可就业系列

    1 有一个jsonline格式的文件file txt大小约为10K 2 补充缺失的代码 3 输入日期 判断这一天是这一年的第几天 4 打乱一个排好序的list对象alist 5 现有字典 d a 24 g 52 i 12 k 33 请按va
  • Python 控制台 窗口 布局乱了

    使用的过程中不小心手贱 移动了窗口 把窗口独立出来了 看着比较别扭 点击左上角debug按键后 会在左下角出来如下图片 选择中间三个方块按键 恢复布局 之前乱了的窗口 就变成初始化状态了
  • QGIS 栅格数据裁剪(扣除)

    利用QGIS 以矢量数据范围来扣除栅格数据中的区域 其实也就是赋0值 首先 安装Easy Raster Splitter 插件 准备好矢量数据和栅格数据 打开Easy Raster Splitter 插件 Method 选择 Extract
  • 实时追踪科研动态丨谷歌、马克斯·普朗克光科学研究所等机构精选新论文

    作为科研人员 每天需要检索和浏览大量的学术文献 以获取最新的科技进展和研究成果 然而 传统的检索和阅读方式已经无法满足科研人的需求 AMiner AI 一款集检索 阅读 知识问答于一体的文献知识工具 帮助你快提高检索 阅读论文效率 获取最新

随机推荐

  • ABAP程序修改提示不是原始系统解决方法

    SE03修改原始系统
  • 使用corr()计算相关系数

    import pandas as pd catering sale data catering sale all xls data pd read excel catering sale index col u 日期 print data
  • AntV G6鼠标移入、单击、双击节点,获取节点信息

    如下图所示 对节点常用的事件如下图所示 主要代码 鼠标进入节点 this graph on node mouseenter e gt const nodeItem e item 获取鼠标进入的节点元素对象 console log 鼠标移入
  • 搭建前后端完整结构

    文章目录 一 搭建后端完整结构 1 后端结构说明 1 1 后端作用 1 2 代码结构 1 3 后端测试要求 1 4 编辑 UserController 1 5 编辑UserService UserServiceImpl 1 6 页面展示效果
  • 聚合函数与窗口函数

    聚合函数 回答一 聚合函数 Aggregate Functions 是SQL中的函数 用于对一组数据进行计算 并返回单个结果 聚合函数通常用于统计和汇总数据 包括计算总和 平均值 计数 最大值和最小值等 以下是一些常见的聚合函数 SUM 计
  • myQsort()排序函数

    题目说明 实现一个函数myQsort 可以对Int char 字符串或者其他类型进行排序的函数 提示函数只需要提供排序方法 比较方法通过函数指针 让用户自定义 示例代码 include
  • 100天精通Python(爬虫篇)——第44天:常用爬虫requests模块基础+代码实战

    文章目录 一 request模块大总结 1 下载安装 2 常用属性或方法 3 response text和response content的区别 4 发送带headers参数请求 5 发送带参数请求 6 在headers参数中携带cooki
  • [Linux] linux系统安装git

    目录 前言 一 git的安装方式 二 git 安装流程 2 1 解压下载的压缩包 三 配置Git 3 1 配置git名字和邮箱 3 2 查看名字和邮箱 四 总结 前言 Git是一种分布式版本控制系统 广泛用于软件开发和版本管理 它可以跟踪文
  • Could not resolve placeholder 'foo' in value "${foo}" 解决方法

    D Program Files Java jdk1 8 0 101 bin java agentlib jdwp transport dt socket address 127 0 0 1 50162 suspend y server n
  • 详尽图文,用Intellij Idea创建一个普通的Java工程并用JDBC连接数据库

    Intellij Idea作为一款编程工具 自从尝到它的强大功能带来的甜头后 就再也不想用Eclipse来进行开发了 下面用它来演示一下如何创建一个普通的Java工程 并导入MySql数据库的驱动包 用JDBC方式来连接数据库 Intell
  • HDL4SE:软件工程师学习Verilog语言(四)

    4 模拟器 总是不能运行一个应用程序 对学习语言是致命的 一个Hello World 级别的应用就这么复杂 时间长了会把人的耐心磨尽 因此本节我们先暂停对verilog语言的学习 来讨论模拟器的实现 试图给出一个初步的实现 至少能够完成前面
  • 计算机视觉中的半监督学习

    原文 Amit Chaudhary Semi Supervised Learning in Computer Vision https amitness com 2020 07 semi supervised learning 2020 计
  • 【DDR3 控制器设计】系列博客汇总篇(附直达链接)

    写在前面 本篇为 DDR3 控制器设计系列博客的汇总篇 此系列包含 DDR3 的相关实验 认识 MIG 初始化 读写操作 FIFO 接口等 并附上直达链接 目前只更新了部分文章 持续学习更新中 博客汇总 Project 1 DDR3 控制器
  • 【SSH】如何删掉远程服务器中的虚拟环境?如何删掉远程服务器中的用户?如何删掉某个文件夹?

    文章目录 一 如何删掉远程服务器中的虚拟环境 二 如何删掉远程服务器中的用户 三 如何删掉某个文件夹 一 如何删掉远程服务器中的虚拟环境 在Linux系统下删除conda虚拟环境 删除虚拟环境 conda remove n your env
  • 无线局域网安全协议(WEP、WPA、WAPI)

    文章目录 一 WEP 有线等效保密 二 WPA Wi Fi网络安全接入 三 WAPI 无线局域网鉴别和保密基础结构 WLAN Wireless Local Area Network 指应用无线通信技术将计算机设备互联起来 构成可以互相通信和
  • 分块矩阵求逆不能想当然

    分块矩阵给实际运算带来了很大的方便 对于行列数都很大的矩阵 可以将其分割成一个个小块进行计算 减少了运算的繁琐程度 分块矩阵的求逆有两个非常有用的公式 能帮助我们快速得出正确结果 但是是不对的 只能假设逆矩阵 再通过求多元方程组得出逆矩阵的
  • 【华为od机试】约瑟夫问题-Python3

    题目描述 篮球 5V5 比赛中 每个球员拥有一个战斗力 每个队伍的所有球员战斗力之和为该队伍的总体战斗力 现有10个球员准备分为两队进行训练赛 教练希望2个队伍的战斗力差值能够尽可能的小 以达到最佳训练效果 给出10个球员的战斗力 如果你是
  • DLL的远程注入技术

    转载自 http blog csdn net bai bzl article details 1801023 一 DLL注入 DLL的远程注入技术是目前Win32病毒广泛使用的一种技术 使用这种技术的病毒体通常位于一个DLL中 在系统启动的
  • Spark集群搭建记录

    本文目录 写在前面 step1 Spark下载 step2 修改环境变量 bashrc etc profile step3 配置Master 文件修改 slaves spark env sh step4 配置slave节点 step5 集群
  • 图形图像基础 之 jpeg介绍

    一 概念 jpeg相关概念简介 jpeg 一种影像有损压缩标准方法 后缀jpg jpeg JPEG Joint Photographic Experts Group 联合图像专家小组 是一种针对照片影像而广泛使用的有损压缩标准方法 面向连续