Imagick的readImageBlob函数抛出了一个错误,如“此图像格式没有解码委托”。

4
我正在开发一个PHP项目,使用的是PHP版本5.4.7。该项目可以在线自定义图片,并在网站管理员中显示定制内容。图片格式为png。使用php原生函数Imagick来读取并将图像保存为pdf。
下面是我使用的代码片段。
$datadec = base64_decode($data);        
        $dpi = 300;
        $printable_width = ($dims['printable_width'] * $dpi)/25.4;
        $printable_height = ($dims['printable_height'] * $dpi)/25.4;

        $im = new Imagick();
        $im->setResolution(300, 300);
        $im->readImageBlob($datadec);
        $im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);      
        $settings = include '../data/settings.php';
        $format = $settings['print_format'];

但是出现了一个错误,错误如下:

类型:ImagickException 代码:420 消息: NoDecodeDelegateForThisImageFormat `' @ error/blob.c/BlobToImage/358

Slim的错误跟踪信息如下:

#0 C:\xampp\htdocs\XXXX\admin\controllers\OrdersController.php(151): Imagick->readimageblob('?PNG????????IHD...')
#1 C:\xampp\htdocs\XXXX\admin\controllers\OrdersController.php(305): OrdersController->convertHiRes('data:image/png;...', Array, '../storage/orde...')
#2 [internal function]: OrdersController->postPrint()

我对Imagick安装有些疑问,但大部分论坛都是基于Linux环境回答的。作为一个初学者,我不太了解这些命令。

更新

实际上,我是使用JavaScript从一个画布元素中获取到了图片:

var file = canvas.toDataURLWithMultiplier('png', multiplier, 1);

这个内容将会被发布到之前提到的PHP文件中... 在那里,我做了以下操作来设置$data...

list($type, $data) = explode(';', $image);
list(, $data) = explode(',', $data); 

我在Windows环境下使用XAMPP。

你在哪里对 $data 进行了编码?尝试过不使用 base64_decode 直接使用 $data 吗?$im->readImageBlob($data); - moskito-x
是的,我也尝试过那个。但是效果不太好,还是出现了同样的错误。 - JTheDev
请展示您设置$data的位置! - moskito-x
实际上,我使用JavaScript从画布元素中获取了图像,var file = canvas.toDataURLWithMultiplier('png', multiplier, 1); 然后将其发布到之前提到的PHP文件中... 在那里,我执行以下操作来设置 $data... list($type, $data) = explode(';', $image); list(, $data) = explode(',', $data); - JTheDev
你的 base64_encode($data);post 之前呢? - moskito-x
我没有单独进行编码。我使用fabric.js中的toDataURLWithMultiplier方法获取图像代码。结果本身是以编码形式呈现的。 - JTheDev
1个回答

1
重要的是模块匹配。您有PHP 5.4.7。
这两个经过我的测试并且匹配。
在此处查找“5.4 Thread Safe(TS)x86”下载。

https://pecl.php.net/package/imagick/3.1.2/windows

你只需要 php_imagick.dll

找到并将php_imagick.dll放置在您的扩展文件夹中,通常是php/ext/

打开C:\Windows\php.ini

如果存在,请取消注释;如果不存在,请添加以下行。

extension=php_imagick.dll

这是我找到的唯一一个旧版本6.6.5的地方。

  • 安装exe文件,并在安装结束时执行提供的测试。将命令复制并粘贴到cmd窗口中。

  • 测试路径中是否存在ImageMagick-6.6.5-Q8

enter image description here

  • 重要文件随安装一起提供

enter image description here


  • 使用 Dependency Walker 测试 php_imagick.dll ,确保所有的 dll 都已就位。 全部找到,没有红色提示!

enter image description here

enter image description here


  • 测试 Php_info

enter image description here

  • 现在是一个好时机来重新启动电脑。

在Netbeans中测试

打开Netbeans并创建一个新的项目

enter image description here

您也可以使用命令行运行index.php

"G:\php\php.exe" "U:\Programme\NetBeans80\dtx\PngHeader\index.php"

index.php

<?php
$filename = "canvas.png";
$handle = fopen($filename, "r+");
$contents = fread($handle, filesize($filename));
fclose($handle);

$im = new Imagick();
$im->queryFormats();
$im->readImageBlob($contents);
/* Thumbnail the image */
$im->thumbnailImage(200, null);
/* Create a border for the image */
$im->borderImage(new ImagickPixel("white"), 5, 5);
/* Clone the image and flip it */
$reflection = $im->clone();
$reflection->flipImage();
/* Create gradient. It will be overlayed on the reflection */
$gradient = new Imagick();
/* Gradient needs to be large enough for the image and the borders */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");
/* Composite the gradient on the reflection */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* Add some opacity. Requires ImageMagick 6.2.9 or later */
$reflection->setImageOpacity( 0.3 );

/* Create an empty canvas */
$canvas = new Imagick();

/* Canvas needs to be large enough to hold the both images */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* Composite the original image and the reflection on the canvas */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

$filename = "canvasNew.png";
$handle = fopen($filename, "wb");
if ($handle){
  fwrite( $handle, $canvas);
  fclose($handle);
}
?>

canvas.png

enter image description here

结果 canvasNew.png

enter image description here

例子也可以在这里 连接

ImageMagick已安装。还有一个条件来检查它是否已安装。但我对解码委托有疑问。因此,我也提出了另一个问题:http://stackoverflow.com/q/32442085/5226917 - JTheDev
@JTheDev:您必须精确安装与您的5.4.7 PHP相匹配的ImageMagick版本!!! 您的ImageMagick版本是什么? - moskito-x
@JTheDev 不,我指的是 ImageMagick 库版本。但是对于包装器 php_imagick-3.1.2-5.6 来说是错误的,你需要 php_imagick-3.1.2-5.4 !!! - moskito-x
是的,谢谢,但它没有起作用。我放弃了那个功能。非常感谢你的帮助... - JTheDev
@JTheDev:我已经制作了一个“逐步指南”。请尝试一下。 - moskito-x
非常感谢您的努力,提前致以最诚挚的感谢。我会检查它并回复您... 再次感谢。 - JTheDev

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