Autor | Zpráva | ||
---|---|---|---|
Jcas Profil |
#1 · Zasláno: 24. 2. 2016, 07:26:09
Prosím o radu - vůbec tomu chování nerozumím.
Pracuji s tímto. Poprvé jsem použil while(filesize($filename)>40000) - to byl rachot(nekonečný cykl).
1. První zpracování ok., 1024*768 - 84kB To byla velká velikost, tak jsem volání funkcí zopakoval z menšími rozměry. (v koku nyní zakomentováno) Ale výsledek je divný. Oba obrázky mají (tohle zjištuji kliknutím pravým a uložením do PC) rozměr 600*x, oba obr mají 35kB, ale jeden je zobrazen zvětšen s w=1024, ale obojí zobrazení echo filesize ukazuje 84428.
$filename = $_FILES["obrazek"]["name"]; $x = 1024; $y = 1024; list($width, $height) = image_shrink_size($_FILES["obrazek"]["tmp_name"], $x, $y); if ($width && $height) { image_resize($_FILES["obrazek"]["tmp_name"], $filename, $width, $height); echo filesize($filename).'<br>'; echo '<img src="'.$filename.'" alt="" width="'.$width.'" height="'.$height.'">'; } /* if(filesize($filename)>40000) { $filename = $_FILES["obrazek"]["name"]; $x = 600; $y = 600; list($width, $height) = image_shrink_size($_FILES["obrazek"]["tmp_name"], $x, $y); if ($width && $height) { image_resize($_FILES["obrazek"]["tmp_name"], $filename, $width, $height); echo filesize($filename).'<br>'; echo '<img src="'.$filename.'" alt="" width="'.$width.'" height="'.$height.'">'; } } */ |
||
visionic Profil * |
Mozna ti tohle pomuze:
PHP <?php class Image { // tady je obrazek ulozeny var $img; var $font_face; var $font_size; var $font_color; public function __construct($a, $b=0, $bg=0) { // vytvoreni noveho obrazku if (is_numeric($a)) { $this->img = imagecreatetruecolor($a, $b); // vyplneni barevnym pozadim if ($bg != 0) imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"])); } // nacteni obrazku ze souboru else if (@imagesx($a)==false) { $info = getimagesize($a); switch ($info[2]): case "1": //GIF $this->img = imagecreatefromgif($a); break; case "2": //JPG $this->img = imagecreatefromjpeg($a); break; case "3": //PNG $this->img = imagecreatefrompng($a); break; case false: $this->img=false; endswitch; } // prevzeti obrazku z venci else $this->img=$a; } // uvolneni obrazku public function destroy() { @imagedestroy($this->img); } // ulozit/zobrazit obrazek jako jpg public function save_jpg($dest, $quality=95) { return imagejpeg($this->img,$dest,$quality); } public function out_jpg($quality=95) { header ("Content-type: image/jpeg"); imagejpeg($this->img,NULL,$quality); } // ulozit/zobrazit obrazek jako png public function save_png($dest) { return imagepng($this->img,$dest); } public function out_png() { header ("Content-type: image/png"); imagepng($this->img); } // ulozit/zobrazit obrazek jako gif public function save_gif($dest) { return imagegif($this->img,$dest); } public function out_gif() { header ("Content-type: image/gif"); imagegif($this->img); } // ziskat sirku aktualniho obrazku public function get_width() { return imagesx($this->img); } // ziskat vysku aktualniho obrazku public function get_height() { return imagesy($this->img); } // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality public function resize($width, $height, $aspect_ratio=true, $force=false) { // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou // zvetsovany if ($width>$this->get_width()&&$height>$this->get_height()&&!$force) return $this; if ($width==0) $width=$this->get_width(); if ($height==0) $height=$this->get_height(); // spocitam nove rozemry if ($aspect_ratio) { $widthRatio=$this->get_width()/$width; $heightRatio=$this->get_height()/$height; $aspectRatio = $this->get_width()/$this->get_height(); if ($widthRatio>$heightRatio) $height = $width / $aspectRatio; else $width = $height * $aspectRatio; } // zmenim velikost $img=imagecreatetruecolor($width,$height); if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false; else { $this->img = $img; return true; } } // otocit doleva public function rotate_left() { $this->img = imagerotate($this->img, 90, 0); return true; } // otocit doprava public function rotate_right() { $this->img = imagerotate($this->img, -90, 0); return true; } // pridat ramecek o barve $color (Array(r,g,b)) a tloustce $size pixelu public function border($color,$size) { $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size)); $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]); imagefill($new,0,0,$bg); if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) { $this->img = $new; return true; } else return false; } // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na // souradnicich $x, $y a rozmerech $width, $height public function crop($x, $y, $width, $height) { $copy=imagecreatetruecolor($width,$height); if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) { $this->img=$copy; return true; } return false; } // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast public function crop_to_ratio($dest_ratio=0, $offset=0.5) { if ($dest_ratio==0) $dest_ratio=(4/3); $width=$this->get_width(); $height=$this->get_height(); $img_ratio=$width/$height; if ($img_ratio==$dest_ratio) return $this; $widthRatio=$width/1; $heightRatio=$height/(1/$dest_ratio); if ($widthRatio>$heightRatio) { //vyska zustane puvodni $width=$dest_ratio*$height; return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height); } else { //sirka zustane puvodni $height=$width/$dest_ratio; return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height); } } // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje // stejne jako u crop_to_ratio() public function resize_crop($width, $height, $offset=0.5) { $widthRatio=$this->get_width()/$width; $heightRatio=$this->get_height()/$height; if ($widthRatio<$heightRatio) $this->resize($width, 0); else $this->resize(0, $height); return $this->crop_to_ratio(($width/$height), $offset); } // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v // bodech) a $color barva (Array(r,g,b)) public function set_font($face, $size, $color) { $this->font_face = $face; $this->font_size = $size; $this->font_color = $color; return true; } // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, // 100 - viditelne public function write($text, $x=0, $y=0, $angle=0, $alpha = 100) { // create font color $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]); // no transparency if ($alpha == 100) // write text to the original image imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // transparency else { // create temporary image $tmp = imagecreatetruecolor($this->get_width(),$this->get_height()); // choose transparent color $transparent = (Array(0,0,0) != $this->font_color) ? Array(0,0,0) : Array(255,255,255); // fill with transparent color imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // set this color to transparent imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // write text to the temporary image imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // merge original image and temporary image with alpha (pct) imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha); } } // automaticky uvolni pamet po skonceni scriptu public function __destruct() { // free memory $this->destroy(); } } ?> Priklad vyvolani tridy include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new Image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) <?php class image { // tady je obrazek ulozeny var $img; var $font_face; var $font_size; var $font_color; public function __construct($a, $b=0, $bg=0) { // vytvoreni noveho obrazku if (is_numeric($a)) { $this->img = imagecreatetruecolor($a, $b); // vyplneni barevnym pozadim if ($bg != 0) imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"])); } // nacteni obrazku ze souboru else if (@imagesx($a)==false) { $info = getimagesize($a); switch ($info[2]): case "1": //gif $this->img = imagecreatefromgif($a); break; case "2": //jpg $this->img = imagecreatefromjpeg($a); break; case "3": //png $this->img = imagecreatefrompng($a); break; case false: $this->img=false; endswitch; } // prevzeti obrazku z venci else $this->img=$a; } // uvolneni obrazku public function destroy() { @imagedestroy($this->img); } // ulozit/zobrazit obrazek jako jpg public function save_jpg($dest, $quality=95) { return imagejpeg($this->img,$dest,$quality); } public function out_jpg($quality=95) { header ("content-type: image/jpeg"); imagejpeg($this->img,null,$quality); } // ulozit/zobrazit obrazek jako png public function save_png($dest) { return imagepng($this->img,$dest); } public function out_png() { header ("content-type: image/png"); imagepng($this->img); } // ulozit/zobrazit obrazek jako gif public function save_gif($dest) { return imagegif($this->img,$dest); } public function out_gif() { header ("content-type: image/gif"); imagegif($this->img); } // ziskat sirku aktualniho obrazku public function get_width() { return imagesx($this->img); } // ziskat vysku aktualniho obrazku public function get_height() { return imagesy($this->img); } // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality public function resize($width, $height, $aspect_ratio=true, $force=false) { // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou // zvetsovany if ($width>$this->get_width()&&$height>$this->get_height()&&!$force) return $this; if ($width==0) $width=$this->get_width(); if ($height==0) $height=$this->get_height(); // spocitam nove rozemry if ($aspect_ratio) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; $aspectratio = $this->get_width()/$this->get_height(); if ($widthratio>$heightratio) $height = $width / $aspectratio; else $width = $height * $aspectratio; } // zmenim velikost $img=imagecreatetruecolor($width,$height); if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false; else { $this->img = $img; return true; } } // otocit doleva public function rotate_left() { $this->img = imagerotate($this->img, 90, 0); return true; } // otocit doprava public function rotate_right() { $this->img = imagerotate($this->img, -90, 0); return true; } // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu public function border($color,$size) { $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size)); $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]); imagefill($new,0,0,$bg); if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) { $this->img = $new; return true; } else return false; } // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na // souradnicich $x, $y a rozmerech $width, $height public function crop($x, $y, $width, $height) { $copy=imagecreatetruecolor($width,$height); if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) { $this->img=$copy; return true; } return false; } // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast public function crop_to_ratio($dest_ratio=0, $offset=0.5) { if ($dest_ratio==0) $dest_ratio=(4/3); $width=$this->get_width(); $height=$this->get_height(); $img_ratio=$width/$height; if ($img_ratio==$dest_ratio) return $this; $widthratio=$width/1; $heightratio=$height/(1/$dest_ratio); if ($widthratio>$heightratio) { //vyska zustane puvodni $width=$dest_ratio*$height; return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height); } else { //sirka zustane puvodni $height=$width/$dest_ratio; return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height); } } // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje // stejne jako u crop_to_ratio() public function resize_crop($width, $height, $offset=0.5) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; if ($widthratio<$heightratio) $this->resize($width, 0); else $this->resize(0, $height); return $this->crop_to_ratio(($width/$height), $offset); } // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v // bodech) a $color barva (array(r,g,b)) public function set_font($face, $size, $color) { $this->font_face = $face; $this->font_size = $size; $this->font_color = $color; return true; } // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, // 100 - viditelne public function write($text, $x=0, $y=0, $angle=0, $alpha = 100) { // create font color $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]); // no transparency if ($alpha == 100) // write text to the original image imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // transparency else { // create temporary image $tmp = imagecreatetruecolor($this->get_width(),$this->get_height()); // choose transparent color $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255); // fill with transparent color imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // set this color to transparent imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // write text to the temporary image imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // merge original image and temporary image with alpha (pct) imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha); } } // automaticky uvolni pamet po skonceni scriptu public function __destruct() { // free memory $this->destroy(); } } ?> priklad vyvolani tridy include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) php <?php class image { // tady je obrazek ulozeny var $img; var $font_face; var $font_size; var $font_color; public function __construct($a, $b=0, $bg=0) { // vytvoreni noveho obrazku if (is_numeric($a)) { $this->img = imagecreatetruecolor($a, $b); // vyplneni barevnym pozadim if ($bg != 0) imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"])); } // nacteni obrazku ze souboru else if (@imagesx($a)==false) { $info = getimagesize($a); switch ($info[2]): case "1": //gif $this->img = imagecreatefromgif($a); break; case "2": //jpg $this->img = imagecreatefromjpeg($a); break; case "3": //png $this->img = imagecreatefrompng($a); break; case false: $this->img=false; endswitch; } // prevzeti obrazku z venci else $this->img=$a; } // uvolneni obrazku public function destroy() { @imagedestroy($this->img); } // ulozit/zobrazit obrazek jako jpg public function save_jpg($dest, $quality=95) { return imagejpeg($this->img,$dest,$quality); } public function out_jpg($quality=95) { header ("content-type: image/jpeg"); imagejpeg($this->img,null,$quality); } // ulozit/zobrazit obrazek jako png public function save_png($dest) { return imagepng($this->img,$dest); } public function out_png() { header ("content-type: image/png"); imagepng($this->img); } // ulozit/zobrazit obrazek jako gif public function save_gif($dest) { return imagegif($this->img,$dest); } public function out_gif() { header ("content-type: image/gif"); imagegif($this->img); } // ziskat sirku aktualniho obrazku public function get_width() { return imagesx($this->img); } // ziskat vysku aktualniho obrazku public function get_height() { return imagesy($this->img); } // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality public function resize($width, $height, $aspect_ratio=true, $force=false) { // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou // zvetsovany if ($width>$this->get_width()&&$height>$this->get_height()&&!$force) return $this; if ($width==0) $width=$this->get_width(); if ($height==0) $height=$this->get_height(); // spocitam nove rozemry if ($aspect_ratio) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; $aspectratio = $this->get_width()/$this->get_height(); if ($widthratio>$heightratio) $height = $width / $aspectratio; else $width = $height * $aspectratio; } // zmenim velikost $img=imagecreatetruecolor($width,$height); if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false; else { $this->img = $img; return true; } } // otocit doleva public function rotate_left() { $this->img = imagerotate($this->img, 90, 0); return true; } // otocit doprava public function rotate_right() { $this->img = imagerotate($this->img, -90, 0); return true; } // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu public function border($color,$size) { $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size)); $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]); imagefill($new,0,0,$bg); if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) { $this->img = $new; return true; } else return false; } // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na // souradnicich $x, $y a rozmerech $width, $height public function crop($x, $y, $width, $height) { $copy=imagecreatetruecolor($width,$height); if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) { $this->img=$copy; return true; } return false; } // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast public function crop_to_ratio($dest_ratio=0, $offset=0.5) { if ($dest_ratio==0) $dest_ratio=(4/3); $width=$this->get_width(); $height=$this->get_height(); $img_ratio=$width/$height; if ($img_ratio==$dest_ratio) return $this; $widthratio=$width/1; $heightratio=$height/(1/$dest_ratio); if ($widthratio>$heightratio) { //vyska zustane puvodni $width=$dest_ratio*$height; return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height); } else { //sirka zustane puvodni $height=$width/$dest_ratio; return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height); } } // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje // stejne jako u crop_to_ratio() public function resize_crop($width, $height, $offset=0.5) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; if ($widthratio<$heightratio) $this->resize($width, 0); else $this->resize(0, $height); return $this->crop_to_ratio(($width/$height), $offset); } // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v // bodech) a $color barva (array(r,g,b)) public function set_font($face, $size, $color) { $this->font_face = $face; $this->font_size = $size; $this->font_color = $color; return true; } // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, // 100 - viditelne public function write($text, $x=0, $y=0, $angle=0, $alpha = 100) { // create font color $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]); // no transparency if ($alpha == 100) // write text to the original image imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // transparency else { // create temporary image $tmp = imagecreatetruecolor($this->get_width(),$this->get_height()); // choose transparent color $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255); // fill with transparent color imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // set this color to transparent imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // write text to the temporary image imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // merge original image and temporary image with alpha (pct) imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha); } } // automaticky uvolni pamet po skonceni scriptu public function __destruct() { // free memory $this->destroy(); } } ?> priklad vyvolani tridy include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) php <?php class image { // tady je obrazek ulozeny var $img; var $font_face; var $font_size; var $font_color; public function __construct($a, $b=0, $bg=0) { // vytvoreni noveho obrazku if (is_numeric($a)) { $this->img = imagecreatetruecolor($a, $b); // vyplneni barevnym pozadim if ($bg != 0) imagefill($this->img, 0, 0, imagecolorallocate($this->img, $bg["0"], $bg["1"], $bg["2"])); } // nacteni obrazku ze souboru else if (@imagesx($a)==false) { $info = getimagesize($a); switch ($info[2]): case "1": //gif $this->img = imagecreatefromgif($a); break; case "2": //jpg $this->img = imagecreatefromjpeg($a); break; case "3": //png $this->img = imagecreatefrompng($a); break; case false: $this->img=false; endswitch; } // prevzeti obrazku z venci else $this->img=$a; } // uvolneni obrazku public function destroy() { @imagedestroy($this->img); } // ulozit/zobrazit obrazek jako jpg public function save_jpg($dest, $quality=95) { return imagejpeg($this->img,$dest,$quality); } public function out_jpg($quality=95) { header ("content-type: image/jpeg"); imagejpeg($this->img,null,$quality); } // ulozit/zobrazit obrazek jako png public function save_png($dest) { return imagepng($this->img,$dest); } public function out_png() { header ("content-type: image/png"); imagepng($this->img); } // ulozit/zobrazit obrazek jako gif public function save_gif($dest) { return imagegif($this->img,$dest); } public function out_gif() { header ("content-type: image/gif"); imagegif($this->img); } // ziskat sirku aktualniho obrazku public function get_width() { return imagesx($this->img); } // ziskat vysku aktualniho obrazku public function get_height() { return imagesy($this->img); } // zmenit velikost obrazku na sirku $width a vysku $height, $aspect_ratio // ovlivni, zda bude zachovan pomer stran, $force=true vynuti zmenu // velikosti za kazdou cenu, i kdyby melo dojit ke ztrate kvality public function resize($width, $height, $aspect_ratio=true, $force=false) { // $force=false zaruci, ze obrazky mensi nez zadane rozliseni nebudou // zvetsovany if ($width>$this->get_width()&&$height>$this->get_height()&&!$force) return $this; if ($width==0) $width=$this->get_width(); if ($height==0) $height=$this->get_height(); // spocitam nove rozemry if ($aspect_ratio) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; $aspectratio = $this->get_width()/$this->get_height(); if ($widthratio>$heightratio) $height = $width / $aspectratio; else $width = $height * $aspectratio; } // zmenim velikost $img=imagecreatetruecolor($width,$height); if (!@imagecopyresampled($img,$this->img,0,0,0,0,$width,$height,$this->get_width(),$this->get_height())) return false; else { $this->img = $img; return true; } } // otocit doleva public function rotate_left() { $this->img = imagerotate($this->img, 90, 0); return true; } // otocit doprava public function rotate_right() { $this->img = imagerotate($this->img, -90, 0); return true; } // pridat ramecek o barve $color (array(r,g,b)) a tloustce $size pixelu public function border($color,$size) { $new = imagecreatetruecolor($this->get_width()+(2*$size),$this->get_height()+(2*$size)); $bg = imagecolorallocate($new,$color["0"],$color["1"],$color["2"]); imagefill($new,0,0,$bg); if (imagecopy($new, $this->img, $size, $size, 0, 0, $this->get_width(), $this->get_height())) { $this->img = $new; return true; } else return false; } // oriznout -> vyriznu z obrazku obdelnik s levym hornim rohem na // souradnicich $x, $y a rozmerech $width, $height public function crop($x, $y, $width, $height) { $copy=imagecreatetruecolor($width,$height); if (imagecopy($copy, $this->img, 0, 0, $x, $y, $width, $height)) { $this->img=$copy; return true; } return false; } // oriznout obrazek do pomeru stran $dest_ratio, $offset nabyva ohdnot 0 az 1 // a urcuje umisteni vyrezu, pricemz pokud obrazek s pomerem 3:4 (na vysku) // orezavame do pomeru 4:3 (na sirku), tak $offset=0 znamena, ze se vezme // horni cast puvodniho obrazku, 0.5 presne prostredni cast a 1 spodni cast public function crop_to_ratio($dest_ratio=0, $offset=0.5) { if ($dest_ratio==0) $dest_ratio=(4/3); $width=$this->get_width(); $height=$this->get_height(); $img_ratio=$width/$height; if ($img_ratio==$dest_ratio) return $this; $widthratio=$width/1; $heightratio=$height/(1/$dest_ratio); if ($widthratio>$heightratio) { //vyska zustane puvodni $width=$dest_ratio*$height; return $this->crop(($this->get_width()-$width)*$offset, 0, $width, $height); } else { //sirka zustane puvodni $height=$width/$dest_ratio; return $this->crop(0, ($this->get_height()-$height)*$offset, $width, $height); } } // zmeni velikost a orizne do rozmeru $width x $height, $offset funguje // stejne jako u crop_to_ratio() public function resize_crop($width, $height, $offset=0.5) { $widthratio=$this->get_width()/$width; $heightratio=$this->get_height()/$height; if ($widthratio<$heightratio) $this->resize($width, 0); else $this->resize(0, $height); return $this->crop_to_ratio(($width/$height), $offset); } // nastavi pismo, $face je nazev ttf souboru s pismem, $size velikost (v // bodech) a $color barva (array(r,g,b)) public function set_font($face, $size, $color) { $this->font_face = $face; $this->font_size = $size; $this->font_color = $color; return true; } // zapise text $text, s levym spodnim rohem na souradnich $x, $y, pod uhlem // $angle a s vyditelnosti $alpha (0-100, 0 - neviditelne, 50 - pruhledne, // 100 - viditelne public function write($text, $x=0, $y=0, $angle=0, $alpha = 100) { // create font color $color = imagecolorallocate($this->img, $this->font_color[0], $this->font_color[1], $this->font_color[2]); // no transparency if ($alpha == 100) // write text to the original image imagettftext($this->img, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // transparency else { // create temporary image $tmp = imagecreatetruecolor($this->get_width(),$this->get_height()); // choose transparent color $transparent = (array(0,0,0) != $this->font_color) ? array(0,0,0) : array(255,255,255); // fill with transparent color imagefill($tmp, 0, 0, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // set this color to transparent imagecolortransparent($tmp, imagecolorallocate($tmp, $transparent["0"], $transparent["1"], $transparent["2"])); // write text to the temporary image imagettftext($tmp, $this->font_size, $angle, $x, $y, $color, $this->font_face, $text); // merge original image and temporary image with alpha (pct) imagecopymerge($this->img, $tmp, 0, 0, 0, 0, $this->get_width(), $this->get_height(), $alpha); } } // automaticky uvolni pamet po skonceni scriptu public function __destruct() { // free memory $this->destroy(); } } ?> priklad vyvolani tridy include 'soubor.php'; // jsem zadas cestu k souboru, kam si zadal ten predeslej kod, ten co jsem ti jsem napsal $img = new image("složka/složka/soubor.jpg"); $img->resize(1024, 1024); $img->crop(0, 0, 1024, 768); // kdyby si ho chtel oriznout, jinak ho vyhod tenhle radek (osa-x, osa-y, šířka, výška) $img->save_jpg("složka/složka/soubor.jpg", 100); // poslední číslo určuje kvalitu (1-100) nejak se mi to tu postlo duplicitne |
||
Jcas Profil |
#3 · Zasláno: 25. 2. 2016, 06:08:21
Nějak se ti to zduplicovalo.
Dík, to vyzkouším. Ale koukám, že tu třídu voláš se souborem na disku. (já teda nevím, jak funguje ukládání, ale myslel jsem, že dokud neprovedu move_uploade , tak soubor ještě není na web uložen.
Nešlo by to - zmenšit - zkontroluj velikost a pokud je velkej - zmenšit - zkontroluj velikost....a až bude velikost v mezích, tak teprve uložit. |
||
visionic Profil * |
#4 · Zasláno: 25. 2. 2016, 11:00:25
bohužel, tenhle příklad musíš ješte dodělat. Myslel jsem, že už máš hotové řešení. Toto je pouze knihovna na zmenšování a ořezávání. Upload si řešíš sám a po uploadu vyvoláš tuto třídu. Možná tě navede JAVASCRIPT příklad s preloadem obrázku před uploadováním. Možná, že když budeš hledat, nebude jen umožněn náhled, ale i velikosti.
PHP nebo HTML echo '<form action="" method="post" enctype="multipart/form-data">'; echo '<div class="obal-obrazek">'; echo '<img src="" style="display: none;" id="obrazek">'; echo '</div>'; echo '<input class="files" type="File" name="soubor" onchange="zobrazit(this)" accept="image/jpeg">'; echo '<input class="button" name="submit" type="submit" value="Odeslat">'; echo '</form>'; JAVASCRIPT function zobrazit(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { var obrazek = document.getElementById("obrazek"); obrazek.src = e.target.result; obrazek.style.display = "block"; }; reader.readAsDataURL(input.files[0]); } } |
||
anonymníí Profil * |
#5 · Zasláno: 25. 2. 2016, 12:03:49
Jcas:
Před uložením na tebou požadovanou lokaci na disku ( move_uploaded_file ) je obrázek v dočasném uložišti. Ten můžeš pro změnu rozměru použít.
|
||
Jcas Profil |
#6 · Zasláno: 25. 2. 2016, 13:40:44
Takže jakmile odešlu formulář, soubor se uloží na nějaké dočasné uložiště (u mně na PC, nebo na serveru?).
Tento soubor pak načítám - měním rozměr. A až to je, tak ho pomocí move_uploaded_file přesunu na správné místo.
Přesně o to se snažím. Prosím vraťte se k prvnímu vláknu. Funguje to dobře, pokud to chci udělat jednou. Toto funguje: Odešlu form - změním velikost obr. a tím se změní i velikost souboru - a nahraji ho na správné místo na serveru. Toto mi nejde: Odešlu form - změním velikost obr. a tím se změní i velikost souboru - velikost je ještě velká, a proto ho ještě zmenším - a nahraji ho na správné místo na serveru. |
||
anonymníí Profil * |
#7 · Zasláno: 25. 2. 2016, 13:59:04
Jcas:
„soubor se uloží na nějaké dočasné uložiště (u mně na PC, nebo na serveru?).“ U tebe určitě ne - formulář se přeci odesílá na server... nebo k tobě do počítače? :-) |
||
Keeehi Profil |
#8 · Zasláno: 25. 2. 2016, 14:09:34
Jcas:
Nechce se mi zkoumat ten dlouhý kód, takže to tak možná děláš ale kdyby ne, tak to sem raději napíšu. Při druhém zmenšování nezmenšuj zmenšený obrázek ale zase ten původní, jen nově o něco víc. Pokud bys bral jako zdroj už zmenšené obrázky, trpěla by tím kvalita. |
||
Jcas Profil |
#9 · Zasláno: 25. 2. 2016, 14:14:58
Keeehi - Tak dlouhý kod to není-7řádků. (v prvním příspěvku) A je to vlastně kopie volání funkcí od Vrány.
A následujících 7 řádků, které jsou zakomentovány je znova naprosto to stejný - druhé a větší zmenšení. |
||
Časová prodleva: 9 let
|
0