0

很久以前,我创建了一个小型库,用于通过 imagemagick 调整图像大小,system(...)因为我觉得 PHP 的内置 imagemagick 函数不够用。

然而,最近我不得不将它移植到一个 symfony 项目中,我选择使用 sfThumbnailPlugin(如果我没记错的话)。不幸的是,这不包括裁剪功能 - 即指定所需的大小,例如 300x300 像素并裁剪缩略图以使其适合。我选择自己实现这个功能,但似乎有问题。

每当我将图像的大小调整到所需的大小时,宽度大于高度时,比例就会被搞砸。看看这个例子: http: //i37.tinypic.com/9hkqrl.png - 在这个例子中,最上面一行是正确的比例,最下面一行是问题所在。

在示例中,顶部和底部应该已被裁剪。

这是完成裁剪部分的代码(变量名称应该是不言自明的):

<?php
    if ($width/$height > $this->maxWidth/$this->maxHeight) {
      // then resize to the new height...
                $command .= ' -resize "x'.$this->maxWidth.'"';

                // ... and get the middle part of the new image
                // what is the resized width?
                $resized_w = ($this->maxWidth/$height) * $width;

                // crop
                $command .= ' -crop "'.$this->maxHeight.'x'.$this->maxWidth.'+'.round(($resized_w - $this->maxWidth)/2).'+0"';
            } else {
                // or else resize to the new width
                $command .= ' -resize "'.$this->maxHeight.'x"';

                // ... and get the middle part of the new image
                // what is the resized height?
                $resized_h = ($this->maxHeight/$width) * $height;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
                             '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
            }

Is 是产生错误代码的 if 语句的第二部分。

任何人都可以为我纠正这个吗?显然计算是错误的。

4

2 回答 2

2

解决方案如下:

    if ($width/$height > $this->maxWidth/$this->maxHeight) {
      // then resize to the new height...
                $command .= ' -resize "x'.$this->maxHeight.'"';

                // ... and get the middle part of the new image
                // what is the resized width?
                $resized_w = ($this->maxHeight/$height) * $width;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.'+'.round(($resized_w - $this->maxWidth)/2).'+0" +repage';
            } else {
              $command .= ' -resize "' . $this->maxWidth . 'x"';
              $resized_h = ($this->maxWidth/$width) * $height;

                // crop
                $command .= ' -crop "'.$this->maxWidth.'x'.$this->maxHeight.
                             '+0+'.round(($resized_h - $this->maxHeight)/2).'" +repage';
            }
于 2009-11-06T02:09:05.670 回答
1

我告诉一个建议,你可以试试,

我看到了图片链接,我认为条件检查不正确。

您已检查条件[(width/height) > (maxWidth/maxHeight)]而不是检查

if(width == height) { } elseif(width > height) { } else(width < height){ }

检查此条件并根据此条件裁剪图像并调整大小。

谢谢

于 2009-11-05T08:49:29.280 回答