【问题标题】:Silverstripe 3.1 - resize image on uploadSilverstripe 3.1 - 上传时调整图片大小
【发布时间】:2013-12-20 23:46:07
【问题描述】:

我想在上传图片时调整图片大小以节省存储空间。我是这样试的

            $visual = new UploadField('Visual', _t('Dict.PREVIEW_IMAGE', 'Preview Image'));
        $visual->setAllowedExtensions(array('jpg', 'jpeg', 'png', 'gif'));
        $visual->setFolderName('news/' .  $this->ID);
        $visual->resizeByHeight(10);

但结果是后端出现白屏。

是否可以在上传时调整图像大小?我做错了什么?

提前谢谢你

【问题讨论】:

标签: silverstripe


【解决方案1】:

在阅读答案之前,请重新考虑这个问题。您是否有理由希望在上传时调整大小?
我实际上希望我的网站存储完整的图像,并显示调整大小的图像副本。
这样,如果您以后决定以更大的尺寸显示图像,您只需更改调整大小的代码,它仍然看起来不错。如果您在上传时调整大小,则您的图片已经很小,如果您现在更改网站以显示更大的图片,则必须重新上传所有图片。


$visual 是一个 UploadField,它没有调整大小的功能。 并且没有调用resizeByHeight的方法,所以白屏可能是因为你调用了一个不存在的方法,你的报错被关闭了。

resize 方法在 Image 类上,但它们总是制作文件的副本,因此它们不会调整图像本身的大小,而是将调整后的图像副本保存在 _resampled 文件夹中。

目前没有内置功能来实际调整原始图像的大小。 但是,通过子类化 UploadField 并覆盖方法 upload 或它用来保存文件的方法之一,实现起来应该相当简单。

我刚刚构建的一个工作示例:

class MyUploadField extends UploadField {
    protected function saveTemporaryFile($tmpFile, &$error = null) {
        $file = parent::saveTemporaryFile($tmpFile, $error);
        if ($file && is_a($file, 'Image')) {
            // only attempt to resize if it's an image
            $filePath = Director::baseFolder() . "/" . $file->Filename;
            // create a backend (either GDBackend or ImagickBackend depending on your settings)
            $backend = Injector::inst()->createWithArgs(Image::get_backend(), array($filePath));
            if ($backend->hasImageResource() && $backend->getHeight() > 100) {
                // if it is a working image and is higher than 100px, resize it to 100px height
                $newBackend = $backend->resizeByHeight(100);
                if ($newBackend) {
                    // resize successful, overwrite the existing file
                    $newBackend->writeTo($filePath);
                }
            }
        }
        return $file;
    }
}

【讨论】:

  • 嗨,Zauberfisch。非常感谢。我复制了您的代码并尝试了它,但图像未调整大小。我需要在生成上传字段的页面上更改某些内容吗?是的,如果有理由的话。我不希望网站所有者上传和保存 16mp 图像,因为数据量不仅仅是巨大的。所以我想将图像调整为 1280px 或类似的 smthg。
  • 您是否在页面上使用了new MyUploadField() 而不是new UploadField()?
  • 还请注意,您可能会遇到大文件的内存问题。如果您上传具有大量像素的文件,它将消耗大量内存,我经常在服务器上遇到运行时内存问题而不是存储问题。
  • 愚蠢的错误:/ 现在它适用于所有图像,即使它们更小。我试过这样但它不起作用` if ($backend->Width() > 1440) { $newBackend = $backend->resizeByWidth(1440); }`你能帮忙吗?嗯,这是我没有想到的一点。
  • 关于内存使用,是的,这是个大问题。每个像素都加载到内存中,因此图像的像素越多,您需要的内存就越多,而如今使用那些花哨的高清摄像头,这很安静。最糟糕的是,如果内存不足,php 就会死掉。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 2014-08-26
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
相关资源
最近更新 更多