我希望在上传图像时调整图像大小以节省存储空间。我试过这样的
$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);
但结果是后端有白色屏幕。
是否可以在上传时调整图片大小?我做错了什么?
提前谢谢
答案 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;
}
}