4

非常に背の高い画像を作成し、その上に多くの線を描画する PHP スクリプトがあります (組織的な Web のような外観)。私が作成しようとした最も高い画像の場合、線画は画像の中央から下部に向かって突然停止します: http://i.imgur.com/4Plgr.png

imagecreate() を使用してこの問題に遭遇した後、imagecreatetruecolor() がより大きな画像を処理できることがわかったので、それに切り替えました。私はまだ同じ問題を抱えていますが、スクリプトはやや大きな画像を処理できるようになりました。約1200本の線を描くべきだと思います。スクリプトの実行には 3 秒もかかりません。完全に実行された画像は次のとおりです: http://i.imgur.com/PaXrs.png

ini_set('memory_limit', '1000M') でメモリ制限を調整しましたが、スクリプトが制限に近づくことはありません。

スクリプトが終了するまで強制的に描画を続けるにはどうすればよいですか? または、PHP を使用してより少ないメモリを使用してイメージを作成するにはどうすればよいですか (これが問題だと思います)。

if(sizeof($array[0])<300)
$image=imagecreate($width,$height);
else
$image=imagecreatetruecolor($width,$height);
imagefill($image,0,0,imagecolorallocate($image,255,255,255));
for($p=0; $p<sizeof($linepoints); $p++){
$posx1=77+177*$linepoints[$p][0];
$posy1=-4+46*$linepoints[$p][1];
$posx2=77+177*$linepoints[$p][2];
$posy2=-4+46*$linepoints[$p][3];
$image=draw_trail($image,$posx1,$posy1,$posx2,$posy2);
}
imagepng($image,"images/table_backgrounds/table_background".$tsn.".png",9);
imagedestroy($image);

function draw_trail($image,$posx1,$posy1,$posx2,$posy2){
$black=imagecolorallocate($image,0,0,0);
if($posy1==$posy2)
imageline($image,$posx1,$posy1,$posx2,$posy2,$black);
else{
imageline($image,$posx1,$posy1,$posx1+89,$posy1,$black);
imageline($image,$posx1+89,$posy1,$posx1+89,$posy2,$black);
imageline($image,$posx1+89,$posy2,$posx2,$posy2,$black);
}
return $image;
}
4

2 に答える 2

1

メモリ リークが発生したと推測します。より大きな画像に対してさらに多くの操作を行うと、最終的に PHP のメモリ制限に達します。限界を上げるよりも、漏れを見つけたほうがいいでしょう。

で作成している色の割り当てを明示的に解除するように、コードを変更してみてくださいdraw_trail$imageまた、リソースを渡しているため、戻る必要はありません。

if(sizeof($array[0])&lt;300)
$image=imagecreate($width,$height);
else
$image=imagecreatetruecolor($width,$height);
imagefill($image,0,0,imagecolorallocate($image,255,255,255));
for($p=0; $p&lt;sizeof($linepoints); $p++)
{
    $posx1=77+177*$linepoints[$p][0];
    $posy1=-4+46*$linepoints[$p][1];
    $posx2=77+177*$linepoints[$p][2];
    $posy2=-4+46*$linepoints[$p][3];
    draw_trail($image,$posx1,$posy1,$posx2,$posy2);
}
imagepng($image,"images/table_backgrounds/table_background".$tsn.".png",9);
imagedestroy($image);

function draw_trail($image,$posx1,$posy1,$posx2,$posy2)
{
    $black=imagecolorallocate($image,0,0,0);
    if($posy1==$posy2)
    imageline($image,$posx1,$posy1,$posx2,$posy2,$black);
    else
    {
        imageline($image,$posx1,$posy1,$posx1+89,$posy1,$black);
        imageline($image,$posx1+89,$posy1,$posx1+89,$posy2,$black);
        imageline($image,$posx1+89,$posy2,$posx2,$posy2,$black);
    }
    imagecolordeallocate($black);
}
于 2012-10-18T03:49:01.990 に答える
0

OPはこちら。私は自分の問題を理解したか、少なくとも回避しました。画像にたくさんの線を描いていましたが、コードがそれらの点を取得する方法で多くの繰り返しが作成されたため、メモリの問題であると思われます. 繰り返しを取り除いてすべてのポイントを統合したところ、問題なく動作するようになりました。助けようとした人に感謝します。

于 2012-10-18T04:19:08.967 に答える