如何在不影响质量的情况下为JPEG照片添加边框?


24

我有一张JPEG格式的照片,分辨率为4680x3120。我想在这张照片周围添加白色边框,将其变成5200x3467照片(出于打印原因)。

显然,我并没有更改或删除照片中的任何内容,而只是添加了一些内容。因此,原则上该过程可以是无损的。但是,如果我要使用“画图”添加此边框,“画图”的“保存”过程会将照片再次压缩为JPEG格式,从而丢失信息和质量。

有没有办法(一些更专业的程序)在JPEG照片上添加一些东西(如边框)​​,而又不影响照片的原始部分,又不降低其质量?

Answers:


35

尽管Philip的答案是最好的方法,但可以完全在JPEG范围内做您想做的事情。

JPEG的工作原理是将图像分成称为最小编码单位(MCU)的块,每个块通常为16×16,然后分别进行压缩。当您将压缩级别提高到很高时,您可以在图像中看到这一点。在更合理的压缩级别下,这些块非常平滑地融合在一起,以至于您永远看不到边界。

我们可以利用这一事实为图像无损添加简单的白色边框。我们只需要创建一个与输出图像大小相等的空心白色块阵列,然后将原始JPEG MCU块放入中间即可。¹

该技术有一个缺点:它仅在输入和输出图像大小均为MCU大小的偶数倍时才起作用。如果不是这种情况,我们需要在白色边框和原始图像边缘之间的空白处重新压缩一些块。你不会看到在输出这种差异如果从过高的JPEG压缩级别望而却步,所以它仍然是有效的无损。

我不知道有任何程序可以做到这一点。我所知道的最接近的东西是进行逆运算的东西:jpegtran具有裁剪功能,可以无损地切掉部分图像边缘。²它是通过丢弃沿图像边缘的裁剪掉的MCU,将其保留在图像中来实现的。中间没动过。

我知道的最简单的现成解决方案是用于Photoshop 的Better JPEG Lossless Resave插件。它使用基于上述思想的技术尽可能地从原始图像复制MCU,以避免像Photoshop一样从未压缩版本重新创建它们。³


题外话:

  1. 您可能会认为最终的边框不会很白,因为JPEG的有损性会在输出中产生某种色差。我进行了一些测试,至少在Photoshop中,通过Save For Web的JPEG级别10保存的纯白色图像(即“低”质量)产生的解码图像仍然是纯白色。

    我通过两个测试确定了这一点:

    首先,我将JPEG加载为原始图像之上的一层,将顶层的混合模式设置为“差异”,然后在其上方添加一个“色阶”调整层以尝试放大差异。所得图像保持黑色,表示“无差异”。

    其次,当我看不到预期的差异时,我放下了调整层,并将JPEG层返回到“普通”混合模式,拿起了吸管工具,并在整个图像中查找了一个未显示为RGB的像素(255,255,255 )。我没找到一个。当我在图像上进行擦洗时,我希望看到数字会有些闪烁,但它们保持稳定。

    我只能得出结论,这是编码算法的一种简并的情况:纯白色块通过离散余弦变换保持白色。

    有趣的是,纯黑色块不会发生这种情况。至少通过Photoshop的实现,它们在解码时变成RGB(1,1,1),而不是RGB(0,0,0)。

    底线,在打印使用上述技术生成的图像时,您无需担心此边框区域中的溅射点。

  2. jpegtran是一个命令行程序,但也有一个基于Windows的GUI Windows程序,该代码称为jpegcrop

  3. plugin,此插件仅适用于Windows。


1
我使用了一个名为JPEG向导的程序,它提供了这种功能。它还具有非常好的将不同压缩率应用于JPEG不同部分的能力。因此,一个人的头和手可能使用高质量的设置,其衣服使用中等质量的设置,背景使用较低的质量设置,因此最终得出的文件较小,但与使用所有东西都使用中等质量的情况相比,其总体质量更好。
超级猫

1
我没有机会尝试它,但是这篇博客文章建议jpegtran的crop函数实际上也可以用于扩展。(不过,不确定延长边框的颜色是什么。)
mattdm 2015年

4
@mattdm:是的,jpegtran还可以扩展图像,但是它始终填充硬编码的中间灰度RGB(128,128,128)。之所以这样做,是因为这是唯一简单的选择,因为在DCT系数空间中,您可以通过一个简单的bzero()调用来做到这一点。我尝试了一个野蛮的修改此技巧的方法,该方法不起作用,但应该使您对其中的丑陋感有所了解。举起双手感到沮丧
沃伦·扬

@WarrenYoung:要更改填充块的颜色,您大概只需要更改第一个(DC)系数,而将其他系数保持为零即可。当然,系数是压缩的,所以...无论如何,它应该是可行的,但是我同意它并不像看起来那样琐碎。
Ilmari Karonen 2015年

