将BMP 格式图片转换为 JPEG 格式【c语言】

article/2025/8/28 8:48:32

源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502.

一、任务及目标

利用c语言,通过将 RGB 信息转换为 YCrCb 信息、离散余弦变化、量化和 z 型编码,再进行游程编码和霍夫曼编码,最后进行尾部填充的方式,将BMP 格式图片转换为 JPEG 格式。

二、原理及设计方案

c语言环境下,在主函数中输入 BMP 格式和 JPEG 格式图片的名称,然后调用 BMP 格式图片信息读取模块,再调用 JPEG 图片格式初始化并写入头信息模块,最后调用综合处理与编码模块填充 JPEG 图片。
在这里插入图片描述
BMP 格式图片信息读取模块主要是读取 BMP 格式图片的信息,做相关的处理并存储。
JPEG 图片格式初始化并写入模块主要是填充 JPEG 图片的头部信息,并写入到相关的文件中。
综合处理与编码模块包括:将 RGB信息转换为 YUV信息、离散余弦变化、量化和 z型编码,再进行游程编码和霍夫曼编码,最后进行尾部填充。

三、步骤及结果

3.1BMP格式信息处理

在这里插入图片描述
1)转换为 24 位:

for(unsigned long int n = 0; n < x8*yimage; ++n){RGB_buf[n].B = RGBa_buf[n].B;RGB_buf[n].G = RGBa_buf[n].G;RGB_buf[n].R = RGBa_buf[n].R;}

2)逆序处理:

memcpy(tmpline, RGB_buf+line_up*ximage, ximage*3);
memcpy(RGB_buf+line_up*ximage,RGB_buf+line_down*ximage, ximage*3);
memcpy(RGB_buf+line_down*ximage, tmpline, ximage*3);

3.2JPEG 格式图片头部处理

根据固定的值和相关的表的信息对 JPEG 头部内容进行赋值,然后写入到相关的文件中。

3.3综合处理与编码模块

在这里插入图片描述
1)计算huffman编码表
在循环中进行如下操作:

HT[values[pos]].value = codevalue;  //编码值 
HT[values[pos]].length = k;  //长度
pos ++; 
codevalue++

并且在该长度的编码遍历完成后 codevalue 左移一位。

2)RGB转化为YUV: 根据原理部分相关的公式计算即可。

3)离散余弦变换:
在四重循环中进行如下操作:

tmp += data[i][j] * cos((2*i+1)*u*PI/(2.0 * 8)) * cos((2*j+1)*v*PI/(2.0 * 8)); 

在二重循环结束后乘以相关的系数并存储。
4)量化和 z 型编码:
离散余弦变化的值除以量化表并乘以相关的量化系数,然后再讲此值按四舍五入的规则变换为整数,得到量化后的值:

temp = output[i][j] / (float)((double)fdtbl[z[i*8+j]]); 
outdata[i*8+j] = (signed short int) ((signed short int)(temp + 16384.5)-16384); 

在量化完成后,根据z矩阵中的顺序,改变数据存储的顺序,目的是让矩阵右下角更多的0连续存储:

for (i = 0; i <= 63; i++) 
D2[z[i]] = D1[i]; 

5)直流编码:
单独对矩阵的左上角的第一个值进行处理,求出其与上一个矩阵的左上角的值的差值,然后用 huffman 编码表示此差值二进制编码的长度,并写入文件中,然后再写入该值的二进制编码。

6)交流编码:
首先求出尾部0的数量,若63个值全为0则写入0x00:

for(endpos = 63; (endpos > 0) && (D2[endpos] == 0); --endpos); 
if(endpos == 0) 
{ 
writefile(ACtable[0x00]); 
return ; 
} 

若不全为 0,则处理相应的内容:

startpos = i; 
for(; (D2[i] == 0) && (i <= endpos); ++i); 
nz = i - startpos;

若是连续0的数量超过15需要单独处理:

for(;nz >= 16; nz -= 16) 
writefile(ACtable[0xf0]); 

前4bit表示0的数量,后4bit表示后面二进制数的长度,进行huffman编码:

writefile(ACtable[nz*16+code_d[D2[i]].length]); 
writefile(code_d[D2[i]]); 
++i; 

最后,若尾部0的数量不是0,则在尾部写入0x00。

3.4 尾部信息处理

