4

这是我的 ImageMagick 代码,通过在默认目录中创建文件名为“coloured_font.png”的新图像,在我的网络服务器上运行良好...

<?php 
$cmd = " -background none -pointsize 60 -font Times-Roman -fill red ".
 " -strokewidth 1 -stroke black label:\"google\" ";
exec("convert $cmd coloured_font.png");
?>

但是现在我在 Windows 上运行 ImageMagick,它不会在默认文件夹中创建任何图像文件,但 ImageMagick 应用程序运行良好(我已经通过创建缩略图进行了测试)。所以现在我的想法是在浏览器屏幕中显示“coloured_font.png”而不将其保存在其他任何地方......所以请任何人都可以帮助我在屏幕上创建和显示图像而不保存它。

4

3 回答 3

6

您可以使用特殊inline:格式的图像(ImageMagick 也支持读取文件)。这种格式是二进制数据的 base64 编码。

在(Linux)命令行上:

my_base64_png="$(
convert               \
    -background none  \
    -pointsize 60     \
    -font Times-Roman \
    -fill red         \
    -strokewidth 1    \
    -stroke black     \
     label:\"google\" \
     png:fd:1         \
 |                    \
 base64  -i -  -o -)"

此命令使用 ImageMagick 和 shell 的几个特殊技巧:

  • 使用格式提示png:告诉它输出应该是 PNG 格式;
  • 通过指定使用stdout作为其输出通道(而不是文件)fd:1
  • 将输出直接传送到二进制文件的标准输入base64以对 PNG 进行编码;
  • 将 base64 编码数据存储在环境变量my_base64_png中。

现在在您的 HTML 中内联 base64 图像数据(它应该适用于所有现代浏览器,但不适用于旧浏览器):

 <IMG SRC="data:image/png;base64,
         echo "$(my_base64_png)"
  ALT="google" WIDTH=214  HEIGHT=57  VSPACE=5 HSPACE=5 BORDER=0 />

或者

 <IMG SRC="data:image/png;base64,
         iVBORw0KGgoAAAANSUhEUgAAAM4AAABJAQMAAABPZIvnAAAABGdBTUEAALGPC/xh
         BQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA
         OpgAABdwnLpRPAAAAAZQTFRFAAAA/wAAG/+NIgAAAAF0Uk5TAEDm2GYAAAABYktH
         RACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAB6ElEQVQ4y+3UQY7bIBQG4IeQ
         yqYaLhANV+iyi9FwpS69iGyiLuZYpepF6A1YskC8/uCA7SgZtVI3lcoiivkIxu/9
         MdH/8U+N6el2pk0oFyibWyr1Q3+PlO2NqJV+/BnRPMjcJ9zrfJ/U+zQ9oAvo+QGF
         d+npPqFQn++TXElkrEpEJhAtlTBR6dNHUuzIMhFnEhxAmJDkKxlmt7ATXDDJYcaE
         r4Txqtkl42VYSH+t9KrD9b5nxZeog/LWGVHprGInGWVQUTvjDWXca5KdsowqyGSc
         DrZRlGlQUl4kQwpUjiSS9gI9VdECZhHFQ2I+UE2CHJQfkNxTNKCl0RkURqlLowJK
         1h1p3sjc0CJD39D4BIqD7JvvpH/GAxl2/YSq9mtHSHknga7OKNOHKyEdaFC2Dh1w
         9VSJemBeGuHgMuh24EynK03YM1Lr83OjUle38aVSfTblT424rl4LhdglsUag5RB5
         uBJSJBIiELSzaAeIN0pUlEeZEMeClC4cBuH6mxOlgPjC3uLproUCWfy58WPN/MZR
         86ghc888yNdD0Tj8eAucasl2I5LqX19I7EmEjaYjSb9R/G1SYfQA7ZBuT5H6WwDt
         UAfK1BOJmh/eZnKLeKvZ/vA8qonCpj1h6djfbqvW620Tva36++MXUkNDlFREMVkA
         AAAldEVYdGRhdGU6Y3JlYXRlADIwMTItMDgtMjJUMDg6Mzc6NDUrMDI6MDBTUnmt
         AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEyLTA4LTIyVDA4OjM3OjQ1KzAyOjAwIg/B
         EQAAAA50RVh0bGFiZWwAImdvb2dsZSJdcbX4AAAAAElFTkSuQmCC"
  ALT="google" WIDTH=214  HEIGHT=57  VSPACE=5 HSPACE=5 BORDER=0 />

