c jpeg 理论霍夫曼 DC AC表,c程序实现正向逆向转换

news2024/11/24 10:23:50

此4张表是理论表,不是针对某张图片的特定表。如编码程序不统计生成某图片的专用霍夫曼表,应该也可用理论表代用编码。

1.亮度DC表

a665ef68ef9d4eaa8bde8c83ee5b08e0.jpeg

左边第一列是二进制位数,就是对此位数编码

中间一列是生成比特流的位数,右边是生成的比特流。

2.色度DC表

322bd987a4ce43e890c43ebf8ed9bff2.jpeg

3.亮度AC表

d06b6dd361144075828cdfa9a2028352.jpeg

4.  色度AC表

25c1d9c3df7e4794b7fa5c6cdc0baf02.jpeg

 利用这4张表转换生成亮度,色度的DC,AC比特流

图3图4两张表是用jpeg文件头的形式显示的。

AC 表被编码的数值是两部分组成的,高4比特是0的个数 (a,b)对中的a,低4节为b的二进制位数。

两个AC表中的162个数就是两个输入参数组成的一个字节的值。

对于DC表,直接用if一一例举出现就行了。AC两张表输出都是162个数,这162个数的比特流从1位到16位都有。

  看了AC两张表,最多的是16位的比特流。

AC表的输入为0的个数和二进制位数两个参数,输出为比特流和比特流宽度。

--------------------------------

亮度AC表:

2 位:2个     00(1) ,01(2)

3位:1      010(0),

4位:3      0110(4),0111(11), 1000(5)

5位:3     10010(12) ,10011(21),10100(31)

6位:2     101010(41), 101011(6)

7位:4      1011000(13),1011001(51), 1011010(61),1011011(7)

8位:3        10111000(22),  10111001(71),  10111010(14)

9位:5        101110110(32),  101110111(81), 101111000(91)  ,101111001(A1), 101111010(8)

10位:5      1011110110(23),           1011110111(42),1011111000(b1), 1011111001(c1),1011111010(15)

11位:4     10111110110(52),   10111110111(d1),  10111111000(f0), 10111111001(24)

12位:4     101111110100(33),   101111110101(62), 101111110110(72),101111110111(82)

15位:1     101111111000000(9),

16位 :125     1011111110000010(0a),,,,,,,

共计162个

亮度AC转换:本想用查表法代码太长了,162个if语句。现还不包括16位的数据转换,准备换一种方法。DC可以用这种方法。

​1. 亮度AC编码用正向程序

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

int main(void) {
	unsigned char i_0=0xf;
	unsigned char i_len=0xa;
	
	unsigned char len;
	unsigned int o;
	
	unsigned char zj=i_0*16+i_len;      //合成一个字节
	
	unsigned char  ws[16]={0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d};
	unsigned char zh[162]={0x1, 0x2, 0x3, 0x0, 0x4, 0x11, 0x5,0x12,0x21,0x31,0x41,0x6, 0x13,0x51,0x61,0x7,
		                   0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
		                   0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
	                    	0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
		0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
		0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
		0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
		0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
		0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
		0xe3,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
		0xf9,0xfa
	};
	int cx_ws,cx_b;
	unsigned char hfm[17][0x7d]={};
	int t=0;
	for(int a=0;a<16;a++){             //把要编码的162个数按位数分为16个数组,二位一组....16位一组
		if(ws[a]==0){
			continue;
		}
		
		for(int b=0;b<ws[a];b++){
			hfm[a+1][b]=zh[t];
			t++;
		}
	}
	for(int a=0;a<16;a++){               //查询输入数的位数和在所在组的顺序,组内顺序从0开始
		if(ws[a]==0){
			continue;
		}
		
		for(int b=0;b<ws[a];b++){
			if(	hfm[a+1][b]==zj){
				cx_ws=a+1;         //得到输入数二进制位数,根据此数到相依位数的数组查询
				cx_b=b;            //输入数在按位数分组的数组中所在的位置,从0开始
				break;
			}
		}
	}

	int o_js=0;       //每一组的第一个数的值
	if(cx_ws==2){
		o_js=0;
	}
	if(cx_ws==3){
		o_js=0b010;
	}
	if(cx_ws==4){
		o_js=0b0110;
	}
	if(cx_ws==5){
		o_js=0b10010;
	}
	if(cx_ws==6){
		o_js=0b101010;
	}
	if(cx_ws==7){
		o_js=0b1011000;
	}
	if(cx_ws==8){
		o_js=0b10111000;
	}
	if(cx_ws==9){
		o_js=0b101110110;
	}
	if(cx_ws==10){
		o_js=0b1011110110;
	}
	if(cx_ws==11){
		o_js=0b10111110110;
	}
	if(cx_ws==12){
		o_js=0b101111110100;
	}
	if(cx_ws==15){
		o_js=0b101111111000000;
	}
	if(cx_ws==16){
		o_js=0b1011111110000010;
	}
	len=cx_ws;
	o=o_js+cx_b;
	printf("len:%d o:%d\n",len,o);
	
	return 0;	
}