填充并写入结尾标志:

if(bytepos > 0) 
{ 
fillbit.length = bytepos; 
fillbit.value = 0; 
writefile(fillbit); 
} 
writeword(0xffd9);  //EOI

四、结果

在这里插入图片描述
压缩前后图片内容对比:
在这里插入图片描述
压缩前后图片大小对比:
在这里插入图片描述
从结果可以看出,压缩前后图片的内容几乎看不出变化,但是图片的大小差距非常大,大约缩小为原来的1/20,实现了压缩的功能。


http://chatgpt.dhexx.cn/article/Zr1Hei0M.shtml

相关文章

如何批量将 bmp 格式图片转换转换为 jpg

概要&#xff1a;png 和 jpg 这两种格式的图片相信大家都非常熟悉&#xff0c;但是 bmp 格式的图片可能大家接触得并没有那么多&#xff0c;bmp 是 Windows 操作系统中的标准图像文件格式&#xff0c;能够被多种 Windows 应用程序所支持&#xff0c;因此格式的图片在 Windows 操…

bmp格式图的解析

文章目录 前言 一、bmp格式图的特点 二、bmp格式图的解析 总结 前言 在图像处理中经常会遇到BMP格式图的解析问题&#xff0c;本文简单介绍了bmp格式图的解析方式&#xff0c;并附上相应的C代码。 一、bmp格式图的特点 bmp图通常由图片的头文件信息和像素数据组成&#xff0c…

R语言与多元线性回归分析计算实例

6.3.7 计算实例 例 6.9 某大型牙膏制造企业为了更好地拓展产品市场&#xff0c;有效地管理库存&#xff0c;公司董事会要求销售部门根据市场调查&#xff0c;找出公司生产的牙膏销售量与销售价格&#xff0c;广告投入等之间的关系&#xff0c;从而预测出在不同价格和广告费用下…

多元线性回归检验

多元线性回归模型通常用来研究一个应变量依赖多个自变量的变化关系&#xff0c;如果二者的以来关系可以用线性形式来刻画&#xff0c;则可以建立多元线性模型来进行分析。 1.t检验 t检验是对单个变量系数的显著性检验&#xff0c;一般看p值&#xff1b; 如果p值小于0.05表示该…

[DataAnalysis]多元线性回归深入浅出-案例+模型假设+参数估计方法+模型评判方法+变量选择+多重共线性问题

一、案例介绍 1、目的&#xff1a;利用上市公司当年的公开财务指标预测来年盈利情况最重要的投资人决策依据。 2、数据来源&#xff1a;随机抽取深市和沪市2002和2003年的500个上市公司样本预测来年的净资产收益率。 3、解释变量包括&#xff1a;资产周转率、当年净资产收益…

基于spss的多元回归分析模型

还是数学建模中的一个小问题&#xff0c;具体概念分析在百度上的大佬说的已经足够详细&#xff0c;在此不再赘述。 链接: 多元回归分析. 我主要根据实例讲解如何通过spss进行建模&#xff0c;并进行模型参数的分析和验证。 打开spss&#xff08;如果遇到打不开的情况&#x…

多元线性回归分析预测法概述

在市场的经济活动中&#xff0c;经常会遇到某一市场现象的发展和变化取决于几个影响因素的情况&#xff0c;也就是一个因变量和几个自变量有依存关系的情况。而且有时几个影响因素主次难以区分&#xff0c;或者有的因素虽属次要&#xff0c;但也不能略去其作用。例如&#xff0…

用R进行多元线性回归分析建模

概念&#xff1a;多元回归分析预测法&#xff0c;是指通过对两个或两个以上的自变量与一个因变量的相关分析&#xff0c;建立预测模型进行预测的方法。当自变量与因变量之间存在线性关系时&#xff0c;称为多元线性回归分析。 下面我就举几个例子来说明一下 例一&#xff1a;谋…

基于Python的多元线性回归分析

一、多元线性回归分析&#xff08;Multiple regression&#xff09; 1.与简单线性回归相比较&#xff0c;具有多个自变量x 2.多元回归模型 其中是误差值&#xff0c;与简单线性回归分析中的要求特点相一致。其余的系数和截距为参数。 3.多元回归方程 4.估计多元回归方程(点估…

多元线性回归--案例分析及python实践

