Avatar billede seekasr Nybegynder
23. februar 2004 - 17:27 Der er 11 kommentarer og
1 løsning

GD-lib ændrer transparant bg til sort bg

Hello

Når jeg ændrer størrelsen på et png-billede med GD-lib bliver baggrunden pludselig ændret fra transparant til sort. Jeg aner ikke hvorfor.

Hvad kan det mon skyldes?

Vh
seek

Før GD-lib: http://www.rareye.com/sites/aho/img/ul/20.png
Efter GD-lib: http://www.rareye.com/sites/aho/img/img.php?id=20

Kode:
<?php
$i = imagecreatefrompng($src);
if(imageSX($i) <= $iw) imagepng($i);
else {
    $i2 = imagecreatetruecolor($iw,($iw*(imagesy($i)/imagesx($i)))+1);
    imagecopyresampled($i2,$i,0,0,0,0,$iw,$iw*(imagesy($i)/imagesx($i))+1,imagesx($i),imagesy($i));
    $src = header("Content-type: image/png");
    $src .= imagepng($i2);
}
echo $src;
imagedestroy($src);
?>
Avatar billede pchris Nybegynder
24. februar 2004 - 11:02 #1
Ja, imagecreatetruecolor funktionen skaber et sort billede, se http://dk2.php.net/manual/en/function.imagecreatetruecolor.php.
Så kopierer du dit (resizede) png billede, men den transparente del af png billedet bliver ikke kopieret - det skal det jo ikke for det er jo netop transparent.
Resultatet bliver netop som de skriver.

Der er sikkert en nemmere måde at løse dette på, men jeg kan lige nu kun komme i tanke om:
1. Få fat i den transparente farve fra png-billedet: $transp = imagecolortransparent($i)
2. Sæt den transparente farve i det nye billede: imagecolortransparent($i2, $transp)
3. Fyld det nye billede med den transparente farve: imagefilledrectangle($i2, ..., $transp )

Hvis du gør dette lige efter din imagecreatetruecolor så tror jeg det virker.
Jeg tror også at der er en nemmere løsning, men det kan jeg ikke komme på lige nu...

Den der imagedestroy du har til sidst, den mener du ikke. Du mener nok mere imagedestroy( $i ).
Og så tror jeg også at du vil have en imagedestroy( $i2 ) sidst i din else-del.
Avatar billede seekasr Nybegynder
24. februar 2004 - 11:51 #2
Ohh - jeg må have læst 'black' som 'blanck'.

Men tak for svaret. Det virker desværre ikke, resultatet bliver ret mærkeligt: http://rareye.com/sites/aho/img/img.php?id=20&iw=150

Hvis jeg sætter dine linjer efter imagecopyresampled() virker det, forstået sådan, at billedet bliver overskrevet med en transparant farve. Men den vil ikke rigtigt tegne det ind før resamplingen. Kan du se hvad der er galt?

/seek

$ih = ($iw*(imagesy($image)/imagesx($image)))+1;
$image_new = imagecreatetruecolor($iw,$ih);
$transp = imagecolortransparent($image);
imagecolortransparent($image_new, $transp);
imagefilledrectangle($image_new,0,0,$iw,$ih,$transp);
imagecopyresampled($image_new,$image,0,0,0,0,$iw,$ih,imagesx($image),imagesy($image));
// Outputting and removing image
header("Content-type: image/png");
imagepng($image_new);
imagedestroy($image_new);
Avatar billede pchris Nybegynder
24. februar 2004 - 12:53 #3
Hmmm, måske skulle man bytte om på 2 og 3.
Det har jo ikke meget formål at fylde med den farve der er transparent :-)
Avatar billede seekasr Nybegynder
24. februar 2004 - 16:11 #4
Går ud fra du her mener pkt. 2 og 3 i dit svar. Det har jeg prøvet, og der er ingen forskel.

Synes ellers det gav god nok mening at overskrive billedet med gennemsigtighed, men det virker altså ikke rigtigt.

Nogle idéer?

/seek
Avatar billede pchris Nybegynder
25. februar 2004 - 17:06 #5
Nå, nu har jeg prøvet det på en lidt gammel GD-lib (2.0.15)...
Hvilken version bruger du?

Det her det virker ret godt. Der er kun antydningen af en sort kant yderst...

Uden de tre linier jeg foreslog får jeg også en sort baggrund.
Rækkefølgen af linie 2 og 3 i mit forslag ser ud til at være underordnet.

<?php
$image = $i = imagecreatefrompng( "20.png" );
$iw = 80;
$ih = ($iw*(imagesy($image)/imagesx($image)))+1;
$image_new = imagecreatetruecolor($iw,$ih);
$transp = imagecolortransparent($image);
imagecolortransparent($image_new, $transp);
imagefilledrectangle($image_new,0,0,$iw,$ih,$transp);
imagecopyresampled($image_new,$image,0,0,0,0,$iw,$ih,imagesx($image),imagesy($image));
// Outputting and removing image
header("Content-type: image/png");
imagepng($image_new);
imagedestroy($image_new);
imagedestroy($image);
?>
Avatar billede seekasr Nybegynder
25. februar 2004 - 20:20 #6
Ja, rækkefølgen er underordnet. Det står der også i manualen.

Den kode du har lavet der er da identisk med min egen? Eller er der noget jeg ikke har set?
Avatar billede pchris Nybegynder
26. februar 2004 - 08:40 #7
Nej, den svarer vist til din, defor spørger jeg hvilken GD-lib version du bruger.
Der må jo være en forskel et eller andet sted.
Avatar billede seekasr Nybegynder
27. februar 2004 - 16:14 #8
Wups sorry, det overså jeg. :)

Jeg kører ver 2.0.20-1
Avatar billede pchris Nybegynder
01. marts 2004 - 16:07 #9
Underligt at det skulle være gået i stykker mellem 2.0.15 og 2.0.20.
Nå, men jeg kan nok ikke få mit webhotel til at opgradere til 2.0.20 for at teste forskellen, så jeg må nok opgive at hjælpe.
Avatar billede seekasr Nybegynder
01. marts 2004 - 16:11 #10
Men du har jo rent faktisk svaret på det jeg spurgte om, så jeg tror jeg vil oprette et nyt spørgsmål med selve problemet formuleret. Der må være andre end mig der har brugt gdlib på transparente billeder.

Hvis du lige opretter et svar er der point. Og tak for hjælpen!

/seek
Avatar billede seekasr Nybegynder
01. marts 2004 - 16:24 #11
Avatar billede seekasr Nybegynder
17. marts 2004 - 15:39 #12
Ok så...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester