来自Imagick的readImageBlob函数抛出了一个错误,例如“没有解码此图像格式的代表”#39;

时间:2015-09-07 14:02:27

标签: php windows apache xampp imagick

我正在使用PHP版本5.4.7开发PHP项目,该版本可以在线自定义图像并显示站点管理员的自定义。图像格式为png。想象一下,php本机函数用于读取图像并将其保存为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从canvas元素中获取了图像:

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

这是发布到我之前提到过的php文件...我在这里设置了$ data ...,

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

我在Windows环境中使用XAMPP。

1 个答案:

答案 0 :(得分: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

  • 使用php_imagick.dll测试Dependency Walker所有dll都在原位。 一切都找到了,没有红色!

enter image description here

enter image description here

  • 使用Php_info进行测试

enter image description here

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

在Netbeans中进行测试

打开netbeans并创建一个新的Project

enter image description here

您也可以使用cmd运行index.php

  

“G:\ php \ php.exe”“U:\ Program \ 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

示例也是here