【问题标题】:Having an image stripped of metadata upon upload in PHP在 PHP 中上传图像时删除元数据
【发布时间】:2009-03-24 11:14:53
【问题描述】:

我知道的某个网站最近将他们的带宽从每月 2.5 TB 升级到了 3.5 TB。

原因是他们最近超过了 2,5 限制。他们抱怨他们不知道如何降低带宽使用率。

我没有看到他们考虑的一件事是 JPEG 和网站上显示的其他图像(而且它是一个图像密集的网站)可以包含元数据。照片是在哪里拍的等等。

事实上,此信息在该网站上并不重要。它永远不会被使用。然而,它仍在增加带宽,因为它将每个图像的文件大小从几个字节增加到几千字节。

在每月使用超过 2.5 TB 的网站上,剥离其元数据的数千张图像将有助于将带宽使用量每月减少至少几 GB,如果不是更多的话。

那么有没有办法在 PHP 中做到这一点?而且,对于已经存在的文件,有没有人知道好的自动元数据删除器?我知道JPEG & PNG Stripper,但这不是很好...不过可能对初始清洁有用...

【问题讨论】:

    标签: php file-upload metadata vbulletin


    【解决方案1】:

    GD 很简单:

    $img = imagecreatefromjpeg("myimg.jpg");
    imagejpeg($img, "newimg.jpg", $quality);
    imagedestroy($img);
    

    这不会传输 EXIF 数据。虽然不知道它实际上会节省多少带宽,但您可以使用上面的代码来增加图像的压缩率。这将节省大量带宽,尽管它可能不会很受欢迎。

    【讨论】:

    • 我在一个摄影论坛上看到了这种方法,它“不太受欢迎”,一些用户抱怨图像明显不同(因为它们已经以一致的质量水平重新编码)
    【解决方案2】:

    我严重怀疑图像元数据是万恶之源。

    需要考虑的一些问题:

    • 网络服务器是如何配置的?
    • 它是否正确发出 http 304 响应?
    • 是不是有某种通过 php 脚本手工制作的数据缓存/流式传输来防止所述数据被浏览器缓存? (在这种情况下,应该考虑 url 重写和 http 重定向)。

    【讨论】:

    • 确实不会是这个问题的根源。然而,通过消除这个问题,该网站可以在处理严重问题的同时获得一些喘息空间。当您需要从狭窄区域中挤出一些东西时,您要做的第一件事就是从侧面切屑。
    • 适当的缓存可能比这里和那里的一些元数据提供更多帮助......
    • @WebDevHobo:适合自己,但要注意不必要的代码膨胀;)
    • 你说的代码臃肿......我不认为它会采取这样的比例。同样,这不是我的网站,所以他们是否实施任何东西都是他们关心的问题。
    • 好吧,他们的用户可以上传图片吗?在几个地方?他们是否使用出于维护原因而没有兴趣入侵的预制软件包?您最终会拥有一个删除元数据的 cron 吗?这不仅仅是表面上看到的......但就像你说的,他们的电话;)
    【解决方案3】:

    查看 Smush.it! 它将从图像中删除所有非必要信息。他们有一个 API,您可以使用它来处理图像。

    注意: 设计,它可能会更改您的文件类型。这是故意的。如果另一种文件类型可以以相同的质量显示相同的图像,并且字节数更少,它将为您提供一个新文件。

    【讨论】:

    • 他们不再有公共 API。他们的网站说它正在开发中。
    • 嗯,这对 API 来说太糟糕了。猜猜可能是时候开发一个在本地执行此操作的工具了……我不认为这对 GD 来说太难了,只要确保在更改元数据值时不要“破坏”任何 JPEG 压缩。
    【解决方案4】:

    我认为您需要对此进行分析。节省几 GB 可能是对的,但在 2.5TB 的带宽上相对较少。您需要有关服务最多的真实数据并为此努力。如果您确实发现是图像使您的带宽使用率如此之高,您首先应该检查您的缓存标头和 304 响应,您可能还需要调查使用类似 amazon S3 的东西来提供图像。通过这样做,我已经设法大大降低了带宽成本。

    也就是说,如果 EXIF 数据真的有那么大的不同,那么您可以使用 GD 库使用 imagejpeg 函数复制 jpeg 图像。这不会复制 EXIF 数据。

    【讨论】:

      【解决方案5】:

      Emil H 可能最能解决这个问题。

      但我想补充一点,这几乎肯定不会像您想象的那样为您节省很多。这种类型的元数据占用的空间很小;我会认为

      1. 将图像重新压缩为更小的文件大小,并且
      2. 裁剪或调整大小以降低图像的分辨率

      两者都会产生更大的影响。仅使用第一点,您可能会降低 50% 的带宽,同时使用这两种方法,您可能会降低 80% 的带宽 - 也就是说,如果您愿意牺牲一些图像大小。

      如果没有,您始终可以使用较小尺寸的默认视图,并带有“放大”链接。大多数人只是浏览会看到较小的图像,只有那些想要最大尺寸的人才会点击放大它,因此您仍然可以获得几乎所有的带宽节省。例如,这就是 Flickr 所做的。

      【讨论】:

      • 举个简单的例子,我曾经让我在这里排队的这个程序负责一个 1.7 GB 的存储空间,只包含图像。这个程序只会处理 JPG 和 PNG 文件,我仍然损失了 320 MB 而不损失任何图像质量。
      • 我猜如果它们都是相当小的图像,那么元数据会占用更大比例的空间,你会节省更多。我想我假设的是全分辨率照片:)
      • 哎呀,这些图片大多是漫画画,很少超过 1024x768
      【解决方案6】:

      也许某种十六进制数据操作在这里会有所帮助。我面临同样的问题,正在研究某种自动化解决方案。

      只是想知道这是否可以做到,如果可能的话,我会为此编写一个 php 类。

      【讨论】:

      • 哥们,不要,去看看 www.smush.it
      【解决方案7】:

      在客户端进行所有图像处理可能很聪明(使用诸如 facebook 之类的 java 小程序),然后当图像被压缩、调整大小并完全去除不必要的像素和内容时,它可以上传到它的位置最佳尺寸,节省带宽和服务器端性能! (以初始开发为代价)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-21
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多