Gå til innhold

Bildefunksjon vil ikke samarbeide


Anbefalte innlegg

Hei igjen!

 

I mitt lille CMS-sysem har jeg mulighet for bilder. For at disse skal være av lik størrelse har jeg funnet en funksjon på PHP.net som jeg har blitt riktig glad i. Den behandler bildene på en måte som gjør at selv små thumbnails viser riktig innhold. Rett og slett en god funksjon synes jeg.

 

Men vil den funke i mitt system? Selvsagt ikke...

Dog har den fungert av og til. Jeg har prøvd meg fram og tilbake og her om dagen trodde jeg den satt, før den plutselig ble uvenner igjen.

 

Har nå byttet til et nytt filopplastings-script som fungerer bra.

Klikk for å se/fjerne innholdet nedenfor
if (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") && ($_FILES["file"]["size"] < 200000000)) {
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
} else {
echo "Opplasting vellykket!";
 if (file_exists("artbilder/" . $_FILES["file"]["name"])) {
 echo $_FILES["file"]["name"] . " finnes fra før og ble ikke lastet opp. ";
 } else {
 $filnavn = $_FILES["file"]["name"];
 $filendelse = explode(".", $filnavn);
 move_uploaded_file($_FILES["file"]["tmp_name"], "artbilder/" . $id . "." . $filendelse[1]);
 }
}
} else {
echo "Filen er ikke godkjent.";
}

 

Og her er altså bildefunksjonen:

Klikk for å se/fjerne innholdet nedenfor
function makeIcons_MergeCenter($src, $dst, $dstx, $dsty){

//$src = original image location
//$dst = destination image location
//$dstx = user defined width of image
//$dsty = user defined height of image

$allowedExtensions = 'jpg jpeg gif png';

$name = explode(".", $src);
$currentExtensions = $name[count($name)-1];
$extensions = explode(" ", $allowedExtensions);

for($i=0; count($extensions)>$i; $i=$i+1){
if($extensions[$i]==$currentExtensions)
{ $extensionOK=1;
$fileExtension=$extensions[$i];
break; }
}

if($extensionOK){

$size = getImageSize($src);
$width = $size[0];
$height = $size[1];

if($width >= $dstx AND $height >= $dsty){

$proportion_X = $width / $dstx;
$proportion_Y = $height / $dsty;

if($proportion_X > $proportion_Y ){
$proportion = $proportion_Y;
}else{
$proportion = $proportion_X;
}
$target['width'] = $dstx * $proportion;
$target['height'] = $dsty * $proportion;

$original['diagonal_center'] =
round(sqrt(($width*$width)+($height*$height))/2);
$target['diagonal_center'] =
round(sqrt(($target['width']*$target['width'])+
($target['height']*$target['height']))/2);

$crop = round($original['diagonal_center'] - $target['diagonal_center']);

if($proportion_X < $proportion_Y ){
$target['x'] = 0;
$target['y'] = round((($height/2)*$crop)/$target['diagonal_center']);
}else{
$target['x'] =  round((($width/2)*$crop)/$target['diagonal_center']);
$target['y'] = 0;
}

if($fileExtension == "jpg" OR $fileExtension=='jpeg'){
$from = ImageCreateFromJpeg($src);
}elseif ($fileExtension == "gif"){
$from = ImageCreateFromGIF($src);
}elseif ($fileExtension == 'png'){
$from = imageCreateFromPNG($src);
}

$new = ImageCreateTrueColor ($dstx,$dsty);

imagecopyresampled ($new,  $from,  0, 0, $target['x'],
$target['y'], $dstx, $dsty, $target['width'], $target['height']);

if($fileExtension == "jpg" OR $fileExtension == 'jpeg'){
imagejpeg($new, $dst, 70);
}elseif ($fileExtension == "gif"){
imagegif($new, $dst);
}elseif ($fileExtension == 'png'){
imagepng($new, $dst);
}
}
}
}

 

Måten det blir kalt inn på ser slik ut:

echo "<br>";	
$src = "artbilder/" .$id . "." . $filendelse[1];
$dst1 = "artbilder/" .$id . "s." . $filendelse[1];
$dst2 = "artbilder/" .$id . "l." . $filendelse[1];

include "bilde.php"; // Her ligger funksjonen
if (makeIcons_MergeCenter($src, $dst1, 500, 150)) {echo "Stort bilde fikset!<br />"; } else { echo "Stort bilde failed<br />";}
if (makeIcons_MergeCenter($src, $dst2, 150, 80)) {echo "Lite bilde fikset!<br />"; } else { echo "Lite bilde failed<br />";}

 