​

​

2.亮度AC 解码程序


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

int main(void) {
	unsigned int i_bit=0b1011111110000011;
	unsigned char i_len=16;
	
	unsigned char len;
	unsigned char o;
	
	unsigned char  ws[16]={0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d};
	unsigned char zh[162]={0x1, 0x2, 0x3, 0x0, 0x4, 0x11, 0x5,0x12,0x21,0x31,0x41,0x6, 0x13,0x51,0x61,0x7,
		0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
		0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
		0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
		0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
		0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
		0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
		0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
		0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
		0xe3,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
		0xf9,0xfa
	};
	unsigned char  cx_ws,cx_b;
	
	unsigned char hfm[17][0x7d]={};
	int t=0;
	for(int a=0;a<16;a++){             
		if(ws[a]==0){
			continue;
		}
		
		for(int b=0;b<ws[a];b++){
			hfm[a+1][b]=zh[t];
			t++;
		}
	}
//---------------------------------------
	cx_ws=i_len;
	
	int o_js=0;      
	if(cx_ws==2){
		o_js=0;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==3){
		o_js=0b010;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==4){
		o_js=0b0110;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==5){
		o_js=0b10010;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==6){
		o_js=0b101010;
		cx_b=i_bit-o_js;	
	}
	if(cx_ws==7){
		o_js=0b1011000;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==8){
		o_js=0b10111000;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==9){
		o_js=0b101110110;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==10){
		o_js=0b1011110110;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==11){
		o_js=0b10111110110;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==12){
		o_js=0b101111110100;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==15){
		o_js=0b101111111000000;
		cx_b=i_bit-o_js;
	}
	if(cx_ws==16){
		o_js=0b1011111110000010;
		cx_b=i_bit-o_js;
	}
	
//-----------------------------------------

	unsigned char o_zj=hfm[cx_ws][cx_b];

	len=o_zj/16;
	o=o_zj%16;
	
	printf("%x  %x",len,o);
	return 0;	
}






 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thunderbolt 3 PCIe Expansion 扩展卡

计算机目前大部分都能够提供 Thunderbolt 3 接口了。 Thunderbolt 3 的传输速度更快&#xff0c;所以我们需要把 Thunderbolt 3 转换为 SAS HBA&#xff0c;但市场上没有这个转换设备。 后来我们发现有 Thunderbolt 3 PCIe Expansion&#xff0c;就是通过这个设备把 Thunderb…

Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用

场景 Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句&#xff1a; Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句-CSDN博客 上面讲了基本语法&#xff0c;下面记录游标、自定义函数、存储过程的使用。 …

(企业 / 公司项目)代码生成器底层原理:模板框架freemarker

1.按照设置好的模板文件就能生成Java&#xff0c;vue文件&#xff0c;前后端都可生成。 2.也可以进行复杂Excel到处&#xff1a;可以转成xml&#xff0c;用xml来制作模板&#xff0c;在生成excel 3.需要批量生成格式固定的一类文件的需求也可以使用模板框架freemarker 首先引…

大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”

云布道师 2023 年 10 月 31 日-11 月 2 日&#xff0c;2023 云栖大会在中国杭州云栖小镇举行&#xff0c;阿里云弹性计算产品专家唐湘华、阿里云高级安全专家刘煜堃、蚂蚁集团高级技术专家肖俊贤三位嘉宾在【云服务器 & 计算服务】专场中共同带来题为《大数据时代&#xf…

推荐几个好用的开源无代码/低代码开发平台

一、什么是无代码/低代码开发 无代码/低代码开发是一种可视化的应用程序开发方法&#xff0c;使用具有拖放组件和模型驱动逻辑组合的图形界面。无代码/低代码开发试图降低从软件技术平台、产品和服务中提取价值的进入壁垒。低代码开发平台被称为可视化集成开发环境&#xff08…

任意文件下载漏洞的利用思考

0x01 前言 任意文件下载漏洞作为最常见的WEB漏洞之一&#xff0c;在平常的渗透测试中经常遇到&#xff0c;但是很多人却并没有深入去想该如何利用这种漏洞&#xff0c;导致忽略了一些细节的信息。 0x02 传统利用 1&#xff09; 下载配置文件连数据库 通过任意文件下载漏洞下载网…

美团外卖商超商品销量数据

