JPEG将PHP图像压缩到内存中

时间:2011-12-28 15:42:16

标签: php

我正在为我们当地的童子军队伍写一个简单的网站,这应该允许图片上传。 我正在使用PHP 4.3.9来调整图像大小并创建缩略图,但是(捐赠的)托管服务 不允许从PHP进行文件系统写入。但是,他们提供了5G的mysql。我想要 将图像存储在数据库中,但尚未找到将调整大小的图像转换为JPEG的方法。据我所知,imagejpg只会写入文件(我不能这样做)。是否 有人知道是否有可能在PHP中生成JPEG内存? 谢谢! -Jim

3 个答案:

答案 0 :(得分:6)

您可以使用输出缓冲:

ob_start();
imagejpeg($image, NULL, 100);
$image_data = ob_get_contents();
ob_end_clean();

为了澄清一下,如果查看manual for imagejpeg,您将看到可以使用它来写入文件或直接输出原始图像流,具体取决于第二个参数。我正在使用输出缓冲来捕获原始图像流。

答案 1 :(得分:2)

我推荐使用jeroen的输出缓冲解决方案,但我会将其添加为一个很酷的选择。

从这里使用课程 http://www.php.net/manual/en/stream.streamwrapper.example-1.php

class VariableStream {
    var $position;
    var $varname;

    function stream_open($path, $mode, $options, &$opened_path)
    {
        $url = parse_url($path);
        $this->varname = $url["host"];
        $this->position = 0;

        return true;
    }

    function stream_read($count)
    {
        $ret = substr($GLOBALS[$this->varname], $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }

    function stream_write($data)
    {
        $left = substr($GLOBALS[$this->varname], 0, $this->position);
        $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
        $GLOBALS[$this->varname] = $left . $data . $right;
        $this->position += strlen($data);
        return strlen($data);
    }

    function stream_tell()
    {
        return $this->position;
    }

    function stream_eof()
    {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }

    function stream_seek($offset, $whence)
    {
        switch ($whence) {
            case SEEK_SET:
                if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
                     $this->position = $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_CUR:
                if ($offset >= 0) {
                     $this->position += $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_END:
                if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
                     $this->position = strlen($GLOBALS[$this->varname]) + $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            default:
                return false;
        }
    }

    function stream_metadata($path, $option, $var) 
    {
        if($option == STREAM_META_TOUCH) {
            $url = parse_url($path);
            $varname = $url["host"];
            if(!isset($GLOBALS[$varname])) {
                $GLOBALS[$varname] = '';
            }
            return true;
        }
        return false;
    }
}

然后你可以做

stream_wrapper_register("var", "VariableStream")
    or die("Failed to register protocol");

$GLOBALS['binaryImageContent'] = '';
imagejpg($im, 'var://binaryImageContent');
$data = $GLOBALS['binaryImageContent'];
echo strlen($data);

答案 2 :(得分:0)

您可以“生成内存”,但我看不到您打算如何存储图像以供日后检索。如果您计划在每次有人加载页面时调整图像大小,那么您将耗费大量CPU时间。由于没有选项可以直接写入磁盘(真的吗?)让我建议您至少将图像存储为MySQL数据库中的BLOB。虽然这样做效率低,也不是很好的做法,但每次刷新页面时,一遍又一遍地做同样的工作仍然会好一些。

更一般地说,我建议倾销“捐赠”提供商并获得真正的网络服务。几乎每个网络托管公司都提供一些MySQL和PHP的风格。对于使用率较低的共享主机,您可能会以10美元 - 20美元/月的价格购买。 PHP 4.3.9于2004年发布。要找到该特定版本的良好文档很难,你不能忽视自那时起修复的错误数量。