回归分析--多元回归 介绍一下多元回归分析中的统计量 总观测值总自变量自由度&#xff1a;回归自由度 &#xff0c;残差自由度 SST总平方和 SSR回归平方和 SSE残差平方和 MSR均方回归 MSE均方残差 判定…

回归分析:多元线性回归模型 白话解析与案例实现

文章目录 线性学习多元线性回归模型多元线性回归模型的python实现 线性学习 回归分析是研究自变量x与因变量y的关系的方法。 上一节我们介绍了一元线性回归&#xff0c;经验公式为&#xff1a; $ \hat{y}\hat{\beta}1 x\hat{\beta}0 $ 在实际生活中&#xff0c;我们要研究的…

多元统计分析——多元线性回归

1. 经典的线性回归分析与交叉验证 examDict{ 学习时 :[0.50, 0.75, 1.00, 1.25,1.50,1.75, 1.75,2.00, 2.25,2.50, 2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], 分:[10,22,13 ,43,20,22,33,50,62 , 48,55,75,62,73,81,76,64,82,90,93]} examDf pd.DataFrame(examDi…

spss进行多元线性回归并分析表格(转载)

1.如何使用spss进行多元线性回归。 2.分析生成结果&#xff0c;并判断回归是否可行。 一、使用spss进行多元线性回归&#xff1a; 1.输入数据 二、表格结果分析&#xff1a; R方是检验回归是否成功的重要要素之一&#xff0c;DW是残差独立性检验&#xff0c;衡量标准如下&…

数据分析方法--回归分析方法((SPSS建模:多元线性回归案例)

文章目录 回归定义最常用回归方法一、线性回归(Linear Regression)二、逻辑回归(Logistic Regression)三、多项式回归(Polynomial Regression)四、逐步回归(Stepwise Regression)五、岭回归(Ridge Regression)六、套索回归(Lasso Regression)七、回归(ElasticNet) 如何正确选择…

线性回归 - 多元线性回归案例 - 分析步骤、输出结果详解、与Python的结果对比 -(SPSS建模)

现在用 Python 写线性回归的博客都快烂大街了&#xff0c;为什么还要用 SPSS 做线性回归呢&#xff1f;这就来说说 SPSS 存在的原因吧。 SPSS 是一个很强大的软件&#xff0c;不用编程&#xff0c;不用调参&#xff0c;点巴两下就出结果了&#xff0c;而且出来的大多是你想要的…

SPSS--回归-多元线性回归模型案例解析!(一)

SPSS--回归-多元线性回归模型案例解析&#xff01;(一&#xff09; 多元线性回归&#xff0c;主要是研究一个因变量与多个自变量之间的相关关系&#xff0c;跟一元回归原理差不多&#xff0c;区别在于影响因素&#xff08;自变量&#xff09;更多些而已&#xff0c;例如&#x…

多元回归分析(线性回归)

多元线性回归分析 一、回归的基本理解&#xff08;1&#xff09;回归的基本任务&#xff08;2&#xff09;回归里的关键词&#xff08;3&#xff09;回归里的数据类型&#xff08;4&#xff09;回归方程中的系数解释&#xff08;5&#xff09;扰动项要满足的条件&#xff08;1&…

多元线性回归分析详细介绍

一文搞懂——多元线性回归分析 回归分析定义回归的使命回归分析的分类数据的分类数据的收集 线性回归对于线性的理解回归系数的解释核心解释变量和控制变量四类模型回归系数的解释特殊的自变量&#xff1a;虚拟变量X含有交互项的自变量 回归实例题目Stata解决第一步&#xff1a…

多元线性回归分析示例

GLM模型应用于脑功能影像分析时&#xff0c;在某个因素影响下&#xff0c;由beta图&#xff0c;经过t检验得到脑区显著激活的区域。应用于其他地方也可加深我们对于模型的理解。 clc,clear; X[ 136.5 215136.5 250136.5 180138.5 2501…

【课程设计】计算机组成与系统结构

计算机组成与系统结构课程设计(2020.12) 保姆式教程 目录 计算机组成与系统结构课程设计(2020.12)一、本课程设计的性质、目的、任务二、本课程设计的基本理论三、课程设计的主要内容四、微程序流程图&#xff08;树形图&#xff09;五、模型机微指令表六、机器指令程序的说明…