图像尺寸调整 zf2

6
我需要在Zend Framework 2中实现图像调整功能(最好使用gd2库扩展)。我无法找到任何相应的组件/助手。您有相关参考资料吗?
如果我想要创建一个,应该在哪里添加?在旧的Zend框架中,有一个Action Helper的概念,那么在Zend Framework 2中呢?
请给出最佳解决方案建议。
5个回答

17

我目前使用ImagineZend Framework 2来处理这个。

  1. 安装 Imagine:php composer.phar require imagine/Imagine:0.3.*
  2. Imagine 服务创建一个服务工厂(在 YourModule::getServiceConfig 中):

  3. return array(
        'invokables' => array(
            // defining it as invokable here, any factory will do too
            'my_image_service' => 'Imagine\Gd\Imagine',
        ),
    );
    
  4. 将其用于你的逻辑中(这里提供一个使用控制器的小例子):

  5. public function imageAction()
    {
        $file    = $this->params('file'); // @todo: apply STRICT validation!
        $width   = $this->params('width', 30); // @todo: apply validation!
        $height  = $this->params('height', 30); // @todo: apply validation!
        $imagine = $this->getServiceLocator()->get('my_image_service');
        $image   = $imagine->open($file);
    
        $transformation = new \Imagine\Filter\Transformation();
    
        $transformation->thumbnail(new \Imagine\Image\Box($width, $height));
        $transformation->apply($image);
    
        $response = $this->getResponse();
        $response->setContent($image->get('png'));
        $response
            ->getHeaders()
            ->addHeaderLine('Content-Transfer-Encoding', 'binary')
            ->addHeaderLine('Content-Type', 'image/png')
            ->addHeaderLine('Content-Length', mb_strlen($imageContent));
    
        return $response;
    }
    

显然,这是一种“快速而简单”的方法,因为您应该执行以下操作(可选但对于可重用性很有好处):

  1. 可能在服务中处理图像转换
  2. 从服务检索图像
  3. 使用输入过滤器验证文件和参数
  4. 缓存输出(请参见http://zend-framework-community.634137.n4.nabble.com/How-to-handle-404-with-action-controller-td4659101.html eventually)

相关:Zend Framework - 使用控制器返回图像/文件


将图像服务注入控制器是否比在其中使用服务定位器更好(更容易注入模拟进行测试等)? - Hikaru-Shindo
确实。这肯定是它的快速而简单的版本。我坚定地支持强大的IOC(请参见http://ocramius.github.com/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/) - Ocramius
@Ocramius 非常有用的回答。谢谢,我会考虑实现它。 - Prashant

2
对于那些像我一样无法正确集成Imagine的人,我找到了另一个解决方案WebinoImageThumb,对我来说完美地解决了问题。如果您不想阅读完整的文档,请看以下简要说明:
运行:php composer.phar require webino/webino-image-thumb:dev-develop并将WebinoImageThumb添加为config/application.config.php中的活动模块,后者看起来类似于:
<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application',
        'WebinoImageThumb'
    ),

现在,在您的控制器操作中,可以通过服务定位器使用以下内容:

现在在您的控制器操作中使用此代码:

// at top on your controller
use Zend\Validator\File\Size;
use Zend\Validator\File\ImageSize;
use Zend\Validator\File\IsImage;
use Zend\Http\Request

    // in action
$file = $request->getFiles();
$fileAdapter = new \Zend\File\Transfer\Adapter\Http();
$imageValidator = new IsImage();
if ($imageValidator->isValid($file['file_url']['tmp_name'])) {
    $fileParts = explode('.', $file['file_url']['name']);
    $filter = new \Zend\Filter\File\Rename(array(
               "target" => "file/path/to/image." . $fileParts[1],
               "randomize" => true,
              ));

    try {
         $filePath = $filter->filter($file['file_url'])['tmp_name'];
         $thumbnailer = $this->getServiceLocator()
                        ->get('WebinoImageThumb');
         $thumb = $thumbnailer->create($filePath, $options = [], $plugins = []);
         $thumb->adaptiveResize(540, 340)->save($filePath);

      } catch (\Exception $e) {
          return new ViewModel(array('form' => $form, 
                     'file_errors' => array($e->getMessage())));
      }
  } else {
      return new ViewModel(array('form' => $form, 
                 'file_errors' => $imageValidator->getMessages()));
  }

Good luck..!!


2

使用一个服务来实现这个功能,并将其注入到需要该功能的控制器中。


2

这里有一个名为WebinoImageThumb的模块,它是Zend Framework 2中的一部分。请查看此模块。它具有以下一些很棒的功能:

  • 图片调整大小
  • 图片裁剪、填充、旋转、显示和保存
  • 创建图像反射

0
为了在上传后动态调整图像大小,您应该执行以下操作:
public function imageAction() 
{
// ...
$imagine = $this->getImagineService();
$size = new \Imagine\Image\Box(150, 150);
$mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET;

$image = $imagine->open($destinationPath);
$image->thumbnail($size, $mode)->save($destinationPath);
// ...
}

public function getImagineService()
{
    if ($this->imagineService === null)
    {
        $this->imagineService = $this->getServiceLocator()->get('my_image_service');
    }
    return $this->imagineService;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接