我想在上传图像时调整图像大小以节省存储空间.我试过这样的
$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);
Run Code Online (Sandbox Code Playgroud)
但结果是后端有白色屏幕.
是否可以在上传时调整图像大小?我究竟做错了什么?
先感谢您
在您阅读答案之前,请重新考虑此问题.你有理由想要在上传时调整大小吗?
我实际上希望我的网站存储完整的图像,并显示图像的调整大小的副本.
这样,如果您以后决定以更大的尺寸显示图像,您只需更改调整大小代码,它仍然会看起来很好.如果您在上传时调整大小,则您的图片已经很小,如果您现在更改网站以显示更大的图片,则必须重新上传所有图片.
$ visual是一个UploadField,它没有调整大小的功能.并且没有调用任何方法resizeByHeight,因此whitescreen可能是因为您调用的方法不存在,并且您的错误报告已关闭.
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;
}
}
Run Code Online (Sandbox Code Playgroud)