如何在不使用十六进制编辑器解码的情况下将2个JPEG无损地连接在一起?

如何在不使用十六进制编辑器解码的情况下将2个JPEG无损地连接在一起?,jpeg,Jpeg,我正在尝试编写一个程序(java中的prob),将多个JPEG无损地连接在一起,而不首先对它们进行解码 我想我应该从简单开始,试着用十六进制编辑器将两个相同大小的JPEG以相同的设置一个接一个地压缩 首先,我提取jpeg B的图像数据并将其附加到jpeg A。通过修改标题中指定的尺寸,我得到了一个新的可识别图片(附加在y轴上的jpeg A+jpeg B),可以显示。然而,尽管jpeg B中的图像数据可以清楚地识别,但它似乎丢失了很多颜色信息,显然是不正确的 所以我的问题是我错过了什么步骤?我不认

我正在尝试编写一个程序(java中的prob),将多个JPEG无损地连接在一起,而不首先对它们进行解码

我想我应该从简单开始,试着用十六进制编辑器将两个相同大小的JPEG以相同的设置一个接一个地压缩

首先,我提取jpeg B的图像数据并将其附加到jpeg A。通过修改标题中指定的尺寸,我得到了一个新的可识别图片(附加在y轴上的jpeg A+jpeg B),可以显示。然而,尽管jpeg B中的图像数据可以清楚地识别,但它似乎丢失了很多颜色信息,显然是不正确的

所以我的问题是我错过了什么步骤?我不认为有任何其他维度特定的标题值需要更改,所以我可能需要对来自两个JPEG的图像数据进行哈夫曼解码,然后将它们附加在一起,然后重新编码批次

我花了一些时间阅读jpeg规格和标题等,但老实说,我已经超出了我的深度,真的可以用一两个指针

非常感谢你的帮助



谢谢你的建议。是的,这是绝对可能的,我应该在我的原始问题中提到jpegtran。我基本上是在尝试复制jpegtran功能的这一方面,但在我自己的程序中使用它。我想我应该看看jpegtran的源代码,但我对C一无所知,对一般编程也不太了解,所以反向工程源代码说起来容易做起来难

无损JPEG操作在很大程度上是自相矛盾的。你可以做一些诡计,比如旋转,但基本上就是这样


我建议您使用无损源图像(想到TIFF或PNG),或者重新评估您的图像质量要求——对于绝大多数人来说,重新对JPEG进行采样(提供体面的原始文件)是无法区分的。

JPEG就像mp3一样,在重新压缩时通常是稳定的(使用相同的算法)


因此,当您加入图像并重新压缩它们时,只需确保新的压缩率高于或等于两张图片中的最高值即可。这样你就不会真的失去准确性。

你想做的基本上是不可能的。
JPEG文件的编码有点复杂,如果要更改像素的内容,则编码将被更改。您可能最终得到的图像小于或大于合并的两个图像之和。 唯一可能的无损操作是与原始图像的像素保持一对一对应的操作。这基本上归结为90度旋转。

两种方法:

1) 对两个源JPEG图像进行解码,合并生成的位图并再次编码为JPEG。这里的缺点是重新压缩


2) 确保源图像的宽度和高度是16的倍数,可能需要裁剪图像。不要解码图像,而是从源MCU块(16 x 16像素大小,因此裁剪)组装目标JPEG。

这是非常可行的。我在很多谷歌地图图像块上做了这项工作,将它们连接起来,形成海报大小的图像。Unix上有一个名为JPEG Tools的软件包,可以完全做到这一点。程序名为。纯C源代码,可用。编译时,它会创建一个命令行应用程序,在运行时,它会将两个jpeg图像无缝地连接在一起。它不会对任何图像进行反压缩,只是将压缩后的数据合并在一起,并相应地修复标题。我用它合并了100幅图像,创建了50个条带,然后再次合并这些条带,创建了一个大图像

有关更多信息,请访问

源代码


可以找到基础库的源代码。模拟jpegjoin的一个示例脚本是。

好的,我找出了哪里出了问题

1) 图像扫描数据以字节为单位保存,但实际重要信息编码为可变长度位字符串。这意味着实际图像数据的结尾不一定落在字节边界上。当jpeg编码器需要填充比特数以形成字节边界时,它只需添加一系列1

2) 实际像素信息的存储方式有点太复杂(至少对我来说)难以解释,但基本上所有内容都是在MCU、最小编码单元或其他东西中编码的。它们的大小取决于色度子采样,水平和垂直大小为8或16像素。对于每个MCU,直流和交流部分构成亮度、Y或色度、Cb和Cr的单个分量。问题是直流分量存储为与前一个MCU的相关直流值相关的值。因此,当我从jpg B添加新的图像数据时,它存储了与0相关的DC值(因为以前没有MCU),但它需要考虑来自jpg A的最后一个MCU的最终DC值(希望有意义)

解决方案:

您需要对图像数据进行初始解码(Huffman+runlength),以准确找出图像数据的结束位置,然后去掉后面的1。您还需要适当地更改第二个jpg中的初始DC值。然后需要重新编码适当的位,添加1以适应字节边界,等等

如果要在x轴中追加,则需要稍微复杂一点。您必须重新排列MCU,以便它们以正确的顺序扫描。Jpgs从左到右扫描,然后从上到下扫描,然后适当调整DC值

到目前为止,我只在单MCU JPG上测试了这个功能,但理论上,它也应该适用于更大的MCU JPG


BTW,我只是这样做的,感谢这个

< P>的所有者,我建议你考虑DRI和RSTN标记,虽然这需要很多前提条件,但是它对我来说是有效的:附加PPM(A)。