php - 使用imagick扩展图像
问题描述
我有一个尺寸为 x 和 y 的图像。我想使用 imagick 将图像扩展到 x 和 y+10。这里有一个实现这一点的例子:
http://phpimagick.com/Tutorial/edgeExtend
该代码示例显示了如何水平扩展,而不是垂直扩展。
当我使用该示例进行水平扩展时,它可以工作:
function EdgeExtendHorizontal(&$img)
{
$originalWidth=$img->getImageWidth();
$desiredWidth=$originalWidth+120;
$Factor=$originalWidth/$desiredWidth;
$Offset=($desiredWidth-$originalWidth)/2;
$img->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_MIRROR);
$img->sampleimage($desiredWidth,$img->getImageHeight());
$points=array($Factor,0,0,1,$Offset,0);
$img->distortImage(Imagick::DISTORTION_AFFINEPROJECTION,$points,false);
}
但是,当我尝试切换参数以使图像垂直扩展时,它不起作用:
function EdgeExtendVertical(&$img)
{
global $LanguageName;
$originalHeight=$img->getImageHeight();
$desiredHeight=$originalHeight+100;
$Factor=$originalHeight/$desiredHeight;
$Offset=($desiredHeight-$originalHeight)/2;
$img->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_MIRROR);
$img->sampleimage($img->getImageWidth(),$desiredHeight);
$points=array(0,$Factor,0,1,0,$Offset);
$img->distortImage(Imagick::DISTORTION_AFFINEPROJECTION,$points,false);
}
如下修改点数组确实会带来结果:
$points=array($Factor,0,0,1,0,$Offset);
但是现在图像在垂直和水平方向上都莫名其妙地扩展了
如果有人能对点阵列的结构有所了解,以便图像仅垂直扩展,我将不胜感激。
谢谢!
西姆罗
解决方案
一次扩展宽度、高度或两者的最简单通用方法 (PHP >= 5.4):
$im = new Imagick ("myfile.png");
$im->setImageVirtualPixelMethod (imagick::VIRTUALPIXELMETHOD_MIRROR);
list ($width, $height) = array_values ($im->getImageGeometry ());
$extend_width = 0;
$extend_height = 100;
$new_width = $width + $extend_width;
$new_height = $height + $extend_height;
$extend_width /= 2;
$extend_height /= 2;
$im->setImageArtifact ("distort:viewport", "{$new_width}x$new_height-$extend_width-$extend_height");
$im->distortImage (imagick::DISTORTION_SCALEROTATETRANSLATE, [0], false);
$im->writeImage (getcwd () . "/my_extended_image.png");
对于 PHP < 5.4,将以 $im->distortImage () 开头的行替换为:
$im->distortImage (imagick::DISTORTION_SCALEROTATETRANSLATE, array (0), false);
如果这不起作用,请告诉我!干杯,李
推荐阅读
- python - BeautifulSoup 从 Python 中的 P 类图片标签中获取图像名称
- angular - *ngFor 与过滤管道和切片不起作用
- java - 如何将生成的数据存储在数据库中?
- python - 如何使用 SQLAlchemy 插入复合主键?
- java - Api Java ElasticSearch | 通过传递列表并返回所有匹配项进行搜索
- encryption - 确保已部署软件的公钥安全
- javascript - 子类的父方法未被调用 React
- angular8 - “无法读取未定义的属性'组件'”,同时通过 Angular 8 中的 params.context 从另一个组件调用一个组件的方法
- shopware - StorefrontRenderEvent::class 事件
- r - R - 重新排序数据框保持第一列