【问题标题】:imagecreatetruecolor php uses up too much memoryimagecreatetruecolor php占用了太多内存
【发布时间】:2016-03-17 21:55:09
【问题描述】:

我有一个 php 代码,它通过 ajax 调用获取其值。这些值由用户用于裁剪图像的裁剪模块提供。

<?php

ini_set('Memory_limit', -1);

$imgUrl = $_POST['imgUrl'];
// original sizes
$imgInitW = $_POST['imgInitW'];
$imgInitH = $_POST['imgInitH'];
// resized sizes

$imgW = $_POST['imgW'];
$imgH = $_POST['imgH'];
// offsets
$imgY1 = $_POST['imgY1'];
$imgX1 = $_POST['imgX1'];
// crop box
$cropW = $_POST['cropW'];
$cropH = $_POST['cropH'];
// rotation angle
$angle = $_POST['rotation'];

$jpeg_quality = 100;
$uniquename=uniqid().time();
$output_filename = "croppedimages/".$uniquename;
// uncomment line below to save the cropped image in the same location as the original image.
//$output_filename = dirname($imgUrl). "/croppedImg_".rand();

$what = getimagesize($imgUrl);

switch(strtolower($what['mime']))
{
    case 'image/png':
        $img_r = imagecreatefrompng($imgUrl);
        $source_image = imagecreatefrompng($imgUrl);
        $type = '.png';
        break;
    case 'image/jpeg':
        $img_r = imagecreatefromjpeg($imgUrl);
        $source_image = imagecreatefromjpeg($imgUrl);
        error_log("jpg");
        $type = '.jpeg';
        break;
    case 'image/gif':
        $img_r = imagecreatefromgif($imgUrl);
        $source_image = imagecreatefromgif($imgUrl);
        $type = '.gif';
        break;
    default: die('image type not supported');
}


//Check write Access to Directory

if(!is_writable(dirname($output_filename))){
    $response = Array(
        "status" => 'error',
        "message" => 'Can`t write cropped File'
    );  
}else{

    // resize the original image to size of editor
    $resizedImage = imagecreatetruecolor($imgW, $imgH);
    imagecopyresampled($resizedImage, $source_image, 0, 0, 0, 0, $imgW, $imgH, $imgInitW, $imgInitH);
    // rotate the rezized image
    $rotated_image = imagerotate($resizedImage, -$angle, 0);
    // find new width & height of rotated image
    $rotated_width = imagesx($rotated_image);
    $rotated_height = imagesy($rotated_image);
    // diff between rotated & original sizes
    $dx = $rotated_width - $imgW;
    $dy = $rotated_height - $imgH;
    // crop rotated image to fit into original rezized rectangle
    $cropped_rotated_image = imagecreatetruecolor($imgW, $imgH);
    imagecolortransparent($cropped_rotated_image, imagecolorallocate($cropped_rotated_image, 0, 0, 0));
    imagecopyresampled($cropped_rotated_image, $rotated_image, 0, 0, $dx / 2, $dy / 2, $imgW, $imgH, $imgW, $imgH);
    // crop image into selected area
    $final_image = imagecreatetruecolor($cropW, $cropH);
    imagecolortransparent($final_image, imagecolorallocate($final_image, 0, 0, 0));
    imagecopyresampled($final_image, $cropped_rotated_image, 0, 0, $imgX1, $imgY1, $cropW, $cropH, $cropW, $cropH);
    // finally output png image
    //imagepng($final_image, $output_filename.$type, $png_quality);
    imagejpeg($final_image, $output_filename.$type, $jpeg_quality);
    $response = Array(
        "status" => 'success',
        "url" => $output_filename.$type,
    );

}
print json_encode($response);

这里 cropW 和 cropH 是裁剪后的图像的值。但是,这对于低分辨率图像效果很好,但是当使用高分辨率图像时,控制台会显示错误在imagecreatetruecolor 函数上。

致命错误:允许的内存大小为 134217728 字节已用尽

现在即使我通过ini_set('Memory_limit', -1); 设置内存使用量,它仍然会显示此错误。可能是什么原因以及解决方案是什么?

注意:我知道设置ini_set('Memory_limit', -1); 是个坏主意。

【问题讨论】:

  • 您是自托管还是付费提供商?
  • 现在在本地主机上工作,但可能会将此模块添加到实时网站。我将使用其他一些图像处理库。这里的这个是用于学习目的。
  • 你在运行 suhosin 吗?
  • GD 必须将整个图像加载到内存中才能使用它。使用没有此限制的ImageMagick functions 可能会更好。
  • 不,我没有使用它@mkaatman

标签: php


【解决方案1】:

如果您检查您的 php.ini 文件,您会发现它是 memory_limit 而不是 Memory_limit。

请看这里:- http://prntscr.com/agxrtt

所以将ini_set('Memory_limit','-1') 更改为ini_set('memory_limit',256) 或ini_set('memory_limit','-1')

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 2014-09-20
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2013-07-18
    • 2013-07-11
    • 2020-05-18
    相关资源
    最近更新 更多