0

我有一个复杂的 PHP 片段,它使用 ImageFilledArc 绘制一个 2 冲程发动机时序图。它在 php 5.2 下工作了多年,但我的 ISP 已将服务器升级到 PHP 5.3,并且不再呈现弧线。下图显示了发生的情况以及预期的情况。

在此处输入图像描述

测试表明该函数将 FAIL(零)返回到“样式”的所有值。实验表明 ImageFilledRectangle 按预期工作(代码插入到程序中,因此它使用相同的目标 GD 图像实例和颜色值)。

网络搜索未发现任何提及 PHP 转换文档中任何图形函数的更改,也未发现任何其他人对此函数有问题。下面提供了绘制图形的代码。调用它的代码不是,但可以通过调用完全没有 args 的页面来测试它。

<?php
/*
 * Creats a PNG image of the MBI CAD standard timing 2-stroke diagram.
 *
 * Created on Aug 10, 2007 by Ronald A Chernich, Brisbane, Australia.
 * This work is licensed under the Creative Commons
 * Attribution-Noncommercial-Share Alike 3.0 license.
 * See: http://creativecommons.org/licenses/by-nc-sa/3.0
 *
 * 2007-08-08 1.0   First version
 * 2007-08-13 1.1   Add FRV labeling adjustment
 * 2007-08-15 1.2   Add SPI capability and blow-down
 * 2007-08-15 1.2.1 Revise SPI representation to Inlet side of graph
 * 2007-08-25 1.2.2 SPI and inlet labels overlapped in some cases. Fixed.
 */

  $eo = $_GET['eo'];
  $to = $_GET['to'];
  $ic = $_GET['ic'];
  $id = $_GET['id'];
  $nm = $_GET['nm'];
  $spi = $_GET['spi'];

  // Test data for development
  if (empty($nm)) {
    $nm = 'Test';
    $eo = 108;
    $to = 123;
    $ic = 15;
    $id = 140;
  }

  $graph = new TimingDiagram($nm, $eo, $to, $ic, $id, $spi);
  $graph->render();

/**
 * Class to render image
 */
class TimingDiagram
{
    var $WIDTH = 420;
    var $HEIGHT = 420;
    var $YMARGIN = 30;
    var $XMIN = 2;
    var $YMIN = 2;

    var $BG_COLOR;
    var $IN_COLOR;
    var $TR_COLOR;
    var $EX_COLOR;
    var $LAP_COLOR;
    var $AXIS_COLOR;
    var $TITLE_COLOR;

    var $image;

    var $eo;
    var $to;
    var $ic;
    var $id;
    var $spi;
    var $arc;
    var $title;
    var $degChar;

    function TimingDiagram ($title, $eo, $to, $ic, $id, $spi)
    {
      $this->title = $title;
      $this->eo = $eo;
      $this->to = $to;
      $this->ic = $ic;
      $this->id = $id;
      $this->spi = $spi;

      $this->degChar = '°';
      $this->image = ImageCreateTruecolor($this->WIDTH, $this->HEIGHT);
      $this->InitColors();

      $this->arc_y = $this->HEIGHT / 12;

      $xmax = $this->WIDTH - (2 * $this->XMIN);
      $ymax = $this->HEIGHT - (2 * $this->YMIN);
      ImageFilledRectangle($this->image, $this->XMIN, $this->YMIN,
                           $xmax, $ymax, $this->BG_COLOR);
    }

    function initColors ()
    {
      $this->BG_COLOR = ImageColorAllocate($this->image, 255, 255, 255);
      $this->TITLE_COLOR = ImageColorAllocate($this->image, 0, 0, 120);
      $this->AXIS_COLOR = ImageColorAllocate($this->image, 200, 200, 200);

      $this->IN_COLOR = ImageColorAllocate($this->image, 180, 180, 180);
      $this->TR_COLOR = ImageColorAllocate($this->image, 120, 120, 120);
      $this->EX_COLOR = ImageColorAllocate($this->image, 80, 80, 80);
      $this->LAP_COLOR = ImageColorAllocate($this->image, 140, 140, 140);
    }

    function render ()
    {
      $x0 = $this->WIDTH  / 2;
      $y0 = $this->HEIGHT  / 2;
      $this->drawTitle($x0, $y0);
      $this->drawSPI($x0, $y0);
      $this->drawExhaust($x0, $y0);
      $this->drawInlet($x0, $y0);
      $this->drawSPI($x0, $y0);
      $this->drawTransfer($x0, $y0);
      $this->drawRot($x0, $y0);
      Header("Content-type: image/png");
      ImagePng($this->image);
      ImageDestroy($this->image);
    }

    function drawTitle ()
    {
      $st = "Timing Diagram for $this->title.";
      $fnt = 5;
      $dx = ($this->WIDTH - (ImageFontWidth($fnt) * strlen($st))) / 2;
      $dy = ($this->YMARGIN - ImageFontHeight($fnt)) / 2;
      imagestring($this->image, $fnt, $dx, $dy, $st, $this->TITLE_COLOR);
    }