2
关于您的最后一点-节省大量资金来自丢弃高频信息。放弃精确像素块颜色的精度所获得的收益不会超过一两个字节,因此它从未或几乎从未做到过。如果有任何信息丢失,则在YUV <-> RGB色彩空间转换中。
霍布斯(Hobbs)2015年

20

这里要记住的一点是,将照片保存为有损压缩格式时,质量会下降。只要在添加边框后以无损格式(PSD,TIFF等)保存照片,首先保存为JPEG的数据就不会丢失。


1
谢谢。即使使用“涂漆”程序(例如“画图”)并将其保存到例如TIFF中时,也是如此吗?
LBogaardt 2015年

4
至少根据我的快速测试,在保存TIFF时,Paint使用无损LZW压缩算法,因此看起来还可以。
菲利普·肯德尔

5
请记住,这可能会大大增加图像的大小...
BlueRaja-Danny Pflughoeft 2015年

2
画图还支持PNG,这也是一种无损格式
phuclv

为此+1,因为讨论存储回jpeg的答案与所有​​jpeg编码选项都不兼容。
詹姆斯·斯内尔

6

这不是无损的,但你可以得到相当接近使用GIMP(或其他编辑器类似的功能)和以下两个技巧:

  1. 首先,请确保您添加的边框是8像素宽的倍数(最好是16像素的倍数)。

    这很重要,因为JPEG压缩算法从左上角开始将图像分成8×8像素块 *,并将有损压缩算法分别应用于每个块。因此,至少在原理上,您可以通过在现有像素块周围添加完整的8×8像素块来无损填充JPEG图像。但是,如果您尝试添加的边界不是整个块的宽度,则填充图像中的块将不会与原始块中的块对齐,并且不可避免地会有一些压缩损失。

    *)实际上,大多数JPEG图像使用色度二次采样,这意味着实际上仅将图像的灰度部分压缩为8×8块,而压缩之前,色度通道将缩小50%,从而使其有效块大小为16× 16像素。因此,为了获得最佳效果,您的边框宽度实际上应该是16像素的倍数。但是,通常可以避免使用8(或24或40等)像素边框,因为色度中的一点压缩损失不是很明显。

  2. 技巧的第二部分是在保存最终图像时,选择“将图像导出为JPEG”对话框(在“高级设置”下)中的“使用原始图像的质量设置”复选框。即使看起来会导致质量比通常使用的质量低,也要这样做!

    此设置使GIMP重用与原始图像完全相同的压缩设置,只要您没有对图像进行过分的编辑,特别是在图像中的块,通常可以消除大约99%的压缩损失。新图像仍然与原始图像对齐。(由于四舍五入错误,有时仍然会有一些损失,但是比其他情况要少得多。)


作为快速演示,我从Wikimedia Commons获取此JPEG测试图像,该图像最初以较低的质量设置保存为50,并使用上述方法在其上添加了花哨的(约)8px黑白边框:

具有8px边框的测试图像,大部分无损

这是使用GIMP的“谷物提取”图层模式显示的原始图片(15.1 kB)和编辑后的图片(16.7 kB)之间的差异:

填充图像和原始图像之间的区别

您会看到一些非常轻微的色度错误,这是由于边框宽度不是16的倍数引起的,并且(如果您仔细观察的话)有几个块由于舍入而导致亮度通道中的损失也很小。即使从视觉上看,原始图像和填充图像也几乎无法区分,即使放大2倍并在它们之间交替切换。

特别是,突沸的JPEG质量的结果对比这个向上保存填充的图像,这将产生下面的17.6 kb的图像之前,从50至60:

具有8px边框的测试图像,质量从50提高到60

在高放大倍率下,您可以肯定地看到编辑后的图像在某些地方比原始图像明显模糊,并且与谷物提取物进行对比可以确认这一点:

填充图像(在q60时)和原始图像之间的区别


“选择此复选框似乎不会影响“渐进式”设置。” 不是错误,因为渐进编码是编码设置,而不是质量设置。Jpegtran可以无损地在图像之间进行图像转换。
Damian Yerrick

@tepples:你是对的;我删除了该段。出于某种原因,我的印象是切换渐进模式会导致质量设置不匹配,但是快速测试似乎证实了我对此有误。
Ilmari Karonen 2015年

1
@thomasrutter:我无法对评论进行投票,因此,我只将您指向描述该功能的原始论坛帖子,尤其要这样引用:“ 如果您仅对图像进行了一些更改,则重新使用相同的量化表将为您提供几乎与原始图像相同的质量和文件大小。与使用不同的量化表相比,这将最大程度地减少量化步骤所造成的损失。
Ilmari Karonen

1
只是为了比较,下面是另一个示例另一个问题的答案。我在理论上的理解与Ilmari一致,但至少在我的例子中,这种做法似乎更多地与Thomas所说的相符-至少在以高度退化的形象开始时。(我认为墓碑为此目的提供了一个不好的例子,因为石材细节的损失不如人类皮肤明显。)
mattdm

