Answers:
尽管Philip的答案是最好的方法,但可以完全在JPEG范围内做您想做的事情。
JPEG的工作原理是将图像分成称为最小编码单位(MCU)的块,每个块通常为16×16,然后分别进行压缩。当您将压缩级别提高到很高时,您可以在图像中看到这一点。在更合理的压缩级别下,这些块非常平滑地融合在一起,以至于您永远看不到边界。
我们可以利用这一事实为图像无损添加简单的白色边框。我们只需要创建一个与输出图像大小相等的空心白色块阵列,然后将原始JPEG MCU块放入中间即可。¹
该技术有一个缺点:它仅在输入和输出图像大小均为MCU大小的偶数倍时才起作用。如果不是这种情况,我们需要在白色边框和原始图像边缘之间的空白处重新压缩一些块。你不会看到在输出这种差异如果从过高的JPEG压缩级别望而却步,所以它仍然是有效的无损。
我不知道有任何程序可以做到这一点。我所知道的最接近的东西是进行逆运算的东西:jpegtran具有裁剪功能,可以无损地切掉部分图像边缘。²它是通过丢弃沿图像边缘的裁剪掉的MCU,将其保留在图像中来实现的。中间没动过。
我知道的最简单的现成解决方案是用于Photoshop 的Better JPEG Lossless Resave插件。它使用基于上述思想的技术尽可能地从原始图像复制MCU,以避免像Photoshop一样从未压缩版本重新创建它们。³
题外话:
您可能会认为最终的边框不会很白,因为JPEG的有损性会在输出中产生某种色差。我进行了一些测试,至少在Photoshop中,通过Save For Web的JPEG级别10保存的纯白色图像(即“低”质量)产生的解码图像仍然是纯白色。
我通过两个测试确定了这一点:
首先,我将JPEG加载为原始图像之上的一层,将顶层的混合模式设置为“差异”,然后在其上方添加一个“色阶”调整层以尝试放大差异。所得图像保持黑色,表示“无差异”。
其次,当我看不到预期的差异时,我放下了调整层,并将JPEG层返回到“普通”混合模式,拿起了吸管工具,并在整个图像中查找了一个未显示为RGB的像素(255,255,255 )。我没找到一个。当我在图像上进行擦洗时,我希望看到数字会有些闪烁,但它们保持稳定。
我只能得出结论,这是编码算法的一种简并的情况:纯白色块通过离散余弦变换保持白色。
有趣的是,纯黑色块不会发生这种情况。至少通过Photoshop的实现,它们在解码时变成RGB(1,1,1),而不是RGB(0,0,0)。
底线,在打印使用上述技术生成的图像时,您无需担心此边框区域中的溅射点。
jpegtran
是一个命令行程序,但也有一个基于Windows的GUI Windows程序,该代码称为jpegcrop
。
plugin,此插件仅适用于Windows。
jpegtran
的crop函数实际上也可以用于扩展。(不过,不确定延长边框的颜色是什么。)
jpegtran
还可以扩展图像,但是它始终填充硬编码的中间灰度RGB(128,128,128)。之所以这样做,是因为这是唯一简单的选择,因为在DCT系数空间中,您可以通过一个简单的bzero()
调用来做到这一点。我尝试了一个野蛮的修改此技巧的方法,该方法不起作用,但应该使您对其中的丑陋感有所了解。举起双手感到沮丧
这里要记住的一点是,将照片保存为有损压缩格式时,质量会下降。只要在添加边框后以无损格式(PSD,TIFF等)保存照片,首先保存为JPEG的数据就不会丢失。
这不是很无损的,但你可以得到相当接近使用GIMP(或其他编辑器类似的功能)和以下两个技巧:
首先,请确保您添加的边框是8像素宽的倍数(最好是16像素的倍数)。
这很重要,因为JPEG压缩算法从左上角开始将图像分成8×8像素块 *,并将有损压缩算法分别应用于每个块。因此,至少在原理上,您可以通过在现有像素块周围添加完整的8×8像素块来无损填充JPEG图像。但是,如果您尝试添加的边界不是整个块的宽度,则填充图像中的块将不会与原始块中的块对齐,并且不可避免地会有一些压缩损失。
*)实际上,大多数JPEG图像使用色度二次采样,这意味着实际上仅将图像的灰度部分压缩为8×8块,而压缩之前,色度通道将缩小50%,从而使其有效块大小为16× 16像素。因此,为了获得最佳效果,您的边框宽度实际上应该是16像素的倍数。但是,通常可以避免使用8(或24或40等)像素边框,因为色度中的一点压缩损失不是很明显。
技巧的第二部分是在保存最终图像时,选择“将图像导出为JPEG”对话框(在“高级设置”下)中的“使用原始图像的质量设置”复选框。即使看起来会导致质量比通常使用的质量低,也要这样做!
此设置使GIMP重用与原始图像完全相同的压缩设置,只要您没有对图像进行过分的编辑,特别是在图像中的块,通常可以消除大约99%的压缩损失。新图像仍然与原始图像对齐。(由于四舍五入错误,有时仍然会有一些损失,但是比其他情况要少得多。)
作为快速演示,我从Wikimedia Commons获取了此JPEG测试图像,该图像最初以较低的质量设置保存为50,并使用上述方法在其上添加了花哨的(约)8px黑白边框:
这是使用GIMP的“谷物提取”图层模式显示的原始图片(15.1 kB)和编辑后的图片(16.7 kB)之间的差异:
您会看到一些非常轻微的色度错误,这是由于边框宽度不是16的倍数引起的,并且(如果您仔细观察的话)有几个块由于舍入而导致亮度通道中的损失也很小。即使从视觉上看,原始图像和填充图像也几乎无法区分,即使放大2倍并在它们之间交替切换。
特别是,突沸的JPEG质量的结果对比这个向上保存填充的图像,这将产生下面的17.6 kb的图像之前,从50至60:
在高放大倍率下,您可以肯定地看到编辑后的图像在某些地方比原始图像明显模糊,并且与谷物提取物进行对比可以确认这一点:
先前的答案非常好。
我将添加jpg格式的一些“心理方面”。
如果jpg准备充分,它只会丢失大约0.5%的信息。在大多数情况下,这是人眼看不到的东西。您需要一个程序进行一些分析并查看差异(例如Ilmari所做的分析)。
“高质量”是一个过程,不仅仅是文件格式保存图像的方法。是的,您再次使用jpg重新压缩了该文件,因为您确实需要它。如果处于受控状态,则可以这样做。
您确实需要它意味着您不能使用其他无损格式,您对存储或软件的需求非常具体,或者工作流程非常紧张。
如果您真的担心质量,可能就不会使用Paint。JPG格式具有一些您根本无法在Paint中控制的配置。
这是我的免费程序列表,您可以在其中真正控制jpg压缩以及需要选择的选项。(所有这些都在jpg保存对话框中)
Irfanview-打开“禁用色度颜色二次采样”。
FastStone图像查看器-颜色二次采样:无。
Gimp-子采样4:4:4
结论。不要使用画图。
我还没有检查的一件事。如果所有这些程序都保持嵌入的颜色配置文件。稍后再编辑我的帖子。
IrfanView对我来说适合图像集。以下是一些使用注意事项
这是我用于边框插入的存储过程-添加边框的Infran过程