    function drawSPI ($x0, $y0)
    {
      if (is_numeric($this->spi)) {
        $end = 270 - $this->spi;
        $start = 270 + $this->spi;
        $dx1 = .64 * $this->WIDTH;
        $dy1 = .64 * $this->HEIGHT;
        $dim = $this->arc_y * .75;
        $dx2 = $dx1 - $dim;
        $dy2 = $dy1 - $dim;
        ImageFilledArc($this->image, $x0, $y0, $dx1, $dy1, $end, $start,
                       $this->IN_COLOR, IMAGE_ARC_PIE);
        $res = ImageFilledArc($this->image, $x0, $y0, $dx2, $dy2, $end-1, $start+1,
                       $this->BG_COLOR, IMAGE_ARC_PIE);

        $x = $this->WIDTH * 0.1;
        $y = $this->HEIGHT * (($this->ic > 29) ? 0.3 : 0.2);
        $this->labelEvent($x, $y, "SPI ends", "ATDC", $this->spi);
        $this->labelEvent($this->WIDTH - $x, $y, "SPI starts", "ABDC",
                         (180 - $this->spi));
        // Drawing SPI will have trashed the Inlet duration label
        $fnt = 3;
        $id = (empty($this->id) ? (2 * $this->ic) : $this->id);
        $lab = sprintf('Inlet %.0f%s', $id, $this->degChar);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        $dy = ($y0 - (.22 * $this->HEIGHT) - ImageFontHeight($fnt));
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);
        $lab = sprintf('with %.0f%s', $this->spi * 2, $this->degChar);
        $dy += ImageFontHeight($fnt);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);
        $lab = 'sub-piston induction';
        $dy += ImageFontHeight($fnt);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);
      }
    }

    function drawExhaust ($x0, $y0)
    {
      if ($this->eo > 0) {
        $ex = 180 - $this->eo;
        $eo = 90 + $ex;
        $ec = 90 - $ex;
        $dx1 = .8 * $this->WIDTH;
        $dy1 = .8 * $this->HEIGHT;
        $dx2 = $dx1 - $this->arc_y;
        $dy2 = $dy1 - $this->arc_y;
        ImageFilledArc($this->image, $x0, $y0, $dx1, $dy1, $ec, $eo,
                       $this->EX_COLOR, IMAGE_ARC_PIE);
        ImageFilledArc($this->image, $x0, $y0, $dx2, $dy2, $ec-1, $eo+1,
                       $this->BG_COLOR, IMAGE_ARC_PIE);

        $fnt = 3;
        $lab = sprintf('Exhaust %.0f%s', (2 * $ex), $this->degChar);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        $dy = ($y0 + (.46 * $this->HEIGHT) - ImageFontHeight($fnt));
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);

        $x = $this->WIDTH * 0.12;
        $y = $this->HEIGHT * 0.86;
        $this->labelEvent($x, $y, "Exhaust opens", "ATDC", $this->eo);
        $this->labelEvent($this->WIDTH - $x, $y, "Exhaust closes", "ABDC",
                          180 - $this->eo);
      }
    }

    function drawTransfer ($x0, $y0)
    {
      if ($this->to > 0) {
        $tr = 180 - $this->to;
        $to = 90 + $tr;
        $tc = 90 - $tr;
        $dx1 = .7 * $this->WIDTH;
        $dy1 = .7 * $this->HEIGHT;
        $dx2 = $dx1 - $this->arc_y;
        $dy2 = $dy1 - $this->arc_y;
        ImageFilledArc($this->image, $x0, $y0, $dx1, $dy1, $tc, $to,
                       $this->TR_COLOR, IMAGE_ARC_PIE);
        ImageFilledArc($this->image, $x0, $y0, $dx2, $dy2, $tc-1, $to+1,
                       $this->BG_COLOR, IMAGE_ARC_PIE);

        // Special case where FRV inlet overlaps transfer close
        if (!empty($this->id)) {
          $io = ($this->id - $this->ic) - 90;
          if ($io > $tc) {
            ImageFilledArc($this->image, $x0, $y0, $dx1, $dy1, $tc, $io,
                           $this->LAP_COLOR, IMAGE_ARC_PIE);
            ImageFilledArc($this->image, $x0, $y0, $dx2, $dy2, $tc-1, $io+1,
                           $this->BG_COLOR, IMAGE_ARC_PIE);
          }
        }
        $fnt = 3;
        $lab = sprintf('Transfer %.0f%s', (2 * $tr), $this->degChar);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        $dy = ($y0 + (.25 * $this->HEIGHT) - ImageFontHeight($fnt));
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);

        $x = $this->WIDTH * 0.35;
        $y = $this->HEIGHT * 0.65;
        $this->labelEvent($x, $y, "Transfer opens", "ATDC", $this->to);
        $this->labelEvent($this->WIDTH - $x, $y, "Transfer closes", "ABDC",
                          180 - $this->to);
      }
    }

    function drawInlet ($x0, $y0)
    {
      if (is_numeric($this->ic)) {
        $ic = 270 - $this->ic;
        $id = (is_numeric($this->id) ? $this->id : 2 * $this->ic);
        $io = $ic + $id;
        $dx1 = .7 * $this->WIDTH;
        $dy1 = .7 * $this->HEIGHT;
        $dx2 = $dx1 - $this->arc_y;
        $dy2 = $dy1 - $this->arc_y;
        ImageFilledArc($this->image, $x0, $y0, $dx1, $dy1, $ic, $io,
                       $this->IN_COLOR, IMAGE_ARC_PIE);
        ImageFilledArc($this->image, $x0, $y0, $dx2, $dy2, $ic-2, $io+2,
                       $this->BG_COLOR, IMAGE_ARC_PIE);

        $fnt = 3;
        $id = (empty($this->id) ? (2 * $this->ic) : $this->id);
        $lab = sprintf('Inlet %.0f%s', $id, $this->degChar);
        $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
        $dy = ($y0 - (.22 * $this->HEIGHT) - ImageFontHeight($fnt));
        Imagestring($this->image, $fnt, $dx, $dy, $lab, $this->TITLE_COLOR);

        $x = $this->WIDTH * 0.13;
        $y = $this->HEIGHT * 0.2;
        $isBTDC = $this->ic < 0;
        $tag = $isBTDC ? 'BTDC' : 'ATDC';
        if ($isBTDC || ($this->ic < 30)) {
          $x = $this->WIDTH -
               ($isBTDC ? ($this->WIDTH * 0.3) : ($this->WIDTH * 0.65));
          $y = $this->HEIGHT * 0.12;
        }
        $this->labelEvent($x, $y, "Inlet closes", $tag, abs($this->ic));

        $x = $this->WIDTH * 0.13;
        $y = $this->HEIGHT * 0.2;
        if ($isBTDC || ($this->ic < 30)) {
        $x = $this->WIDTH * 0.1;
          $y = $this->HEIGHT * 0.3;
        }
        $tmp = (is_numeric($this->id)) ? ($this->id - $this->ic) : $this->ic;
        $this->labelEvent($this->WIDTH-$x, $y, "Inlet opens", "ABDC", 180-$tmp);
      }
    }

    function labelEvent ($x0, $y0, $lab1, $st2, $angle)
    {
      $fnt = 2;
      $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab1)) / 2);
      $dy = $y0 - ImageFontHeight($fnt);
      Imagestring($this->image, $fnt, $dx, $dy, $lab1, $this->TITLE_COLOR);
      $lab2 = sprintf('%.1f%s %s', $angle, $this->degChar, $st2);
      $dx = ($x0 - (ImageFontWidth($fnt) * strlen($lab2)) / 2);
      Imagestring($this->image, $fnt, $dx, $y0, $lab2, $this->TITLE_COLOR);
    }

    function drawRot ($x0, $y0)
    {
      $xtick = $this->WIDTH / 30;
      ImageLine($this->image,
                $x0 - $xtick, $y0, $x0 + $xtick, $y0,
                $this->AXIS_COLOR);
      $ytick = $this->HEIGHT / 28;
      ImageLine($this->image,
                $x0, $y0 + $ytick, $x0, $y0 - (2 * $ytick),
                $this->AXIS_COLOR);
      $xrad = $this->WIDTH / 8;
      $yrad = $this->HEIGHT / 8;
      ImageArc($this->image,
               $x0, $y0, $xrad, $yrad, 270, 180, $this->AXIS_COLOR);
      $ahx = $xrad / 8;
      $ahy = $yrad / 15;
      $dy = ($yrad / 2) - ($ahy / 2);
      $points = array(($x0 - $ahx), ($y0 - $dy),
                      ($x0 + $ahx), ($y0 - $dy - $ahy),
                      ($x0 + $ahx), ($y0 - $dy + $ahy),
                      ($x0 - $ahx), ($y0 - $dy));
      ImageFilledPolygon($this->image, $points, 4, $this->AXIS_COLOR);
      $lab = "TDC";
      $fnt = 3;
      $tx = ($x0 - (ImageFontWidth($fnt) * strlen($lab)) / 2);
      $ty = ($y0 - ( .6 * $yrad) - ImageFontHeight($fnt));
      Imagestring($this->image, $fnt, $tx, $ty, $lab, $this->TITLE_COLOR);

      if (($this->eo > 0) && ($this->to> 0) ) {
        $x = $this->WIDTH * 0.092;
        $y = $this->HEIGHT * 0.93;

        $this->labelEvent($x, $y, 'Blowdown:', '', ($this->to - $this->eo));
      }
    }

}

?>

4

1 回答 1

0

在文档(http://us2.php.net/manual/fr/function.imagefillarc.php)中,他们使用IMG_ARC_PIE而不是IMAGE_ARC_PIE

我用 PHP 5.3.8 替换后尝试,我得到了这个结果: 在此处输入图像描述

于 2012-06-12T08:25:40.487 回答