Problemen met uploaden van PNG images
Heb weer eens een probleempje.
Ik heb een upload functie voor images. Deze werkt voor 2/3e goed. JPG en GIF files worden prima geupload (en geresized). PNG files resulteren in een 33 byte PNG file die vervolgens niet getoond kan worden.
De code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
# ...stukje weggelaten met extensie check en move_uploaded_file...
# image aanmaken 1/4
if ($extension == 'jpg') {
$image = imagecreatefromjpeg($uploadDir.$name.'.'.$extension);
} elseif ($extension == 'gif') {
$image = imagecreatefromgif($uploadDir.$name.'.'.$extension);
} elseif ($extension == 'png') {
$image = imagecreatefrompng($uploadDir.$name.'.'.$extension);
}
# ratio's berekenen
$width = imagesx($image);
$height = imagesy($image);
if ($width < $dst_width ) {
$dst_width = $width;
}
$ratio_x = $width / $dst_width;
$dst_width = round($width / $ratio_x);
$dst_height = round($height / $ratio_x);
# image aanmaken 2/4
if (in_array($extension, array('jpg','jpeg','png'))) {
$dst_img = imagecreatetruecolor($dst_width, $dst_height);
} else {
$dst_img = imagecreate($dst_width, $dst_height);
}
# image aanmaken 3/4
$result = imagecopyresampled($dst_img, $image, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);
# image aanmaken 4/4
if ($extension == 'jpg') {
$result = imagejpeg($dst_img, $uploadDir.$name.'.'.$extension, $quality);
} elseif ($extension == 'gif') {
$result = imagegif($dst_img, $uploadDir.$name.'.'.$extension, $quality);
} elseif ($extension == 'png') {
$result = imagepng($dst_img, $uploadDir.$name.'.'.$extension, $quality);
}
# thumb chmodden
chmod($uploadDir.$name.'.'.$extension, 0755);
# image voor thumb verwijderen
imagedestroy($dst_img);
if ($result == FALSE) {
$error .= '- Image aanmaken is niet gelukt. <br />';
}
?>
# ...stukje weggelaten met extensie check en move_uploaded_file...
# image aanmaken 1/4
if ($extension == 'jpg') {
$image = imagecreatefromjpeg($uploadDir.$name.'.'.$extension);
} elseif ($extension == 'gif') {
$image = imagecreatefromgif($uploadDir.$name.'.'.$extension);
} elseif ($extension == 'png') {
$image = imagecreatefrompng($uploadDir.$name.'.'.$extension);
}
# ratio's berekenen
$width = imagesx($image);
$height = imagesy($image);
if ($width < $dst_width ) {
$dst_width = $width;
}
$ratio_x = $width / $dst_width;
$dst_width = round($width / $ratio_x);
$dst_height = round($height / $ratio_x);
# image aanmaken 2/4
if (in_array($extension, array('jpg','jpeg','png'))) {
$dst_img = imagecreatetruecolor($dst_width, $dst_height);
} else {
$dst_img = imagecreate($dst_width, $dst_height);
}
# image aanmaken 3/4
$result = imagecopyresampled($dst_img, $image, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);
# image aanmaken 4/4
if ($extension == 'jpg') {
$result = imagejpeg($dst_img, $uploadDir.$name.'.'.$extension, $quality);
} elseif ($extension == 'gif') {
$result = imagegif($dst_img, $uploadDir.$name.'.'.$extension, $quality);
} elseif ($extension == 'png') {
$result = imagepng($dst_img, $uploadDir.$name.'.'.$extension, $quality);
}
# thumb chmodden
chmod($uploadDir.$name.'.'.$extension, 0755);
# image voor thumb verwijderen
imagedestroy($dst_img);
if ($result == FALSE) {
$error .= '- Image aanmaken is niet gelukt. <br />';
}
?>
Hij doorloopt de stappen goed. Als ik een PNG upload, komt ie in de statements voor PNG file. Zal toch wel ergens iets fout gaan, waardoor ie geen goede PNG image maakt.
---
Edit: Gif heeft geen 3de argument, is er uitgehaald. PNG heeft kwaliteitsargument van 0 tot 9. Als ik die op 9 zet verdwijnt transparantie.
--
Edit 2: Transparantiebehoud is me dan ook eindelijk gelukt met twee extra functies om imagecopyresampled heen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
# voor transparantiebehoud 1/2
if ($extension == 'png') {
imagealphablending($dst_img, false);
}
# image aanmaken 3/4
$result = imagecopyresampled($dst_img, $image, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);
# voor transparantiebehoud 2/2
if ($extension == 'png') {
imagesavealpha($dst_img, true);
}
?>
# voor transparantiebehoud 1/2
if ($extension == 'png') {
imagealphablending($dst_img, false);
}
# image aanmaken 3/4
$result = imagecopyresampled($dst_img, $image, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);
# voor transparantiebehoud 2/2
if ($extension == 'png') {
imagesavealpha($dst_img, true);
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Er zijn nog geen reacties op dit bericht.