美团外卖商超商品月销量 字段名 店铺id 店铺名称 商品id 商品名称 商品分类 规格名 原价 现价 月销 规格属性 描述 商品图片 含商家月销量

opencv入门到精通——图像的基本操作

目录 目标 访问和修改像素值 访问图像属性 图像感兴趣区域ROI 拆分和合并图像通道 为图像设置边框&#xff08;填充&#xff09; 目标 学会&#xff1a; 访问像素值并修改它们 访问图像属性 设置感兴趣区域(ROI) 分割和合并图像 本节中的几乎所有操作都主要与Numpy相…

生成对抗网络与人工智能的完美融合:创新、艺术与未来

导言 生成对抗网络&#xff08;GAN&#xff09;作为一种深度学习框架&#xff0c;以其独特的生成能力引起广泛关注。生成对抗网络&#xff08;GAN&#xff09;与人工智能的结合不仅在科学领域引起了巨大的关注&#xff0c;也在艺术、医学等多个领域催生了令人振奋的创新。本文将…

Ring Co-XOR encryption based reversible data hiding for 3D mesh model

期刊&#xff1a;Signal Processing 作者&#xff1a;Lingfeng Qu et al. -- 摘要&#xff1a; 加密域可逆数据隐藏被广泛应用于云存储数字媒体的内容安全、隐私保护和便捷管理。然而&#xff0c;RDH-ED技术在三维网格模型载体中的应用研究仍处于起步阶段。为解决现有针对三…

网络安全:网络安全的技术趋势与发展

1.背景介绍 网络安全是现代信息化时代的重要问题之一&#xff0c;它涉及到计算机网络的安全性、数据的完整性、隐私保护等方面。随着互联网的不断发展&#xff0c;网络安全问题也日益复杂化。本文将从多个方面进行探讨&#xff0c;以帮助读者更好地理解网络安全的技术趋势与发…

经典问题:先更新数据库,还是先更新缓存?

之前分享了缓存使用中的几个问题场景&#xff1a;缓存穿透、缓存击穿和缓存雪崩&#xff0c;这几个问题聚焦的是缓存本身的稳定性&#xff0c;包括缓存集群和缓存的数据&#xff0c;除了这些&#xff0c;缓存应用中&#xff0c;缓存和上下游系统的数据同步也很重要。本文我们来…

数据结构学习 leetcode64最小路径和

动态规划 题目&#xff1a; 建议看这里&#xff0c;有这道题详细的解析。我觉得写的挺好。 这是我在学动态规划的时候&#xff0c;动手做的一道题。 虽然我在学动态规划&#xff0c;但是我之前学了dps&#xff0c;所以我就想先用dps试着做&#xff0c;结果发现不行&#xf…

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考&#xff1a; Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线&#xff0c;其中X轴是’category’ 类目轴&#xff0c;适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…

kibana-7.15.2 一分钟下载、安装、部署 linux

文章目录 一、下载安装部署 1. 下载2. 解压3. 修改配置 二、kibana 启动 2.1. 创建kibana 用户2.2. 赋予权限2.3. 切换用户2.4. kibana启动2.5. 监控服务2.6. 监控服务2.7. kibana停止2.8. 效果图 三、kibana 启动2 3.1. 浏览器访问3.2. 效果图 一、下载安装部署 https:…

Google Play不会凭空消失,这篇文章带你重新找回丢失的它

你是不是因为不小心从手机上删除了Google Play而难过?或者你是否注意到你的Android设备上缺少Google Play图标?你一定很担心你现在会如何下载应用程序。别担心。在这篇文章中,我们将告诉你如何恢复已删除的谷歌商店。 Google Play可以卸载吗 让我们明确一点:除了一些特殊…

k8s 中部署Jenkins

创建namespace apiVersion: v1 kind: Namespace metadata:name: jenkins创建pv以及pvc kind: PersistentVolume apiVersion: v1 metadata:name: jenkins-pv-volumenamespace: jenkinslabels:type: localapp: jenkins spec:#storageClassName: manualcapacity:storage: 5Giacc…

【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述 现在假设有一个script资源加载失败&#xff0c;代码如下 <!DOCTYPE html> <html> <head><title>script 资源加载失败</title> </head> <body><script src"http:hdh.sdas.asdas/1.js"></script> &l…

智能优化算法应用:基于类电磁机制算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于类电磁机制算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于类电磁机制算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.类电磁机制算法4.实验参数设定5.算法…

Git账户密码http方式的配置

Git账户密码http方式的配置 入门 git在提交时每次都需要输入密码和账号信息&#xff0c;可以将账号和密码进行持久化存储&#xff0c; 当git push的时候输入一次用户名和密码就会被记录&#xff0c; 不需要每次输入&#xff0c;提高效率&#xff0c;进行一下配置&#xff1…