【问题标题】:How to cache images generated by imagick?如何缓存imagick生成的图像?
【发布时间】:2019-09-06 04:02:22
【问题描述】:

我正在使用下面的函数来生成带有文本的图像。我想知道如何才能使图像只为用户生成一次,然后将图像缓存在他们的浏览器中。我的目标是节省服务器资源。

我的 imagick 代码看起来还好吗?我担心我可能会遇到某种内存泄漏。感谢您的帮助

function small_image($username){

$file_content = file_get_contents("https://example.com/wp-content/uploads/2019/04/image.jpg");

$imagick = new Imagick();
$imagick -> readImageBlob($file_content);

$draw = new ImagickDraw();
$pixel = new ImagickPixel( 'gray' );
$draw->setFillColor('white');

/* Font properties */
$draw->setFont('Utopia');
$draw->setFontSize( 50 );

$geo=$imagick->getImageGeometry(); 

$imagick->annotateImage($draw, 60, 185, 0, $username);

$imgBuff = $imagick->getImageBlob();
$imagick->clear(); 

$img = base64_encode($imgBuff);
$imagick -> destroy();
return "<img id='imagick-banner' width=500 alt='Embedded Image' src='data:image/png;base64,$img' />";
 }

【问题讨论】:

    标签: php caching imagemagick browser-cache imagick


    【解决方案1】:

    您提到了节省服务器资源,因此请尝试让客户端浏览器完成这项工作。这种方法的一个警告是用户必须有正确的字体,或者你必须在网站上提供字体。

    HTML

    <canvas id="userImage"></canvas>
    

    JavaScript

    window.onload = function() {
        var canvas = document.getElementById("userImage");
        var context = canvas.getContext("2d");
        var imageObject = new Image();
        imageObject.onload = function(){
            context.drawImage(imageObj, 10, 10);
            context.font = "50pt Utopia";
            context.fillText(username, 60, 185);
        };
        imageObject.src = userImageURI;
        document.getElementById('userImage').appendChild(imageObject);
    };
    

    作为更严格的答案,使用 imagick 尝试使用 JavaScript 中的 localStorage(让您的 php 第一次处理它并使用 JavaScript 来决定何时请求新图像)。

    localStorage.setItem("userImage", base64data);
    var userImage = document.body.appendChild("img");
    userImage.setAttribute('src', "data:image/png;base64, " + localStorage.getItem("userImage"));
    

    【讨论】:

    • 我一直在处理这个问题,但它只显示了我图像的上角并且文本被截断了。我用于 imageObject 的图像是 1000 x 220。我可以通过将画布设置为 1000 x220 并将 imageObject 设置为 1000 x 220 来使其工作,但是有没有办法将其按比例调整为 400 x 105 之类的东西?
    • 我明天可以看看。如果我没记错的话,我过去曾通过缩放来做到这一点。与此同时,你能设置一个小提琴吗?我想我的示例中的 drawImage 坐标是错误的,这是最初的问题。
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多