jpg 能做到无损合并吗?一个网页游戏每个场景背景图都是左右半边各一张 jpg 拼起来的,我想无损拼接但不想保存成 png,有可能实现吗?

2023-03-06 21:55:10 +08:00
 edis0n0
3302 次点击
所在节点    程序员
31 条回复
Mithril
2023-03-06 22:03:25 +08:00
什么叫“无损拼接”?

你能看见图的时候,jpg 已经还原成像素矩阵了,该损的也已经损完了。

不考虑缩放的话,你直接截个图都可以。
sakura6264
2023-03-06 22:11:32 +08:00
大概不能。jpeg 压缩时应该是用了 DCT 的,这东西好像没法做拼接。
话说你都用 jpeg 这种有损压缩了还考虑什么无损拼接有意思吗..
edis0n0
2023-03-06 22:19:14 +08:00
@sakura6264 #2 用 jpg 是因为只能搞到 jpg ,收藏用不想有画质损失,如果转成 png 有点浪费空间
zhangberry
2023-03-06 22:19:21 +08:00
读到内存中,转为矩阵,然后相加,再输出。
sakura6264
2023-03-06 22:30:06 +08:00
@edis0n0 只能搞到 jpeg 就代表已经有损失了,后续的所谓不想有画质损失都基本免谈。
到头来就是你能不能接受的问题,唯一的方法就是合并之后再保存为 jpeg ,压缩度开低点,之后安慰自己已经无损了。
jpeg 压缩时候记得是分析整张图的频率信息,丢弃高频项,所以没法直接合并。
更简单的方法就是存两张图...
favourstreet
2023-03-06 23:06:31 +08:00
楼上好像都没理解楼主的需求啊,楼主是想避免二次压制。让合并的图像素级对应原图是可行的,jpg 量化系数和原图一致就成。网上大概有摆弄 jpeg 的现成工具,实在没有的话,用 libjpeg 自己写一个吧
BeautifulSoap
2023-03-06 23:19:56 +08:00
楼主的意思应该是解码 jpg 之后又重新编码为 jpg 是不是会有画质损失。如果次数很少的话损失应该没多大的。但是需要重复好多次的话就会有较为明显的画质损失了(几十上百次

贴吧各种包浆的表情包就是这么来的
mikewang
2023-03-06 23:45:03 +08:00
写过 JPEG 编码器,对 JPEG 略知一二。
理论上两张 JPEG 是存在完全无损拼接的可能性的,但是条件比较苛刻:
1. 长宽像素是 8 的整数倍( YUV422 采样的情况下应该是要 16 的整数倍)
2. 两张 JPEG 有着相同的 Huffman 表和量化表
3. (暂时没想到,可能还有)

总之很苛刻,如果两张 JPEG 压缩的参数不一样(尤其是量化表,用于控制有损压缩效果),拼接只能有损处理。
所以 JPEG 无损裁剪的工具很常见(单个文件只有一种参数设定),而无损拼接的几乎没有。
edis0n0
2023-03-07 01:01:08 +08:00
@favourstreet #6 对,就是这个意思
@mikewang #8 第一个条件就满足不了,看来是不行
NoOneNoBody
2023-03-07 01:30:12 +08:00
import cv2, numpy
cvim1 = cv2.imread(jpg1)
cvim2 = cv2.imread(jpg2)
h,w = cvim1.shape[:2]
cvim2=cv2.resize(cvim2, (w, h), interpolation=inter)
merge = numpy.hstack([cvim1, cvim2])
...
edis0n0
2023-03-07 01:31:23 +08:00
@NoOneNoBody #10 这样导出 jpg 像素就变了
NoOneNoBody
2023-03-07 01:36:07 +08:00
@edis0n0 #11
你自己改啊,我又不知道你的具体场景如何
而且搞不清你说的“像素就变了”是什么意思,拼接后还要像素尺寸不变么?
msg7086
2023-03-07 04:32:33 +08:00
@NoOneNoBody 人家要求合并 jpg 使合并后的文件包含合并后的图片。
你这代码一开始就用 imread 把 jpg 解码成像素矩阵了,完全离题了。
bbroot
2023-03-07 07:48:26 +08:00
你们有没有过度理解了…楼主不就是要把俩张照片拼在一起么…随随便便 ps 就是 Photoshop 一下就好
krixaar
2023-03-07 08:33:52 +08:00
@bbroot #14 需求是避免二次压缩,但凡你把 JPG 打开成图片就输了
orangie
2023-03-07 09:11:13 +08:00
针对这种为需求,应该用一种伪实现,比如设计一个后缀名.j2p ,其本质是一个 zip 包,要求把两张 jpg 按照 1 ,2 明明压缩成 zip 并更改后缀伪.j2p ,在开发一个看图软件专门自动完成解压 j2p 、在显示 jpg 图片的时候自动把两张放在一起显示。反正都是自欺欺人,不如做全套,指不定还能忽悠点外行人。
tool2d
2023-03-07 09:37:17 +08:00
可以转换成 jpeg2000 ,文件格式有提供无损压缩和无损拼接。因为不是 8x8 的 DCT ,可以随意限定块的大小,无所谓第一条图片大小的限制。

jpeg 应该是很古老的格式,现在手机上都被 webp 淘汰了。
sharpy
2023-03-07 09:39:35 +08:00
把解码后的数据用一些格式无损压缩呗
duke807
2023-03-07 09:47:45 +08:00
@orangie
这个实现可不是什么伪实现,它很好,不过不应该叫 j2p 且只支持两张图,应该叫 ipk (image package),支持超多图片,且不限图片种类。

很多行业应用可以用,譬如大桥航拍检测表面裂痕,会产生很多张高清图片,有拼接的需求。

加载可以做成缩略图展示,放大后再高清展示需要显示的一小部分图片,另外软件提供接口,可以根据传入座标和框选范围,返回拼接后的高清图。
lonewolfakela
2023-03-07 09:52:12 +08:00
先讨论一下为啥不想存成 png 吧……这图得是有多大,才会觉得 png 占用空间太大了不合适呢……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921735

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX