Autor Zpráva
Pepicewk
Profil *
Dobrý den,
mám problém s vlastní knihovnou pro práci s obrázky. Když chci uložit obrázek na disk, vše funguje. Pokud ale chci obrázek zobrazit v prohlížeči, obrázek se nezobrazí...
Nevíte někdo co by to mohlo způsobovat?

class Canvas {
  protected $canvas = null;
  protected $width, $height = 0;
  protected $created = false;
  
  protected $textFont = null;
  protected $textSize = 12;
  
  private $qualityPng = 0;
  private $qualityJpg = 75;
  
  
  /**
   * Create graphic canvas, class constructor
   * @param int $width canvas width
   * @param int $height canvas height
   */
  public function __construct($width, $height) {
    $c = @imagecreatetruecolor($width, $height);
    if(!$c) {$this->created = false;} else {
      $this->canvas = $c;
      $this->created = true;
      $this->width = $width;
      $this->height = $height;
      $this->color = $this->color(0, 0, 0);
    }
  }
  
  
  /**
   * Destroy graphic canvas, free alocated memory
   */
  public function __destruct() {
    imagedestroy($this->canvas);
  }
  
  
  /**
   * Return image string resource
   * @return String image resource
   */
  public final function getCanvas() {
    return $this->canvas;
  }
  
  
  /**
   * Get image width
   * @return int image width   
   */
  public final function getWidth() {
    return $this->width;
  }
  
  
  /**
   * Get image height
   * @param int image height   
   */
  public final function getHeight() {
    return $this->height;
  }
  
  
  /**
   * Output image to browser
   * @param String $type image type (png|jpg|gif)
   * @param bool $header send header to the browser
   */     
  public function createImage($type, $header = false) {
    if((bool)$header) $this->sendHeader($type);
    switch(strtolower($type)) {
      case 'png': imagepng($this->canvas); break;
      case 'jpeg':
      case 'jpg': imagejpeg($this->canvas); break;
      case 'gif': imagegif($this->canvas); break;
    }
  }
  
  
  /**
   * Save image to server
   * @param String $path URL path to the image for save image
   * @return bool true if was saved
   */
  public function saveImage($path) {    
    $type = explode('.', $path);
    $type = end($type);
    switch(strtolower($type)) {
      case 'png': {return (bool)imagepng($this->canvas, $path, $this->qualityPng); break;}
      case 'jpeg':
      case 'jpg': {return (bool)imagejpeg($this->canvas, $path, $this->qualityJpg); break;}
      case 'gif': {return (bool)imagegif($this->canvas, $path); break;}
    }
  }
peta
Profil
Ptas se na zobrazovani, ale takovy kod tam nikde neni.
Obrazek se ulozi, ale, kdyz si ho zkopirujes pres ftp a na tvem pocitaci se zobrazi? Treba nema priponu nebo tak neco, ne? Z toho kodu se neda poznat, co do class vstupuje, treba path. Chybi tez cela cast, ktera ovlada prevod nejakeho demo obrazku treba ulozenou na disku. Myslim tim, ze tam neni kod, ktery spousti saveImage.
Neni tam ani link na soubor ulozeny z toho scriptu, aby jsme se mohli podivat, jaka data to ulozilo. Ve far-manageru pres F4 (edit file).
Tori
Profil
Pepicewk:
Chybí metoda sendHeader (volaná na ř.71, ale možná jste ji vynechal jen tady). Posíláte správné hlavičky do prohlížeče?

Pokud ale chci obrázek zobrazit v prohlížeči, obrázek se nezobrazí
Zobrazí se něco jiného? Chybové hlášky by se měly někam logovat - kontroloval jste, jestli tam někde není popis nějaké chyby? Jaká je návratová hodnota imagepng a příbuzných funkcí volaných v createImage?
Pepicewk
Profil *
Metoda sendHeader je obsažena, třída obsahuje mnoho metod. Metoda pouze pošle hlavičku.
Při ukládání a stažení z FTP vše funguje. JDe pouze o vstup do prohlížeče. Funkce imagepng vrací správný řetězec...


V případě Firefoxu se oběví chybová hláška, že obrázek nelze zobrazit, že je poškozen. U ostatních prohlížečů se zobrazí náhrada za obrázek (taková ta známá ikona)
Camo
Profil
Pepicewk:
Prečo sem nedáš kód tej metódy? Keď som si doplnil metódu sendHeader(a zakometoval volanie color() v konštruktore) tak mi to fungovalo.
Pepicewk
Profil *
public function sendHeader($type) { 
    switch(strtolower($type)) { 
      case 'png': header('Content-Type: image/png'); break; 
      case 'jpeg': 
      case 'jpg': header('Content-Type: image/jpg'); break; 
      case 'gif': header('Content-Type: image/gif'); break; 
    } 
  }
Camo
Profil
Pepicewk:
Myslím, že image/jpeg by malo byť.
EDIT:
Ale funguje mi aj ten tvoj kód. Jediné čo tam mením je že zakomentujem metódu color(), lebo ju tu nemáme. Tak ukáž ešte tú. Aj keď ak to ukladá mala by byť v poriadku. Asi by si mal dať celý ten kód.
Pepicewk
Profil *
Díky, opravím na image/jpeg

kód metody color je:
public function color($red, $green, $blue) { 
    $this->color = imagecolorallocate($this->canvas, $red, $green, $blue); 
}
Camo
Profil
Pepicewk:
Neviem ako PHP reaguje na to, že máš v tej triede aj premennú color aj metódu color(). A navzájom to priraďuješ. Takže chyba je možno tam. Ešte je otázne ako potom používaš tú farbu. Nemohol by si dať niekam na internet celý ten script(cez highlight_file("tentosubor.php");)?
Tori
Profil
např. http://pastebin.com/
Kcko
Profil
Pepicewk:
Kód by měl fungovat, ukaž to komplet i s voláním, jestli si tam nevoláš nějaký jiný výstup, který by to mohl narušovat

public function color($red, $green, $blue) { 
    $this->color = imagecolorallocate($this->canvas, $red, $green, $blue); 
}

Tohle je blbost, mělo by to být pouze

1) return imagecolorallocate($this->canvas, $red, $green, $blue);
2) nebo to tak nech ale volání je potom pouze $this->color(0, 0, 0); // mšl by to být setter, setColor->()

