c JPEG ZRL (15,0) 的问题

问题:如果量化表全为64个1,编码图片显示非常乱。如果用压缩比较大的量化表,显示基本正常。如果编码过程中不处理ZRL,图片正常。此问题一直没有排除。

下图为两张量化表全为64个1的情况下加了(15,0)后的不正常图片,。如果用压缩比较狠的量化表,图像基本正常。

 

d95e216c2bc44a389dfa8badfd2fcf35.jpeg

 

下面是ffmpeg 的亮度色度量化表,用的是同一张表。压缩效果比jpeg官方的量化表好,用此表图像完美。

    8, 16, 16, 19, 16, 19, 22, 22, 22, 22, 22, 22, 26, 24, 26, 27, 27, 27, 26, 26, 26, 
    26, 27, 27, 27, 29, 29, 29, 34, 34, 34, 29, 29, 29, 27, 27, 29, 29, 32, 32, 34, 34,
     37, 38, 37, 35, 35, 34, 35, 38, 38, 40, 40, 40, 48, 48, 46, 46, 56, 56, 58, 69, 69, 83

//---------------------------------------------------------------------------------------------------------------

DC  的ZRL霍夫曼码 为:0b11111111001

AC 的ZRL 为:0b1111111010

看网上文章说,遇到(15,0),直接写ZRL霍夫曼二进制码就可以了。但这样操作图片显示是乱的。用fim显示生成的jpg图片,提示霍夫曼码错误。如跳过直接不操作(15,0),生成的图片正确。

下面代码为Z去0, 规范程序

//-----------去0-----------------------------int q0(int i[64], int (*o)[2]) {int t = 0;int ls[64][2] = {};ls[0][1]=0;           ls[0][0] = i[0]; //DCt=1;for (int a = 1; a < 63; a++) {if (i[a] != 0) {ls[t][0] = i[a];    ls[t][1] = a;t=t+1;}}//----------------------------------------------------int n = 0;o[0][1] =0;o[0][0] =ls[0][0];n=1;for (int a = 1; a < t; a++) {if (((ls[a][1] - ls[a - 1][1]) < 16)) {o[n][1] = (ls[a][1] - ls[a - 1][1])-1;     //ls[a][1] - ls[a - 1][1]o[n][0] = ls[a][0];n++;	continue;}if (((ls[a][1] - ls[a - 1][1]) >= 16)&&((ls[a][1]-ls[a-1][1])<32)) {o[n][1] = 15;o[n][0] = 0;n++;o[n][1] = ls[a][1] - ls[a - 1][1] - 17;o[n][0] = ls[a][0];n++;continue;}
/*		if(((ls[a][1]-ls[a-1][1])>=32)&&(ls[a][1]-ls[a-1][1]<48)){o[n][1]=15;o[n][0]=0;n=n+1;o[n][1]=15;o[n][0]=0;n=n+1;o[n][1]=ls[a][1]-ls[a-1][1]-33;o[n][0]=ls[a][0];n=n+1;//		printf("%d ,",32);continue;}if(((ls[a][1]-ls[a-1][1])>=48)){o[n][1]=15;o[n][0]=0;n=n+1;o[n][1]=15;o[n][0]=0;n=n+1;o[n][1]=15;o[n][0]=0;n=n+1;o[n][1]=ls[a][1]-ls[a-1][1]-49;o[n][0]=ls[a][0];n=n+1;//		printf("%d ,",48);continue;}*/}if(ls[t-1][1]<62){o[n][1] = 0;o[n][0] = 0;}return n + 1;}

 

此代码如果注释掉连续16个以上的0的if语句后,编码的图片显示正常。

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sys/mman.h>   //如果直接读文件到数组,也可不用此头文件
#define file "/home/wjs/Pictures/Wallpapers/abc-123.jpg"
int main(void){FILE *f = fopen(file, "rb");  if (f == NULL) {puts("filename error");exit(-1);}fseek(f, 0, SEEK_END);int len_file = ftell(f);fseek(f, 0, SEEK_SET);int fd = fileno(f);unsigned char *p = mmap(NULL, len_file, PROT_READ, MAP_SHARED, fd, 0); u_int8_t  *zj=malloc(90000000);int t=0;for(int a=0;a<len_file;a++){if((p[a]==255)&&(p[a+1]==218)){printf("%d\n",a);  //3936}zj[t]=p[3936+14+a];t++;		}
//	printf("%x\n",zj[1]); u_int8_t *bit=malloc(90000000*8);int n=0;for(int b=0;b<t;b++){for (int a = 8; a > 0; a--) {bit[n]= (zj[b]& (int)pow(2, (a - 1))) >> (a - 1); //取ls 每一位数n++;}}for(int a=0;a<16;a++){//  	printf("%d, ",bit[a]);}int k=11;for(int a=0;a<n;a++){if((bit[a]==1)&&(bit[a+1]==1)&&(bit[a+2]==1)&&(bit[a+3]==1)&&(bit[a+4]==1)&&(bit[a+5]==1)&&(bit[a+6]==1)&&(bit[a+7]==1)&&(bit[a+8]==0)&&(bit[a+9]==0)&&(bit[a+10]==1)){printf("%d %d %d %d %d %d %d %d %d \n",bit[a+k],bit[a+k+1],bit[a+k+2],\bit[a+k+3],bit[a+k+4],bit[a+k+5],bit[a+k+6],bit[a+k+7],bit[a+k+8]);}}free(bit);free(zj);return 0;
}

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] }