将这个过程翻译成 PHP 对您来说应该不难。;-)

正如我所说,ImageMagick 可以读取这种inline:格式(此处不用于读取)。但为了完整起见,让我向您展示如何:

  convert                                                                   \
        'inline:image/png;data:,
         iVBORw0KGgoAAAANSUhEUgAAAM4AAABJAQMAAABPZIvnAAAABGdBTUEAALGPC/xh
         BQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA
         OpgAABdwnLpRPAAAAAZQTFRFAAAA/wAAG/+NIgAAAAF0Uk5TAEDm2GYAAAABYktH
         RACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAB6ElEQVQ4y+3UQY7bIBQG4IeQ
         yqYaLhANV+iyi9FwpS69iGyiLuZYpepF6A1YskC8/uCA7SgZtVI3lcoiivkIxu/9
         MdH/8U+N6el2pk0oFyibWyr1Q3+PlO2NqJV+/BnRPMjcJ9zrfJ/U+zQ9oAvo+QGF
         d+npPqFQn++TXElkrEpEJhAtlTBR6dNHUuzIMhFnEhxAmJDkKxlmt7ATXDDJYcaE
         r4Txqtkl42VYSH+t9KrD9b5nxZeog/LWGVHprGInGWVQUTvjDWXca5KdsowqyGSc
         DrZRlGlQUl4kQwpUjiSS9gI9VdECZhHFQ2I+UE2CHJQfkNxTNKCl0RkURqlLowJK
         1h1p3sjc0CJD39D4BIqD7JvvpH/GAxl2/YSq9mtHSHknga7OKNOHKyEdaFC2Dh1w
         9VSJemBeGuHgMuh24EynK03YM1Lr83OjUle38aVSfTblT424rl4LhdglsUag5RB5
         uBJSJBIiELSzaAeIN0pUlEeZEMeClC4cBuH6mxOlgPjC3uLproUCWfy58WPN/MZR
         86ghc888yNdD0Tj8eAucasl2I5LqX19I7EmEjaYjSb9R/G1SYfQA7ZBuT5H6WwDt
         UAfK1BOJmh/eZnKLeKvZ/vA8qonCpj1h6djfbqvW620Tva36++MXUkNDlFREMVkA
         AAAldEVYdGRhdGU6Y3JlYXRlADIwMTItMDgtMjJUMDg6Mzc6NDUrMDI6MDBTUnmt
         AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEyLTA4LTIyVDA4OjM3OjQ1KzAyOjAwIg/B
         EQAAAA50RVh0bGFiZWwAImdvb2dsZSJdcbX4AAAAAElFTkSuQmCC'              \
  my_decoded.png

ImageMagick 不需要image/png;命令的一部分(它甚至忽略它),因为它可以通过它自己的内置魔法数据库识别格式 - 但它也没有伤害......

我还要指出,ImageMagick 的命令行长度限制为 5000 个字符,因此读取inline:数据不适用于较大的图片。(我目前不知道在 HTML 中内联图像数据的限制是什么......)

于 2012-08-22T07:09:18.183 回答
1

只需在您的 html 文件中替换并coloured_font.png创建coloured_font.php

coloured_font.php包含以下内容:

<?php

header("Content-Type: image/png");

echo `convert -background none -pointsize 60 -font Times-Roman -fill red ".
 " -strokewidth 1 -stroke black label:\"google\" png:-`;

就是这样!尝试coloured_font.php在浏览器中打开!

于 2012-10-02T09:50:27.990 回答
0

您将不得不创建一个临时文件

脚步

  1. 通过在 shell 中temp_image.jpg运行命令创建一个临时文件imagemagick
  2. 将此作为 http 响应发送

    $file = 'pathto/temp_image.jpg';
    $type = 'image/jpeg';           // set appropriate type    
    header('Content-Type:'.$type);  // set content type
    header('Content-Length: ' . filesize($file));
    readfile($file);
    
  3. 删除temp_image.jpg

假设这是在 中getImage.php,它可以作为图像标签的来源

<img src="pathto/getImage.php" />
于 2012-08-22T04:38:52.327 回答