Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPEG将PHP图像压缩到内存_Php - Fatal编程技术网

JPEG将PHP图像压缩到内存

JPEG将PHP图像压缩到内存,php,Php,我正在为我们当地的童子军部队写一个简单的网站,应该允许上传图片。 我正在使用PHP4.3.9调整图像大小并创建缩略图,但是(捐赠的)托管服务 不允许从PHP写入文件系统。然而,他们确实提供了5G的mysql。我想 将图像存储在数据库中,但尚未找到将已调整大小的图像转换为JPEG的方法。据我所知,imagejpg只会写入一个文件(我不能这样做)。做 有人知道是否可以在PHP中生成JPEG到内存吗? 谢谢 -jim您可以使用输出缓冲: ob_start(); imagejpeg($image, NU

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

您可以使用输出缓冲:

ob_start();
imagejpeg($image, NULL, 100);
$image_data = ob_get_contents();
ob_end_clean();
为了澄清这一点,如果您查看,您将看到您可以使用它来写入文件或直接输出原始图像流,具体取决于第二个参数。我正在使用输出缓冲来捕获原始图像流。

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


更一般地说,我建议抛弃“捐赠”的提供商,获得一个真正的web服务。几乎每一家网络托管公司都提供一些MySQL和PHP的风格。对于使用量较小的共享主机,您可能每月只需支付10-20美元。PHP4.3.9于2004年发布。要为特定版本找到好的文档是很困难的,而且您不能忽略自那时以来所做的错误修复的数量。

我推荐jeroen的输出缓冲解决方案,但我将添加它作为一个很酷的替代方案

从这里开始上课


哦,玛安。。。。我知道,你看起来不像是在说什么礼物之类的,但是PHP网络托管不允许写文件吗?那太傻了。此外,4.3.9是一个非常旧的版本,不再受支持。我会考虑切换到一个体面的主机包,如果有可能。PHP4已经死了很长一段时间,现在是时候升级到至少5.2澄清:IVIGPEPEG()不仅写文件,它也可以显示图像到标准输出。这个答案解释了如何捕获这样的输出。@阿尔瓦罗·G·维卡里奥你说得对,我将在答案中添加一个小的解释。谢谢!我看到了imagejpeg的原始输出选项,但我认为这只会流回到浏览器。完全不知道输出缓冲!我认为他计划将图像作为一个斑点保存到数据库中,这就是为什么他需要捕获imagejpeg的输出。但是我同意其他人(关于抛弃供应商)呃。只要我能建立并运行一个简单的网站,0美元/月胜过10美元/月(120美元/年-->多卖30袋爆米花!;-),而且,是的,图像会进入数据库。谢谢!很酷的技术,加上它让我更多地了解了在PHP中可以做什么。(我实际上是一名C/C++开发人员;在访问部队网站之前,我从未接触过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);