A ještě cosi, plátno budeš mít vždy černé, při použití imagecreatetruecolor bys jej musel vyplnit pomocí imagefill

Camo:
Neviem ako PHP reaguje na to, že máš v tej triede aj premennú color aj metódu color(). A navzájom to priraďuješ.

Rozlišuj pojmy jako je členská proměnná a členská funkce (metoda), pokud o tom nic nevíš, tak si to nejdřív nastuduj, nez začneš mystifikovat.
peta
Profil
Zkus radek s hlavickou zakomentovat a nech si to cele zobrazit jako hatmatilku na obrazovku nebo to uloz do souboru. Pokud obrazek stazeny na ftp funguje, pak je obrazek ok. Pokud ten obrazek jednoduchym php kodem s tou hlavickou zobrazis, pak je to ok.
Predpokladam tedy, ze problem neni v obrazku, ale ostatnim kodu. Jedno echo navic nebo chybova hlaska, a obrazek se nezobrazi.
Druhe, co mne napada, ze tam mas html kod a predpokladas ,ze kdyz zmenis header, ze ti to samo k html kodu prida html kod obrazku. Hlavicka ale dela neco jineho.

Co treba link na ten obrazek? Ne, ze bych ti neveril, ze je obrazek ok, ale lepsi je si to zkontrolovat sam.
background-images - php soubor
Pepicewk
Profil *
zde je celý kód: http://pastebin.com/TfBDqtsq


nevím, najednou to začalo fungovat, nic jsem nezměnil - nevím tedy přoč to funguje :-(


napadá mě leda tak něco se serverem, restartovával jsem PC
peta
Profil
Mozna kesovani. Obrazky se obvykle kesuji (server i tvuj pc).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: