Silverstripe 3.1 - 上传时调整图像大小

时间:2013-12-20 23:46:08

标签: silverstripe

我希望在上传图像时调整图像大小以节省存储空间。我试过这样的

            $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);

但结果是后端有白色屏幕。

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

提前谢谢

1 个答案:

答案 0 :(得分:5)

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


$ visual是一个UploadField,它没有调整大小的功能。 并且没有名为resizeByHeight的方法,因此whitescreen可能是因为您调用的方法不存在,并且您的错误报告已关闭。

调整大小方法在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;
    }
}