来自 Imagick 的 readImageBlob 函数抛出一个错误,如“无此图像格式的解码委托”

Posted

技术标签:

【中文标题】来自 Imagick 的 readImageBlob 函数抛出一个错误,如“无此图像格式的解码委托”【英文标题】:readImageBlob function from Imagick is throwing an error like 'No Decode Delegate For This Image Format' 【发布时间】:2015-12-03 02:51:46 【问题描述】:

我正在开发一个 php 项目,使用 PHP 版本 5.4.7,它可以在线自定义图像并为站点管理员显示自定义。图片格式为png。 imagick,php原生函数用于读取图片并保存为pdf。

下面是我使用的代码sn-p。

$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); 是的,我也试过了。但效果并不好。遇到同样的错误。 所以请显示你在哪里设置$data 其实我是使用javascript从画布元素中获取图像的, var file = canvas.toDataURLWithMultiplier('png', multiplier, 1);并将其发布到我之前提到的 php 文件中...我这样做是为了设置 $data..., list($type, $data) = explode(';', $image); list(, $data) = explode(',', $data); 你的base64_encode($data);post之前在哪里? 【参考方案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

下载ImageMagick-6.6.5-10-Q8-windows-dll.exe.

这是我找到旧 6.6.5 的唯一地方

安装 exe 文件并在安装结束时建议进行测试。将命令复制并粘贴到 cmd 窗口中。

在路径中测试ImageMagick-6.6.5-Q8

安装附带重要文件


Dependency Walker 测试php_imagick.dll,确保所有dlls 都已就位。 全部找到了,没有红色!


使用 Php_info 进行测试

现在是重新启动计算机的好时机。

在 Netbeans 中测试

打开netbeans并新建一个Project

你也可以用 cmd 运行 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

结果 canvasNew.png

例子还有here

【讨论】:

imagemagick 已安装。还有一个条件是检查它是否安装。但我对解码委托有疑问。所以我也提出了另一个问题:***.com/q/32442085/5226917 @JTheDev :您必须完全安装适合您的 5.4.7 PHP 的 ImageMagick 版本!!!!你的 ImageMagick 版本是多少? @JTheDev 不,我的意思是 ImageMagick 库版本。但是对于包装器php_imagick-3.1.2-5.6,你需要php_imagick-3.1.2-5.4 是错误的!!! 是的,谢谢,但是没有用。我放弃了那个功能。非常感谢您的帮助... @JTheDev :我创建了一个step by step。请尝试一下。

以上是关于来自 Imagick 的 readImageBlob 函数抛出一个错误,如“无此图像格式的解码委托”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 jQuery Guillotine Plugin 和 Imagick 的数据裁剪图像

php imagick调整图像代码无法正常工作

在 URL 上使用 Imagick 的 readImageFile 时如何修复“检测到无效的 CRT 参数”错误?

如何在 Imagick 中设置修剪颜色?

imagick - 设置输出pdf的纸张大小

imagick没有检测到inkscape