Autor Zpráva
kujeba
Profil
Dobry den,
pri pouziti knihovny IMagick mi nasledujici kod vyhodi chybu "Fatal error: Uncaught exception 'ImagickException' with message 'Safe mode restricts user to read image: "

move_uploaded_file($_FILES["photoFile"]["tmp_name"], "./tmp/".$filename);
$thumb=new Imagick("./tmp/".$filename);


PHP Version 5.2.6-3ubuntu4.1
imagick module version 2.1.1-rc1
ImageMagick version ImageMagick 6.4.5 2009-06-04 Q16 OpenMP
safe_mode = on

A safe_mode nelze vypnout.
Alphard
Profil
Hmm, teď budu zlý, ale žádná otázka, žádná odpověď :-)
Můžete se podívat na imagick, ale nevyřešilo se to. Konkrétněji nevím.
Co vlastně děláte, nestačila by vám GD knihovna?
kujeba
Profil
Alphard:
Otazka: Jak tuto chybu odstranit, aby IMagick fungoval i na zapnutem safe modu? :o)

GD knihovna by mi, bohuzel, asi nestacila. Potrebuju vstupni obrazek (original) zmensit a umistit na prostredek platna.
Napriklad: mam original o velikosti 1024x768 a potrebuju z nej dostat obrazek o velikosti 60x60 (Viz 80x80 box)

Pomoci GD knihovny dokazu pouze zemnsit obrazek, ale uz ne ho umistit do boxu a vysledek ulozit jako jeden obraz. Nebo ano? Pokud ano, poradite jak?

Diky.

P.S.: Ale stejne bych radsi vyresil ten problem s IMagick knihovnou, protoze s ImageMagickem umim pracovat, GD knihovnu bych musel studovat a ptat se tady co a jak delat :o)
Alphard
Profil
kujeba:
Potrebuju vstupni obrazek (original) zmensit a umistit na prostredek platna.
Napriklad: mam original o velikosti 1024x768 a potrebuju z nej dostat obrazek o velikosti 60x60
Není problém, tohle je jednoduché. Je to téměř stejné jako změnšování obrázku, jen se použije troška matematiky při výpočtu konkrétních souřadnic.

Pokud ano, poradite jak?
Tohle mám někde hotové. Teďka musím odejít od PC, snad si vzpomenu večer.

Ale stejne bych radsi vyresil ten problem s IMagick knihovnou, protoze s ImageMagickem umim pracovat
Nesetkal jsem se s hostingem, kde by nebyla GD, na rozdíl od IMagick, takže bych radil uvažovat o tom, že se aspoň základy naučíte.
kujeba
Profil
Alphard:
Pokud byste si vzpomel, byl bych nesmirne rad... Potrebuju to vyresit ASAP a nemam s GD vubec zadne zkusenosti, ani nemuzu nikde najit nejakou prehlednou stranku s popisem a prikladama...
AM_
Profil
Mám obavu, že problém nemusí být v imagick, ale ve špatně nastavených právech na serveru, které prostě soubor neumožní přečíst (ikdyž je to dost divné, jestli se ho zapsat podaří). Zkus si nejdřív místo řádku s new Imagick(...) dát třeba jen file_get_contents("./tmp/$filename"), abys viděl, jestli je problém v imagicku, nebo v přístupu k souboru. Ve druhém případě je jedno jestli imagick nebo GD, nepůjde ani jedno.
Alphard
Profil
Jestli má AM pravdu, tak vám to stejně nepomůže, ale máte tady tu třídu.
Vykopíroval jsem to z větší třídy a částečně dopsal, tím se i omlouvám, že to není moc objektově uhlazené. Ale když chcete pracovat s OOP, tak jsem to nechal ve třídě.

<?php
class Image
{
  public $size;  // výsledná velikost (čtverec)
  public $imgFile;  // cesta k souboru
  public $bc;  // barva pozadí, zadáno jako pole array(0-255, 0-255, 0-255)
  
  private $img;
  
  public function create()
  {
    $this->img = imagecreatetruecolor($this->size, $this->size);
    $bc = imagecolorallocate($this->img, $this->bc[0], $this->bc[1], $this->bc[2]);
    imagefill($this->img, 0, 0, $bc);
  }
  
  public function calculateSize()
  {
    list($w, $h) = getimagesize($this->imgFile);
    if ($w >= $h)
    {
      $height = round($h * $this->size / $w);
      $width = $this->size;
    }
    if ($h > $w)
    {
      $width = round($w * $this->size / $h);
      $height = $this->size;
    }
    return array($width, $height, $w, $h);
  }

  public function addImage()
  {
    $i = imagecreatefromjpeg($this->imgFile);

    list($width, $height, $w, $h) = $this->calculateSize();
    
    $kx = round(($this->size - $width) / 2);
    $ky = round(($this->size - $height) / 2);
    
    imagecopyresampled($this->img, $i, $kx, $ky, 0, 0, $width, $height, $w, $h);
  }
  
  public function getScreen()
  {
    $this->create();
    $this->addImage();
    header('Content-type: image/jpeg');
    imagejpeg($this->img);
  }
  
  public function save($dst)
  {
    $this->create();
    $this->addImage();
    imagejpeg($this->img, $dst);
  }
}

$img = new Image();
$img->size = 300;
$img->imgFile = "./img/e03.jpg";
$img->bc = array(0, 150, 150);
$img->save("maly_obrazek.jpeg");
$img->getScreen();
kujeba
Profil
AM:
Mám obavu, že problém nemusí být v imagick, ale ve špatně nastavených právech na serveru...

Tak bohuzel je to problem IMagicku... Nize uvedena trida postavena na knihovne GD funguje...

Alphard:
Jestli má AM pravdu, tak vám to stejně nepomůže, ale máte tady tu třídu.

Nemel, pomohlo. Moc. Dekuji a vrham se do studia GD knihovny, snad dokaze plne nahradit IMagick.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0