Klarer dere dette blir jeg overlykkelig. Det er min største hodepine for tiden...

På forhånd takk!

Lenke til kommentar
Videoannonse
Annonse

Sannsynligvis er dette litt for komplekst for meg, men det hadde hjulpet veldig om du sa hva som skjer når du kjører det?

 

Hvilke feilmelinger får du når du har satt:

ini_set('error_reporting', E_ALL);

ini_set('display_errors', 1);

 

Hvordan ser outputen ut?

 

Og har du puttet inn linjer av typen echo 'Kommer til punkt 1'; For å sjekke om skriptet faktisk kjører akkurat den løypa du vil det skal kjøres?

Lenke til kommentar

Jeg satt på disse to errpr-reporting linjene nå og fikk forsåvidt noen feilmeldinger, men det så ut til å være bagteller som i hvert fall ikke hadde noe med bildefunksjonen å gjøre.

 

Og ja, jeg har en del sånn echo-outputs som sjekker at stringene ser ut som de skal etc. I tillegg til det dere ser i scriptet "if(funksjon){echo..."

 

Så den kjører løypa den skal ja. Det er jeg ganske sikker på.

 

Dere kan jo for så vidt se selv:

Login til Ventus

Brukernavn: testbruker

Passord: testbruker

Lenke til kommentar

Jeg fikk

Takk for din artikkel!
Opplasting vellykket!
artbilder/251.jpg
artbilder/251s.jpg
artbilder/251l.jpg
Stort bilde failed
Lite bilde failed
artbilder/251.jpg

da jeg lastet opp (et stort nok) bilde.

 

Men det så ut som om det store bildet funket - det strakk seg over hele toppen på preview-sida.

Lenke til kommentar

Ja du klarte det faktisk, og hvis du ser nå så finnes også den lille versjonen.

1. Kanskje det har noe med størrelsen på bildene som lastes opp?

2. Feilsjekken "stort/lite bilde failed" ser tydeligvis ikke ut til å funke...

 

Magicgunnar: Problemet er egentlig litt usikkert. Det funker ikke ordentlig, det er er i hvert fall sikkert.

Lenke til kommentar

Her har du et lite script jeg har laget for å lage thumbs av bilder.

 

 

 

PHP
function resize_image($sti,$filnavn,$prefix,$maxbredde,$maxhoyde) {

 $fil = $sti ."/". $filnavn;

 $filtype = strtolower(strstr($fil, '.'));

 switch($filtype) {

 case '.jpeg':$source = imagecreatefromjpeg($fil);break;

 case '.jpg':$source  = imagecreatefromjpeg($fil);break;

 case '.png':$source  = imagecreatefrompng($fil); break;

 case '.gif':$source  = imagecreatefromgif($fil); break;

 default: echo("Error Invalid Image Type"); return;

 break;

 }

 $storrelse  = getimagesize($fil); 

 $bildebredde = $storrelse[0];

 $bildehoyde  = $storrelse[1];

 if($nymaxbredde < $bildebredde && $maxhoyde < $bildehoyde){

 $proposjon = min($maxbredde/$bildebredde, $maxhoyde/$bildehoyde);

 $nyhoyde  = floor($bildehoyde * $proposjon);

 $nybredde = floor($bildebredde * $proposjon);

 $mini  = imagecreatetruecolor($nybredde, $nyhoyde);

 imagecopyresized($mini, $source, 0, 0, 0, 0, $nybredde, $nyhoyde, $bildebredde, $bildehoyde);

 $im = $sti . "" . $prefix. $filnavn;

 imagejpeg($mini, $im, 90);

 imagedestroy($source);

 imagedestroy($mini);

 }

 else{

 echo "Det skjedde en feil";

 }

}

Endret av kikkazz
Lenke til kommentar

Litt vemodig å måtte gå vekk fra det opprinnelig scriptet. Har nesten forelsket meg litt i det :p

 

Men jeg prøvde å sette inn ditt og fikk denne feilen:

"Error Invalid Image Type".

 

Bildet var jo bare et vanlig sample-image fra "Mine dokumenter".

 

EDIT: Men som dere kanskje ser har noen av dere fått det til med det opprinnelige scriptet en gang, så det er mulig. Er bare det at den ikke fungerer hele tida.

Endret av kennethdammyr
Lenke til kommentar

la til en linje i koden du hadde, linje 12.

Tror det skal fungere nå :)

