PNG és GIF képnél miért nem marad meg az átlátszó háttér?
Sziasztok!
Egy általam írt program modul, melynek célja a képtípusát felismeri, majd egy előre megadott érték alapján arányosan méretezi és menti.
De a problémám a következő vele.
PNG és gif képeknél ahol nincs háttér fogja és fekete hátteret fest neki ahol átlátszónak kellene lennie mentés és méretezés után.
De miért?
Íme a kód.:
<?php
function meretezes($szelesseg,$magassag,$kep_eleres){
$filename = $kep_eleres;
list($width, $height) = @getimagesize($filename);
//$szelesseg=640;
//$magassag=480;
$kep_meret=@getimagesize($filename);
while($kep_meret[0] > $szelesseg OR $kep_meret[1] > $magassag){
$kep_meret[0]=($kep_meret[0] * 0.99);
$kep_meret[1]=($kep_meret[1] * 0.99);
}
$newwidth=ceil($kep_meret[0]);
$newheight=ceil($kep_meret[1]);
$image_p = @imagecreatetruecolor($newwidth, $newheight);
$kit0=explode(".",$filename);
switch (strtolower($kit0[count($kit0)-1]))
{
case 'gif':
$image = imagecreatefromgif($filename);
// print("gif");
break;
case 'jpg':
//print("jpg<br/>");
$image = @imagecreatefromjpeg($filename);
break;
case 'jpeg':
//print("jpeg<br/>");
$image = imagecreatefromjpeg($filename);
break;
case 'png':
// print("png<br/>");
$image = imagecreatefrompng($filename);
break;
}
/* print_r($image);
print("<br/>".$newwidth);
print("<br/>".$newheight);
print("<br/>".$width);
print("<br/>".$height); */
@imagecopyresampled($image_p, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
switch (strtolower($kit0[count($kit0)-1]))
{
case 'gif':
@imagegif($image_p,$filename);
break;
case 'jpg':
@imagejpeg($image_p,$filename);
break;
case 'jpeg':
imagejpeg($image_p,$filename);
break;
case 'png':
@imagepng($image_p,$filename);
break;
}
}
?>
Istenem, az előző válaszolók egyszerűen túl hülyék ahhoz, hogy valódiak legyenek.
Legelső találat:
mivel egy képen teljes fekete szinte sosincs, ha pl. fotóról van szó, ezért [link] -itt a blacket állítsd át transparentre, miután legenerálta.
Első a $filename, második, a TRUE legyen.
Célszerű a mime típust is ellenőrizni, nem csak a kiterjesztést.
Még az imagecopyresampled előtt gif és png képek esetén add ki a következő parancsokat, hogy megtartsd az átlátszóságot:
imagecolortransparent($image_p, imagecolorallocatealpha($image_p, 0, 0, 0, 127));
imagealphablending($image_p, false);
imagesavealpha($image_p, true);
Viszont a gif képnél figyelj, mert az nem lehet truecolor, ahhoz a célkép előállításához az imagecreate() functiont használd!
Jó ha utánanézel a fenti parancsoknak, elég trükkösek.
Sok sikert!
Köszönöm szépen a segítségeteket!
Lesz miből táplálkozni legalább!
Ha elakadok úgy is kérdezek :)
Egyrészt a kép (fájl) feltöltésekor a $_FILES global-ba bekerül a fájl típusa ($_FILES['fileid']['type']), amit ellenőrizhetsz.
Másrészt a getimagesize függvény is lekéri a kép típusát (2 index a visszaadott tömbben).
Ezek megbízhatóbban adják vissza a kép tipusát, mint a kiterjesztés string-vizsgálata. Annál is inkább, mivel többnyire a jpg lehet jpeg kiterjesztésű is.
Nagyon szépen köszönöm a segítségeteket!
Sikerült megoldanom! Mind a PNG re mint a GIF re is! :)
Átméretezés után is megmaradt az áttetszőség.
// új kép legenerálása
$ujkep = imagecreatetruecolor ($new_width, $new_height);
// Kép generálása
switch ($type) // A kép formátumától függően más-más függvénnyel dolgozzuk fel a képet
{
case 1:
$kep = imagecreatefromgif ($kepfajl);
imagecolortransparent($ujkep, imagecolorallocatealpha($ujkep, 0, 0, 0, 127));
imagealphablending($ujkep, false);
imagesavealpha($ujkep, true);
break;
case 2:
$kep = imagecreatefromjpeg ($kepfajl);
break;
case 3:
$kep = imagecreatefrompng ($kepfajl);
imagealphablending($ujkep, false);
imagesavealpha($ujkep, true);
$transparent = imagecolorallocatealpha($ujkep, 255, 255, 255, 127);
imagefilledrectangle($ujkep, 0, 0, $new_width, $new_height, $transparent);
break;
}
imagecopyresampled ($ujkep, $kep, 0, 0, 0, 0, $new_width, $new_height, $width, $height); // A lényeg - most generáljuk az új képet
// Kép generálása
switch ($type) // A kép formátumától függően más-más függvénnyel dolgozzuk fel a képet
{
case 1:
imagegif($ujkep, $kepfajl, 100);
imagedestroy($ujkep);
break;
case 2:
imagejpeg($ujkep, $kepfajl, 100);
imagedestroy($ujkep);
break;
case 3:
imagepng($ujkep, $kepfajl, 9);
imagedestroy($ujkep);
break;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!