[Bug] [OpenAI] [TypeError: fetch failed] { cause: [Error: AggregateError] } ubuntu20 win10 edge浏览器访问 服务器部署 页面打开后想使用chatgpt报错了 rootcoal-pasi1cmp:/www/wwwroot/ChatGPT-Next-Web# PORT3000 yarn start yarn run v1.22.19 warning package.json:…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应&#xff0c;当你取出的值为对象类型&#xff0c;需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应&#xff0c;即 只代理了对象的第一层&#xff0c;也就是 shallowReactiv…

【方法论】费曼学习方法

费曼学习方法是由诺贝尔物理学奖得主理查德费曼提出的一种学习方法。这种方法强调通过将所学的知识以自己的方式解释给别人来提高学习效果。 费曼学习方法的步骤如下&#xff1a; 选择一个概念&#xff1a;选择一个要学习的概念或主题。 理解和学习&#xff1a;用自己的方式学…

TCP四次握手

TCP 协议在关闭连接时&#xff0c;需要进行四次挥手的过程&#xff0c;主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下&#xff1a; 客户端发送 FIN 包&#xff1a;客户端发送一个 FIN 包&#xff0c;其中 FIN 标识位为 1&#xff0c…

MATLAB - 仿真单摆的周期性摆动

系列文章目录 前言 本例演示如何使用 Symbolic Math Toolbox™ 模拟单摆的运动。推导摆的运动方程&#xff0c;然后对小角度进行分析求解&#xff0c;对任意角度进行数值求解。 一、步骤 1&#xff1a;推导运动方程 摆是一个遵循微分方程的简单机械系统。摆最初静止在垂直位置…

阿赵UE学习笔记——14、LOD

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法。这次看看虚幻引擎的Level Of Detail(LOD)的用法。 一、测试场景准备 用植物系统&#xff0c;在地形上面刷了好多草&#xff1a; 这个时候看一下网格&#xff0c;会发现网格比较多和密集。 …

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限&#xff0c;只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s &#xff0c;该字符串由用户输入。按键变更的定义是&#xff1a;使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次&#xff0c;而 s “bBBb”…

tableau绘制雷达图

目标图形: 1. 数据准备 &#xff08;1&#xff09;原始数据 你要进行用雷达图比较的对象的各指标的数据。 (2) 处理后数据 在原数据的基础上添加对各指标进行区间的划分数据&#xff0c;也就是层级的划分。 2. 操作步骤 &#xff08;1&#xff09;数据转化 转化前&#xf…

Logstash 7.7.1版本安装系统梳理

前言 上一篇文章介绍了 《ElasticSearch7.7.1集群搭建 & Kibana安装》&#xff0c;今天说一下 Logstash的安卓和配置&#xff1b; Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包&#xff08;thin jar&#xff09;2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手&#xff1f;总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

补充推导步骤,重写 Matrix Computations 5.1.2 节

本来的内容有点小小的跳跃&#xff0c;补一下跳跃的部分&#xff0c;下次推导时省点时间&#xff0c;备忘 1. 补充后的内容 2. 代码 LaTeX code&#xff1a; \documentclass{article} \title{Matrix Computations 5.1.2 time saving revision} \date{} \begin{document} \mak…

CSRF靶场练习

简述&#xff1a;CSRF漏洞实际很少&#xff1b;条件限制很多&#xff1b;局限性很大&#xff1b;实验仅供参考&#xff0c;熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息&#xff1b; 点击修改个人信息&#xff0c;发现数据包…

[office] excel2010双向条形图制作 #经验分享#微信

excel2010双向条形图制作 本教程为大家介绍一下excel2010中excel2010双向条形图制作方法。 1.选中工作区域 2.点击插入-->图表,选择条形图 3.为美观可将中间竖线可去掉 4.方法是选中竖线,右击-->删除 5.接下来将图例靠上,选中图例,右击-->设置图例格式-->图例选项…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

【Tomcat与网络8】从源码看Tomcat的层次结构

在前面我们介绍了如何通过源码来启动Tomcat&#xff0c;本文我们就来看一下Tomcat是如何一步步启动的&#xff0c;以及在启动过程中&#xff0c;不同的组件是如何加载的。 一般&#xff0c;我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat&#xff0c;如果…

如何用MapTalks IDE来发布网站?

简介 MapTalks IDE 全称 MapTalks集成设计环境&#xff08;Integrated Design Environment&#xff09;&#xff0c;是由MapTalks技术团队开发的新一代web地图设计软件。 通过MapTalks IDE&#xff0c;您可以自由的创建二维和三维地图&#xff0c;在其中载入或创建地理数据&a…

计算机语言的发展历史

计算机编程语言的发展&#xff0c;是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低&#xff0c;应用到人类社会的场景就会越多&#xff0c;那么所需要的算法就会越复杂&#xff0c;也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的EN…

【JavaSE篇】——内部类

目录 &#x1f393;内部类 &#x1f388;内部类的分类 &#x1f6a9;实例内部类 一.如何实例内部类对象 二.实例内部类中为什么不能有静态成员变量 &#xff08;用final解决&#xff09; 三.在实例内部类对象时&#xff0c;如何访问外部类当中相同的成员变量&#xff1f;…

linux中常用的命令

一&#xff1a;tree命令 &#xff08;码字不易&#xff0c;关注一下吧&#xff0c;w~~w) 以树状形式查看指定目录内容。 tree --树状显示当前目录下的文件信息。 tree 目录 --树状显示指定目录下的文件信息。 注意&#xff1a; tree只能查看目录内容&#xff0c;不能…

基于MongoDB实现聊天记录的存储

一、mongodb简介 1.1 mongodb简介 MongoDB是一个基于分布式文件存储的数据库&#xff0c;使用C语言编写。它旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB介于关系数据库和非关系数据库之间&#xff0c;是非关系数据库当中功能最丰富、最像关系数据库的。 Mong…