PHP
function makeIcons_MergeCenter($src, $dst, $dstx, $dsty){

 

//$src = original image location

//$dst = destination image location

//$dstx = user defined width of image

//$dsty = user defined height of image

 

$allowedExtensions = 'jpg jpeg gif png';

 

$name = explode(".", $src);

 

$currentExtensions = strtolower($name[count($name)-1]);

 

$extensions = explode(" ", $allowedExtensions);

 

for($i=0; count($extensions)>$i; $i=$i+1){

if($extensions[$i]==$currentExtensions)

{ $extensionOK=1;

$fileExtension=$extensions[$i];

break; }

}

 

if($extensionOK){

 

$size = getImageSize($src);

$width = $size[0];

$height = $size[1];

 

if($width >= $dstx AND $height >= $dsty){

 

$proportion_X = $width / $dstx;

$proportion_Y = $height / $dsty;

 

if($proportion_X > $proportion_Y ){

$proportion = $proportion_Y;

}else{

$proportion = $proportion_X;

}

$target['width'] = $dstx * $proportion;

$target['height'] = $dsty * $proportion;

 

$original['diagonal_center'] =

round(sqrt(($width*$width)+($height*$height))/2);

$target['diagonal_center'] =

round(sqrt(($target['width']*$target['width'])+

($target['height']*$target['height']))/2);

 

$crop = round($original['diagonal_center'] - $target['diagonal_center']);

 

if($proportion_X < $proportion_Y ){

$target['x'] = 0;

$target['y'] = round((($height/2)*$crop)/$target['diagonal_center']);

}else{

$target['x'] = round((($width/2)*$crop)/$target['diagonal_center']);

$target['y'] = 0;

}

 

if($fileExtension == "jpg" OR $fileExtension=='jpeg'){

$from = ImageCreateFromJpeg($src);

}elseif ($fileExtension == "gif"){

$from = ImageCreateFromGIF($src);

}elseif ($fileExtension == 'png'){

 $from = imageCreateFromPNG($src);

}

 

$new = ImageCreateTrueColor ($dstx,$dsty);

 

imagecopyresampled ($new, $from, 0, 0, $target['x'],

$target['y'], $dstx, $dsty, $target['width'], $target['height']);

 

 if($fileExtension == "jpg" OR $fileExtension == 'jpeg'){

imagejpeg($new, $dst, 70);

}elseif ($fileExtension == "gif"){

imagegif($new, $dst);

}elseif ($fileExtension == 'png'){

imagepng($new, $dst);

}

}

}

}

Lenke til kommentar

Nå tror jeg det fungerer mer... Fikk i hvert fall laget flere artikler enn før med bilder. Kan virke som det har noe med størrelser og sånn og gjøre da. Lagde en artikkel hvor bilde jeg lastet opp var nøyaktig 500x150 (størrelsen på det store bildet) og det gikk ikke.

 

Mer info:

Laster jeg opp et bilde som er mindre enn 500px jeg vil ha, så lager den ikke noen stor versjon - kun thumbnail på 150px.

Laster jeg opp et bilde som er større enn det jeg ønsker er den mer samarbeidsvillig.

Størrelse har med andre ord noe å si.

 

 

(Jeg har bedt den lage to versjoner: 500x150 og 150x80)

Lenke til kommentar

Har skrevet hele koden din på nytt og testet denne, så nå funker den :D

 

Nå fungerer det slik:

 

Du laster for eksempel opp et bilde som er:

450*352

Da blir resultatet slik:

Stort bilde: 194*150.

Lite bilde: 103*80

 

Det vil si at den endrer ikke størrelses forholdet i bildet. Som gjør at bildet ikke blir strekt ut eller krympet sammen.

 

Kan endre på koden hvis du ønsker at det skal holde nøyaktig størrelsen på rammen?

 

Du finner koden her:

http://norskwebforum.no/pastebin/8532

Endret av kikkazz
Lenke til kommentar

Hmm.. Var litt vrient å få implementert sammen med resten av siden, men jeg prøvde å bare lime det inn i en engen fil for å teste, og det fungerte forsåvidt. Men det behandler ikke bildene bra nok dessverre. Med innstillingene 500x150 / 150x80 så få jeg to ganske like bilder og begge har samme høyde/bredeforhold som originalbildet. Jeg vil ikke det. Jeg vil nemlig at den lager bilder som er brede. Selvsagt skal man kunne ha kvadratiske bilder også hvis man vil ha det, men et valg må det være.

 

Det var her den gamle funksjonen var så fin. Den klippet nemlig bildene veldig bra. Så hvis du først fikk et bilde, så var det akkurat slik du ville.

 

Vrient dette her gitt :(

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...