【问题标题】:image saving, resizing图像保存,调整大小
【发布时间】:2011-09-24 06:45:31
【问题描述】:

我有一个基本问题。我有一个项目需要更多尺寸的一张图片。

是的...在上传过程中您制作缩略图...等等...我知道这个故事...性能与存储的可能性。 所以我保存原始img,制作2个缩略图副本,例如最大宽度100px和maxwidht 200px相对于比率。 现在我需要以 150px 最大宽度显示图像,所以我保存了 img(200px) 和.....

我使用 getimagesize() 来计算相对于比率的显示宽度和高度, 或者我设置 max-widht 和 max-height 并将其留给浏览器(浏览器为我制作), 或者我将宽度设置为保持高度:自动(但我也想限制最大高度)

所以实际上我使用 php 和 getimagesize() 但是这个函数每次都使用文件,我有点害怕。当您处理 1 个 img 时没关系,但是 20 或 100 个呢?

还有...另一个想法,在上传时我还保存到数据库中的大小信息,为此我必须保存 3 个 img 的数据(现在只有原始一个),这会使一切变得复杂。

那么……有什么想法吗?你的做法是什么?谢了。

【问题讨论】:

    标签: php html css performance


    【解决方案1】:

    最多两张图像:缩略图和原始图像就足够了。确保您的上传页面安全可靠,因为我看到一个网站通过 DoS 被删除(滥用未受保护的图像大小调整页面)。同时限制最大上传大小,以防止滥用。

    您可以使用max-widthmax-height CSS 属性来限制图片的大小。

    【讨论】:

    • 当您最终拥有 1mb + 仅使用 CSS 调整大小的图像时,这不是很好;导致用户无缘无故下载大图像。至少应该实现某种形式的动态调整大小和缓存,除非您对上传的内容有很大的控制权。
    • 是的,再次......我们正在讨论存储更多尺寸的图像或调整大小......我真正的问题是如何处理存储的图像......最大宽度和最大高度看起来不错但是为什么像facebook这样的大网页哪里有这么多照片不使用这种方法?它们直接带有高度和宽度。我的问题是 getimagesize() 太糟糕了,或者他们使用了其他东西......他们如何获得图像的宽度和高度?他们将这些信息存储在数据库中或使用一些软件....
    • 150x150px 的缩略图足够小,可以调整为更小的缩略图。例如,可以链接未调整大小的图片。 @RobertMulinsky getimagesize() 还不错。我只是指出你不应该实现<?php getimagesize($_GET["file"]); ?>,例如。
    【解决方案2】:

    我的方法

    前段时间我用php写了一个非常简单的画廊应用程序,它是这样工作的:

    图像存储在一个文件夹中,其中包含代表专辑(和子专辑)的子文件夹。它们是通过 FTP 上传的,网络服务器只有读取权限。

    每张图片都有三个版本:

    • 一个完整的(原版)
    • 一个“中间”(最大 1024x768px)
    • 一个“拇指”(最大 250x250 像素)

    浏览器对图像的所有请求都由 php 处理,并且不存在的版本是动态生成的。实际数据通过 X-Sendfile 提供,但这是一个实现细节。

    我将较小的版本存储在单独的目录中。当给定原始图像的路径时,查找相应的缩小文件(并检查存在和修改时间)很简单。

    对您的问题的看法

    使用 HTML/CSS 缩放图像被认为是不好的做法,原因有两个:如果您要放大,图像就会模糊。如果您正在缩小,您会浪费带宽并使您的页面无缘无故变慢。所以不要这样做。

    应该可以确定每个文件的一小部分所需版本(例如,在我的例子中,布局中使用的版本)。根据您项目的规模和要求,有几种创建这些版本的可能性:

    • 即时:在请求时生成/更新它们
    • 上传期间:让上传过程中调用的例程完成工作
    • 在后台:让上传例程将作业添加到在后台处理的队列(可能最具可扩展性,但实施和部署也相当复杂)

    缩小大图像是一项相当缓慢的操作(通常需要几秒钟)。您可能想以某种方式限制它以防止滥用/DoS。还限制尺寸和文件大小。 100 MP(或更大)的纯白色(或任何颜色)JPG 在压缩时可能非常小,但在缩放期间会使用大量 RAM。大型 PNG 也需要很长时间才能解压缩(甚至更长时间才能压缩)。

    对于小型网站,您选择哪种方法并不重要。可行的东西(即使它不能扩展)会起作用。如果您打算获得大量流量和稳定的上传流,那么请明智地选择并仔细进行基准测试。

    【讨论】:

    • 您可以使用file_existsfilemtime。如果原始文件较新,则将修改时间与原始文件进行比较并重新生成缩略图。
    猜你喜欢
    • 2011-10-24
    • 2010-10-12
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2013-07-26
    相关资源
    最近更新 更多