DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Sva početnička pitanja (http://www.devprotalk.com/forumdisplay.php?f=40)
-   -   Smanjenje slike u letu (valjda se tako kaze) (http://www.devprotalk.com/showthread.php?t=7557)

martinluter 03. 06. 2009. 19:21

Smanjenje slike u letu (valjda se tako kaze)
 
Imam jednu skriptu koja pozivom slike preko neke strane sajta umanjuje sliku na zeljene dimenzije, u letu.
Znaci slika se postavi u originalu na serveru i onda je preko ove skripte umanjuje na stranama sajta na zeljenu velicinu.
Problem je sto ista scripta, kod istog hosting provajdera, iste slike, na jednom mestu radi u potpunosti, a na drugom polovicno. I na jednom i na drugom mestu imam slike koje su jako velike od 2 do 8 Mb.
Na jednom mestu, ista skripta, umanjuje sve slike bez obzira na velicinu, dok na drugom mestu umanjuje samo manje slike dok ove velike nece.
Ono sto pitam vas je, da li se mogu na ovaj nacin (u letu) umanjivati ovako velike slike 8 Mb i da li je to ok?
I ako postoji neko objasnjenje, zasto na jednom domenu radi a na drugom ne, a karakteristike kupljenog hostinga su potpuno iste?

bOkIcA 03. 06. 2009. 20:09

Pretpostavljam da je u pitanju "memory limit".
Proveri sa phpinfo koliki je limit na jednom serveru a koliki na drugom.

Korekciju ako je dozvoljeno i ako je to u pitanju probas da uradis sa:
PHP kôd:

ini_set("memory_limit","32M"); 


bluesman 03. 06. 2009. 20:26

Nisi napisao kou tehnologiju koristiš. Da li GD library ili neki tool tipa imagamagick. Ako imaš velike fotke, ne preporučujem GD.

mangia 03. 06. 2009. 20:40

.... Facebook sve fotke cuva u 4 razlicite velicine... Tako da imaš na umu činjenicu da to može stvoriti određeni overhead ako bude previše posla za skriptu...

bluesman 03. 06. 2009. 20:50

^ ti si danas šizno ko ja ono pre neki dan? :) Nisi pogodio ni jednu temu :D Kakve veze ima facebook i 4 slike sa ovim?

razno 03. 06. 2009. 20:50

Deluje na GD. Povecace memory limita ce da radi dokle imas ram na serveru. GD svaki piksel cuva u 4 bajta pa ti vidi koliko ti treba za slike 2000x2000 ;)
Tranjnije i bolje resenje je da predjes na imagemagick

Dušan Dželebdžić 03. 06. 2009. 21:08

Citat:

Originalno napisao bluesman (Napišite 70131)
^ ti si danas šizno ko ja ono pre neki dan? :) Nisi pogodio ni jednu temu :D Kakve veze ima facebook i 4 slike sa ovim?

Poenta poruke je verovatno to da je mnogo bolje jednom umanjiti sliku na sve dimenzije koje koristiš i tako sačuvaš na disk, nego da cimaš GD svaki put kada prikazuješ sliku.

martinluter 03. 06. 2009. 21:54

Prvo hvala svima na odgovorima!
@bokica, moguce je da je problem u tome sto si ti naveo. Proverio sam phpinfo u oba slucaja i rezultat je da u prvom slucaju gde ne radi ova scripta memory_limit je 64M, a u slucaju gde radi 200M.
E sad nisam sigurann 100% da je do toga, posto si ti naveo da probam pomocu "ini_set("memory_limit","32M"); " gde si naveo da probam sa 32M, a ono je vec setovano na 64M. Probao sam da podignem na 100, pomocu ove funkcije ali nije htelo.
Da li je trenutnih 64M dovoljno za slike do 10Mb?

@blusheman, ne znam ti ja razliku izmedju imagamagick, GD tako da ne znam o cemu se radi u mom slucaju.

Ukoliko je velika posecenost sajta npr. da li bi ova scripta izazvala probleme, odnosno izazvala opterecenje memorije, pri cemu bi se znatno usporilo ucitavanje sajta?
Vidim da je neko predlozio da je bolje cuvati slike u dve velicine, koliko se vas slaze sa tim, posto je nekad potrebna manja slika velicine npr. 120x100px, a nekad veca ili manja?

evo dela scripte za JPG slike:

PHP kôd:

$dst_width  30;
$dst_height 30;
$ext strrchr($pic,'.');
if(
$ext==".jpg"){

header ("Content-type: image/jpeg");
$src imagecreatefromjpeg($pic);

if (!(
$dst = @imagecreatetruecolor($dst_width,$dst_height)))
{
    
$dst imagecreate($dst_width,$dst_height);    
}
imagecopyresampled($dst,$src,0,0,0,0,$dst_width,$dst_height,$src_width,$src_height);
imagejpeg($dst,'',$kvalitet);
imagedestroy($dst);
imagedestroy($src);



bluesman 03. 06. 2009. 22:18

Ovo sto ti radis je skoro pa krivicno delo :D

Šalim se... nisam te ja odmah razumeo da za svaki prikaz ti radiš resize. Nemoj to nikako da radiš, kada već imaš tu funkciju, stavi da se posle uploada radi to i čuva u file... bolje da čuvaš i 10 veličina slika pa da prikazuješ kako ti šta treba, nego da ovo radiš.

mangia 03. 06. 2009. 23:08

Upravo je to pisac htio reći.... :)

bluesman 03. 06. 2009. 23:11

Izvinjavam se ali ja ga stvarno nisam tako shvatio, možda zato što nisam očekivao da neko to radi. Izvinjavam se sa šlagom i jagodom. My bad :)

bOkIcA 03. 06. 2009. 23:14

