[PHP] Image uit database resizen

Pagina: 1
Acties:

  • Mini-me
  • Registratie: November 1999
  • Niet online
In mijn database heb ik plaatjes opgeslagen (jpg, gif en png). Om plaatjes te kunnen resizen, gebruik ik de volgende functie:
PHP:
1
<?$id = $_GET["id"];if($_GET["id"]){    include("dbase.inc.php");    $result = mysql_query("SELECT * FROM fotos WHERE id=" . $_GET["id"]);    $aantal = mysql_num_rows($result);    if( $aantal == 1){        $res = mysql_fetch_object($result);        $type = $res->filetype;        if ($type == "image/gif"){            header("Content-type: image/gif");            $src_img = ImageCreateFromGif($res->bin_data);        }        else if($type == "image/jpeg" || $type == "image/pjpeg"){            header("Content-type: $type");            $src_img = ImageCreateFromJpeg($res->bin_data);                    }        else if($type == "image/png"){            header("Content-type: $type");            $src_img = ImageCreateFromJpeg($res->bin_data);        }        $dst_img = ImageCreate($_GET["x"],$_GET["y"]);        ImageCopyResized($dst_img,$src_img,0,0,0,0,$_GET["x"],$_GET["y"],ImageSX($src_img),ImageSY($src_img));        ImagePng($dst_img);        ImageDestroy($dst_img);    }}?>

Ik krijg echter steeds een error:
<br />
<b>Warning</b>: imagecreatefromjpeg: Unable to open 'ÿØÿà' for reading in <b>/path/van/dit/script.php</b> on line <b>16</b><br />
Ditzelfde probleem heb ik als ik een png plaatje wil resizen. Hoe krijg ik ImageCreateFrom(Jpeg|Png|Gif) zover dat ze de binary wel accepteren als plaatje?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

op [url="http://www.php.net/manual/en/function.imagecreatefromjpeg.php"]php.net[/url] kan je het volgende lezen over je ImageCreatefromjpeg functie:
resource imagecreatefromjpeg ( string filename)
binary != filename

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 29-08 14:29

Aaargh!

Bow for me for I am prutser

probeer imagecreatefromstring

Those who do not understand Unix are condemned to reinvent it, poorly.


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
edit:

Vorige antwoord sloeg de plank enigszins mis :) De herkansing daarvan ook :o Teveel gecode vandaag.

ImageCreateFromString is wat je zoekt idd.

Maar je hebt dit nog staan op een paar plaatsen:
[code]header("Content-type: $type");[/code]
Dat klopt natuurlijk niet, aangezien je altijd een PNG naar de browser stuurt met ImagePng($dst_img);

  • Aaargh!
  • Registratie: Januari 2000
  • Laatst online: 29-08 14:29

Aaargh!

Bow for me for I am prutser

Op zaterdag 20 juli 2002 23:05 schreef Nexxennium het volgende:
edit:

Vorige antwoord sloeg de plank enigszins mis :) Herkansing:

Als je het zo doet, zul je eerst het plaatje uit de DB op je HD moeten zetten als temp file. Dan kun je met ImageCreateFromJpeg en dan de boel inlezen, zoals gezegd. Daarna de temp-file wissen.
Waarom zou je 'm eerst naar schijf schrijven en daarna weer inlezen, beetje zinloos he.

Those who do not understand Unix are condemned to reinvent it, poorly.


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Op zaterdag 20 juli 2002 23:20 schreef Aaargh! het volgende:

[..]

Waarom zou je 'm eerst naar schijf schrijven en daarna weer inlezen, beetje zinloos he.
Helemaal gelijk, ik zit me hier een behoorlijke portie uit mn nek te zwammen :D

Inmiddels klopt het wel geloof ik :)

  • Mini-me
  • Registratie: November 1999
  • Niet online
Ik heb nu deze code:
PHP:
1
&lt;?$id = $_GET[&quot;id&quot;];if($_GET[&quot;id&quot;]){    include(&quot;dbase.inc.php&quot;);    $result = mysql_query(&quot;SELECT bin_data FROM fotos WHERE id=&quot; . $_GET[&quot;id&quot;]);    $aantal = mysql_num_rows($result);    if( $aantal == 1){        $res = mysql_fetch_object($result);        $src_img = ImageCreateFromString($res-&gt;bin_data);        $dst_img = ImageCreate($_GET[&quot;x&quot;],$_GET[&quot;y&quot;]);        ImageCopyResized($dst_img,$src_img,0,0,0,0,$_GET[&quot;x&quot;],$_GET[&quot;y&quot;],            ImageSX($src_img),ImageSY($src_img));        header(&quot;Content-type: image/png&quot;);        ImagePng($dst_img);        ImageDestroy($dst_img);    }}?&gt;

Dit werkt inderdaad goed voor jpg's. Alleen als ik een png plaatje ga resizen, dan lijkt het wel alsof de output 16-bits kleuren zijn :?
Wat gaat er dan fout?

  • budi
  • Registratie: Januari 2000
  • Laatst online: 01-09 17:53
Zou dat met de versie van je GD library te maken kunnen hebben? Dat heb ik een tijdje terug ook gehad. Ik geloof dat versie 1.4 alleen 16 bits ondersteunt en 2.0 pas 24 bits aankan?

MY Systemconfiguration: 10fingers@5chars/s; 2legs@5km/h; 1mouth@14k4; 2ears@18Khz; 2eyes@-6&-7


  • Mini-me
  • Registratie: November 1999
  • Niet online
Dat zou jammer zijn. Ik werk met GD1 (versie 1.8.4). Heeft dit puur te maken met outputten van png? Zoja, dan maak ik er wel jpg van..

Het valt me trouwens tegen hoe groot de plaatjes nog zijn: een plaatje van 200x150 is gemiddeld nog zo'n 12 kb groot.. kan dit niet kleiner?

Verwijderd

jpeg kan kleiner en dan kan je zelfs nog de 'level' instellen.

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Pas vanaf GD lib 2.0 wordt true colour ondersteund. Dus of je nou jpeg of png gebruikt, je kunt het beste met de GD lib 2.0.1 werken, zoals die bij de nieuwere PHP versies zit.

De keuze tussen jpeg en png hangt vooral af van het soort plaatje. Als het screenshots zijn, of lineart dan is PNG de enige juiste keuze. Zijn het foto's, of photo-like afbeeldingen, ga dan voor jpeg.
Pagina: 1