无损裁剪并粘贴JPEG图像

13

我正在寻找无损JPEG操作的示例/博客文章等(剪裁n粘贴=剪切和粘贴)。我知道有一个程序jpegtran(http://jpegclub.org/jpegtran)可以执行无损裁剪(在某些情况下),但好像缺乏良好的文档。是的,我已经尝试了谷歌。

jpegtran还有一个实验分支,允许在某些情况下进行无损放置(=粘贴),但是其文档似乎甚至更糟。

drop开关的实验性质是什么?它是否存在已知问题?人们使用它吗?

drop似乎是一个非常酷且有用的功能,我觉得它已经实验了10年以上,这很奇怪...

是的,可以使用无损格式(如PNG)进行此类操作,但我特别感兴趣的是JPEG。

谢谢!


还有其他无损裁剪和复制JPEG的替代方案吗? - tdp2110
通常剪切或复制操作涉及将文件以标准格式读入内存,从那时起自动使其无损。无损裁剪涉及将裁剪后的图像写回到JPEG文件中。它对图像的大小和裁剪的边界有限制。 - Mark Ransom
2个回答

19

我花了太多时间来尝试理解这个问题,因此希望这能帮助其他人。当在谷歌上搜索所谓的“crop 'n drop”功能的文档时,这个问题排名很高。

概述:

jpegtran -drop可以让你将一个JPEG图像的块"drop"到另一个JPEG图像上。

它只会替换现有的块,不会扩展输入,所以您不能仅使用-drop来连接两个JPEG图像。

但是,如果您提供的-crop参数大于输入图像,则JPEGTran将编写空(灰色)块以扩展至所需大小。您可以使用-drop来替换这些新的、空白的块为所需的图像。

以下是我邋遢的ASCII艺术示例:

  1. 您有两个图像:A.jpgB.jpg,它们的尺寸都是256x256。我们想要将它们并排连接起来产生一个512x256的图像。

+---------+  +---------+
|         |  |         |
|  A.jpg  |  |  B.jpg  |
|         |  |         |
+---------+  +---------+
  • A.jpg的尺寸“取消裁剪”到所需大小。 -crop参数是标准的X11几何符号表示法:WIDTHxHEIGHT + X + Y,其中正值的X/Y从左上角开始测量,而负值从右下角开始测量。

  • jpegtran -crop 512x256+0+0 -outfile O.jpg A.jpg
    
    +---------+---------+
    |         \         |
    |  O.jpg  \ (blank) |
    |         \         |
    +---------+---------+
    
  • 现在将B.jpg“拖放”到O.jpg中的新空白区域中。 -drop参数仅使用原点X/Y坐标。

  • jpegtran -drop +256+0 B.jpg -outfile O.jpg O.jpg
    
    +---------+---------+    +---------+
    |         \         |    |         |
    |  O.jpg  \    o<========|  B.jpg  |
    |         \         |    |         |
    +---------+---------+    +---------+
    
  • 完成了!现在你有一个尺寸为512x256的单个文件O.jpg,其中包含A.jpgB.jpg的内容拼接在一起。

  • +-------------------+
    |                   |
    |       O.jpg       |
    |                   |
    +-------------------+
    

    注:

    • A.jpgB.jpg 必须具有相等的高度。 如果 B.jpg 更高,它将被裁剪。 如果 A.jpg 更高,则图像的右侧将有一个空白的填充条.
    • A.jpg 的宽度必须以完整块结束。(通常意味着可被8整除?)
    • B.jpg 可以具有任何宽度,并且不必是块大小的倍数。

    我认为使用色度子采样的JPEG文件需要被16整除而不是8,尽管我可能对此有所错误。并且两个文件都需要具有相同的子采样选项,否则它们将无法正确合并。 - Mark Ransom
    注意:mozjpeg 提供了 jpegtran,据说支持 -drop 标志,因为它没有显示任何错误,并且 man 页面解释了如何使用它,但实际上它并没有做任何事情,你需要找到另一个版本。 - TheHardew

    0

    jpegtran的使用手册以及两个Windows应用程序(JpegCropJpegJoin)都相当不错。如果您有特定的操作步骤,请更新您的问题以进行解释。

    就我个人而言,在公司主页上使用-drop对JPEG进行无损精灵图处理:
    http://bestelec.co.uk/images/front/features.jpg

    1. 首先,我将原始照片裁剪到所需的框架大小(在像素边界上)。这一步可以使用非JPEG格式无损保存。【美术指导】
    2. 接下来,我将这些图像缩小到网页设计所需的必要宽度。同样,这些是中间步骤,可以无损保存。
    3. 然后,我使用各种质量选项运行它们通过cjpeg,直到找到我感到舒适的最低质量设置。
    4. (可选)接下来,我裁剪了每个降低质量的单个图像的底部边缘,以与垂直轴上的倒数第二个MCU边界对齐。这使我能够在垂直条中连接照片而没有间隙。我的网页设计不需要特定的高度,因此我可以在这里自由选择一个。如果您的组件图像范围未对齐于MCU边界(如我的右侧边缘未对齐),请确保您正在使用jpegtran / JpegJoin的2012年10月版本,否则只有第一张图像会显示未裁剪。
    5. 最后,我将图像合并为一个jpeg,并通过jpegtran -optimise -progressive -copy none使其尽可能小且渐进。

    最后的结果是我将三个HTTP请求减少为一个,使得同一主机上的后续资源可以更早地被请求并提高加载时间。对我来说,这比将图像转换为WebP格式并单独服务它们更有意义,尤其是考虑到我们大部分企业访客都在使用IE浏览器。


    为什么要使用精灵图(sprite)来加载 JPEG 图像?JPEG 图像应该是内容,而不是背景。https://groups.google.com/forum/#!topic/compass-users/NCfZE2mkWJI - tirenweb
    @tirengarfio 这些 JPEG 图片基本上只是装饰,而不是内容。 - Nicholas Shanks
    @Unsigned 这不是一个downvote这个答案的好理由。原问题的提问者似乎知道如何使用drop选项,我并不是在为它编写文档,无论你有多想找到它。 - Nicholas Shanks
    @Unsigned,你能在评论区发布一个问题和链接吗?我会尝试为你解答。我不知道你具体想要什么。你是无法使用“-drop”参数,还是已经有所进展但仍然存在问题? - Nicholas Shanks

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接