1
@mattdm:似乎完全依赖于软件;我尝试从GIMP中的答案中再现您的结果,看来GIMP(至少v2.8.10)在保存JPEG质量方面比ImageMagick(无论您测试的是哪个版本)要好得多。您在q75处保存一次的第一张图像的PSNR为34.0298,而在q75处保存两次的图像只有32.8169的一张(重新保存8次的图像的PSNR为32.6459)。相比之下,在q75在GIMP中保存一次相同的源图像,则PSNR为36.4560;以相同的质量打开并重新保存它,仅将其降低到36.3295。
Ilmari Karonen

3

抱歉,这不是您想要的,但是...

听起来好像您添加了白色边框以帮助打印时定位图像。为什么不专注于正确地学习打印界面并避免像这样的狡猾的骇客呢?这带来的另一个问题是您允许打印程序调整4680x3120图像的大小以适合正确的DPI /分辨率。这可能比重新保存jpeg更为严重。


两种有效的观点,谢谢。但是,我将照片上传到了这些在线印刷店之一,因此我无法控制实际的打印机。
LBogaardt

1

先前的答案非常好。

我将添加jpg格式的一些“心理方面”。

如果jpg准备充分,它只会丢失大约0.5%的信息。在大多数情况下,这是人眼看不到的东西。您需要一个程序进行一些分析并查看差异(例如Ilmari所做的分析)。

“高质量”是一个过程,不仅仅是文件格式保存图像的方法。是的,您再次使用jpg重新压缩了该文件,因为您确实需要它。如果处于受控状态,则可以这样做。

确实需要它意味着您不能使用其他无损格式,您对存储或软件的需求非常具体,或者工作流程非常紧张。

如果您真的担心质量,可能就不会使用Paint。JPG格式具有一些您根本无法在Paint中控制的配置。

这是我的免费程序列表,您可以在其中真正控制jpg压缩以及需要选择的选项。(所有这些都在jpg保存对话框中)

Irfanview-打开“禁用色度颜色二次采样”。

FastStone图像查看器-颜色二次采样:无。

Gimp-子采样4:4:4

结论。不要使用画图。

我还没有检查的一件事。如果所有这些程序都保持嵌入的颜色配置文件。稍后再编辑我的帖子。


有人对此回答投了-1票。通常我不在乎,因为我知道我可以说些蠢话。在这种情况下,答案的哪一部分是错误的?
拉斐尔

我没有投票(向上或向下),但是您可能希望对拼写和语法进行练习,以给人更好的第一印象(老实说,也是为了使您的答案更易于阅读)。同样,这个问题已经有了几个答案(尤其是我的答案很长)。在某些时候,有些人可能会开始downvoting(或至少不upvoting)答案不明确添加一些新的,以现有的。另外,请尝试构造您的答案,以使重要的部分一目了然;在这种情况下,您用粗体突出显示的唯一部分是不重要的脚注。
Ilmari Karonen

谢谢您的评论Ilmari。我很难用英语思考,因为这不是我的母语。我将寻找拼写工具。我不确定是否有语法。-对于评论的第二部分,我了解StackExchange背后的逻辑是独立回答问题,因为答案的流是不固定的,因为它们可以更改顺序或被编辑。我会看一下。(我删除了粗体)再次感谢。:o)
拉斐尔2015年

1
“它只会丢失大约0.5%的信息” [需要引用] :)
沃伦·杨

嘿沃伦,在这里是:otake.com.mx/Apuntes/PruebasDeCompresion2/…它是西班牙语,请暂时使用google翻译,我需要对其进行更新。实际上,它小于0.392%:)
拉斐尔

0

IrfanView对我来说适合图像集。以下是一些使用注意事项

这是我用于边框插入的存储过程-添加边框的Infran过程

  1. 右键单击图像,“打开方式”->“ InfranView”
  2. 按“ b”
  3. 选中左上角的“使用高级选项”,然后按“高级”
  4. 选中“画布大小”,然后按“设置”
  5. 输入每个边框的宽度(左侧,右侧,顶部,底部)
  6. 按“确定”
  7. 选择“覆盖现有文件”
  8. 按“确定”
  9. 输入输出目录“结果文件的输出目录:”
  10. 导航到并双击图像以在上列表中添加边框。这会将其添加到底部列表中的“输入文件:”中
  11. 按“开始批量”

1
您能否解释一下这些方法的特殊之处,以使其符合张贴者不降低图像质量的要求?初读时,这似乎是在海报尝试避免的整个解压缩-重新压缩周期中发送JPEG。
菲利普·肯德尔

嗯,通过我在此处列出的过程,您对图像生命周期提出了一个有趣的观点,我对此并不认为。您可能是对的,如果您希望我删除或修改我的帖子,请告诉我:)!
J-Dizzle '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.