За последние 24 часа нас посетили 18016 программистов и 1605 роботов. Сейчас ищут 2148 программистов ...

Классы и вывод изображения

Тема в разделе "Обработка изображений средствами PHP", создана пользователем SARJ, 12 фев 2015.

  1. SARJ

    SARJ Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    4
    Симпатии:
    0
    Пытаюсь рисовать фигуры, общий класс для изображения, и подклассы для фигур

    index.php
    Код (Text):
    1. <?php
    2.     Header("Content-Type: text/html; charset=UTF-8");
    3.    
    4.     require('newclass.php');
    5.    
    6.     $drawArea = new Geometry(800, 600);
    7.  
    8.     $figura = new Triangle(15);
    9.     $figura->draw(300, 300);
    10.  
    11.     $drawArea->getImage();
    newclass.php
    Код (Text):
    1. <?php
    2.  
    3. class Geometry
    4. {
    5.     protected static $img;
    6.     protected $background_color;
    7.     protected static $white;
    8.     protected static $red;
    9.     protected static $blue;
    10.     protected $imgW;
    11.     protected $imgH;
    12.     protected static $scale = 10;
    13.  
    14.    
    15.     public function __construct($width, $height) {
    16.         $this->imgW = $width;
    17.         $this->imgH = $height;
    18.         header("Content-type: image/png");
    19.  
    20.         $this->img = imagecreate($width, $height);
    21.  
    22.         $background_color = imagecolorallocate($this->img, 255, 255, 255);
    23.         $white = imagecolorallocate($this->img, 255, 255, 255);
    24.         $red = imagecolorallocate($this->img, 255, 0, 0);
    25.         $blue = imagecolorallocate($this->img, 0, 0, 255);
    26.  
    27.         imagefill($this->img, 0, 0, $background_color);
    28.         imagecolortransparent($this->img, $white);
    29.         imagearc($this->img, 100, 100, 120, 120, 0, 360, $blue);    
    30.         imagearc($this->img, 120, 140, 120, 120, 0, 360, $blue);    
    31.     }
    32.    
    33.     public function getImage() {
    34.         imagepng($this->img);
    35.         imagedestroy($this->img);
    36.     }
    37.    
    38. }
    39.    
    40. class Triangle extends Geometry
    41. {
    42.     private $posX;
    43.     private $posY;
    44.     private $size;
    45.    
    46.     public function __construct($size) {
    47.         $this->size = parent::$scale * $size;
    48.     }
    49.    
    50.     public function draw($x, $y) {
    51.  
    52.         imagearc(parent::$img, 150, 150, 100, 100, 0, 360, $red);  
    53.     }
    54. }
    выдает ошибку
    imagearc(): supplied argument is not a valid Image resource in Z:\home\test.h\www\newclass.php on line 52

    ничего не могу понять, вроде правильно все написано... часа 4 промучился, гугл перелопатил, нигде подобный вопрос не рассматривается
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а вопрос-то какой?
     
  3. SARJ

    SARJ Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    4
    Симпатии:
    0
    выдает ошибку
    imagearc(): supplied argument is not a valid Image resource in Z:\home\test.h\www\newclass.php on line 52

    ничего не могу понять, вроде правильно все написано... часа 4 промучился, гугл перелопатил, нигде подобный вопрос не рассматривается


    вот эта ошибка возникает, как ее устранить? если строчку 52 закомментить, то никакой ошибки нет.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    imagearc на 52 строке, перепроверь первый аргумент, ты туда что-то другое передаёшь, а что должен читай в документации к этой функции.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    логично, блять. Сколько платишь за устранение?
     
  6. SARJ

    SARJ Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    4
    Симпатии:
    0
    когда просто передаю, вне классов работает все, например вот такая конструкция
    Код (Text):
    1.         header("Content-type: image/png");
    2.         $img = imagecreate(800, 600);
    3.         $background_color = imagecolorallocate($img, 255, 255, 230);
    4.         imagefill($img, 0, 0, $background_color);
    5.         $blue = imagecolorallocate($img, 0, 0, 255);
    6.         imagecolortransparent($img, $background_color);
    7.         imagearc($img, 100, 100, 120, 120, 0, 360, $blue);    
    8.         imagepng($img);
    9.         imagedestroy($img);
    Добавлено спустя 3 минуты 25 секунд:
    могу тебе купить пистолет с одним патроном. чтобы ты застрелился, блять...
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    купи себе курсы английского языка и начни уже переводить ошибки.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  9. SARJ

    SARJ Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    4
    Симпатии:
    0
    я знаю что там написано. тут проблема скорее не в функции imagearc, а в том, что надо как то по другому обращаться к переменной $img родительского класса Geometry.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    У тебя логика не правильная:

    1. ты переопределил конструктор, и у тебя во втором классе нет ничего путного в $this->img, т.к. она не заполнялась никаким содержимым, и вообще она статик, и к ней так обращаться нельзя.

    2. если ты хочешь сделать так, чтобы в скрипте существовала только одна Geometry, то тебе надо все нужные ей свойства которые должны работать в том единственном экземпляре сделать статиками, или реализовать человческий синглтон, что предпочтительнее.

    Если ты делаешь геометрию всю на статиках, то конструктор не нужен, объект создавать не нужно, нужно задать просто параметры и вызвать некий метод для создания холста.

    ну короче вот на статиках, но я бы делал синглтон и не парился. А ещё лучше так не делать рисовашку вообще наверное =)

    Код (PHP):
    1. class Geometry
    2. {
    3.   protected static $img;
    4.   protected static $background_color;
    5.   protected static $white;
    6.   protected static $red;
    7.   protected static $blue;
    8.   protected static $imgW;
    9.   protected static $imgH;
    10.   protected static $scale = 10;
    11.  
    12.  
    13.   public function __construct($width, $height) {
    14.     static::$imgW = $width;
    15.     static::$imgH = $height;
    16.     header("Content-type: image/png");
    17.  
    18.     static::$img = imagecreate($width, $height);
    19.  
    20.     static::$background_color = imagecolorallocate(static::$img, 255, 255, 255);
    21.     static::$white = imagecolorallocate(static::$img, 255, 255, 255);
    22.     static::$red = imagecolorallocate(static::$img, 255, 0, 0);
    23.     static::$blue = imagecolorallocate(static::$img, 0, 0, 255);
    24.  
    25.     imagefill(static::$img, 0, 0, static::$background_color);
    26.     imagecolortransparent(static::$img, static::$white);
    27.     imagearc(static::$img, 100, 100, 120, 120, 0, 360, static::$blue);
    28.     imagearc(static::$img, 120, 140, 120, 120, 0, 360, static::$blue);
    29.   }
    30.  
    31.   public function getImage() {
    32.     imagepng(static::$img);
    33.     imagedestroy(static::$img);
    34.   }
    35.  
    36. }
    37.  
    38. class Triangle extends Geometry
    39. {
    40.   private $size;
    41.  
    42.   public function __construct($size) {
    43.     $this->size = static::$scale * $size;
    44.   }
    45.  
    46.   public function draw($x, $y) {
    47.  
    48.     imagearc(static::$img, $x, $y, $this->size, $this->size, 0, 360, static::$red);
    49.   }
    50. }
    51.  
    52.  
    53. $drawArea = new Geometry(800, 600);
    54.  
    55. $figura = new Triangle(15);
    56.  
    57. $figura->draw(300, 300);
    58. $figura->draw(200, 100);
    59.  
    60. $drawArea->getImage();