I ja kasnije ukapirah sta znaci "u letu". :)

martinluter 03. 06. 2009. 23:27

Ok, shvatio sam da je bolje cuvati, vise slika nego raditi ovo in "fly".
Cudi me da se niste sreli stim izrazom kod ovih scripti ili sam ja nesto umislio?
Preuzeo strucnjak (ja) ovu scriptu od jednog drugog strucnjaka koji ju je koristio za sajtove, kad ono nije bilo Ok ovo raditi. Kazu da je cak kaznjivo :).
Ipak hvala svima!

bluesman 03. 06. 2009. 23:41

U mom "komšiluku" izraz "resize on the fly" znači da radiš resize odmah posle upload i čuvaš takvu smanjenu sliku na hdd, a ne da radiš resize svaki put kada prikažeš sliku. Manje je zlo čak i da radiš resize u HTML-u preko width i height atributa za img tag.

A tog stručnjaka pozdravi i kaži mu da proba da uradi to na nekom live sajtu koji je vidljiviji od localhost i ima bar 100 poseta dnevno, pa neka nam onda ispiča tužnu priču kako mu je hosting provajder dao crveni karton :)

"Ipak, hvala svima" mi zvuči kao da si nezadovoljan savetima... ono kao ... hvala na trudu, ali mnogo s...te?

martinluter 04. 06. 2009. 00:29

Zahvalnost je zaista bila od srca, mislim iskrena. E sad ova rec "Ipak", moram da priznam da je ugrozila smisao iskrenosti, al evo povlacim tu rec. Saveti su zaista bili korisni.

Sto se tice ovog programera, prenecu mu pozdrave. Normalno svako uci dok je ziv, pa ce tako i on. Nazvao sam ga "profesionalac" jer poznaje mnogo vise PHP od mene, ali je i on daleko od nekog savrsenstva.
JOs jednom hvala!
Pozdrav!

bluesman 04. 06. 2009. 01:20

ok, NHF, samo sam hteo da proverim pošto smo imali slučajeva da se ljudi polome da pomognu nekome a onda ih dotični nazove raznim imenima.

ljtruba 04. 06. 2009. 11:05

Je l ima neko neki link za dobru skriptu za smanjivanje slika u letu?

bluesman 04. 06. 2009. 11:59

Definiši "u letu" (necete me ponovo navuci) :)

ljtruba 04. 06. 2009. 16:22

Pa da pri prvom prikazu fotke, uradi smanjivanje i da je cuva.

Naime, imam slike u vestima koje su 250px uglavnom, ali ne sve, a hteo bih na naslovnoj stranici sajta, da budu 100px sirine.
Znaci jednom uradi resize i onda je cuva

Prvo pita da li file exist, pa ako ga nema, kreira thumb.

bOkIcA 04. 06. 2009. 17:06

Takvo resenje bi ti verovatno poprilicno usporilo sajt, u zavisnosti od posecenosti, jer svaka takva provera uzima "vremena".
Bolje je da programom jednom protrcis i smanjis sve slike u tu drugu velicinu.
Posle samo prikazujes.

bluesman 04. 06. 2009. 17:33

Ne znam zasto koristite file_exsits funkciju? ona jeste dosta brza, ali ako imas listing na strani gde ima recimo 50 slika, on pre svakog prikaza proverava da li postoji taj file.

Pogledajte onerror event u javascript, zasto jednostavno ne koristite nesto ovako:

<img src="nepostojecaslika.jpg" onerror="this.src='/url/do/genericke/slike.jpg' " />

Tako ce kad god nema slike da prikaze neku genericku sliku tipa "not found" ili nesto slicno. Jedino sto tako generise i 404 u apache error.log, ali to je vec druga prica.

Takodje, iako nije preporucljivo ni to, daleko je bolje raditi "nasilno" smanjivanje slika preko html atributa width="50" height="50" nego raditi svaki put thumbnail (ako vec nemas generisan thumbnail)

35-68 04. 06. 2009. 21:54

Deo koda
 
Jeste da pripada grupi Code snippets, ali pošto nije univerzalna, već za jedan konkretan slučaj, možda pomogne ...
PHP kôd:

<?php
    error_reporting
(0);
    
ob_start("ob_gzhandler");
    
header("Expires: " gmdate("D, d M Y H:i:s"time() + (60*60*24*31)) . "GMT");
    
header("Content-type: image/jpeg");

    
define("PATH"dirname(__FILE__)."/../");
    
    
$size $_GET["Size"];
    
$JPG $_GET["Cake"];
    
$cache PATH."Galerija/cache/$size/$JPG";

    if (!@
readfile($cache)) {
        
$filename PATH."Galerija/$JPG";
        
$watermark PATH."images/Watermark.png";
    
        list(
$width$height) = getimagesize($filename);
        switch (
$size) {
            case 
"1":
                
$new_width $width;
                
$new_height $height;
                break;
            case 
"2":
                
$new_width 290;
                
$new_height 200;
                break;
            default:
                
$new_width 145;
                
$new_height 100;
        }
        
$image imagecreatefromjpeg($filename);
        
$imagewatermark imagecreatefrompng($watermark);
        
imagealphablending($imagewatermarkTRUE);
        
imagecopy($image$imagewatermark82464800$width$height);
        
        
$image_p imagecreatetruecolor($new_width$new_height);
        
imagecopyresampled($image_p$image0000$new_width$new_height$width$height);
        
imagejpeg($image_p$cache);
        
imagedestroy($image);
        
imagedestroy($imagewatermark);
        
imagedestroy($image_p);
        
readfile($cache);
    }
    
ob_flush();
?>

Takva je kakva je i radi, kome se ne sviđa:1023:


Vreme je GMT +2. Trenutno vreme je 00:32.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.