Witam.
Przygotowywuje na stronę system tworzenia avatarów dla uzytkowników. Avatary docelowo mają znajdować się w ramce w kształcie koła. W tym celu przygotowałem szablon
>kilk<. Użytkownik przesyła na serwer swoje zdjęcie, które jest zamieniane na kwadrat o wymiarach 265x265. Następnie planowałem nałożyć na to zdjęcie mój szablon z przeźroczystością. Jednak element , ktory jest przeźroczysty w szablonie zamienia się na biały w obrazie wynikowym. Nie doszukałem się rozwiązania mojego problemu w google, wiec pisze tutaj.
mój kod:
if( $_FILES['zdjecie']['error'] > 0) {
//przekierowanie na stronę błędu
} else {
list
($img_szer, $img_wys) = getimagesize($_FILES['zdjecie']['tmp_name']);
if($img_szer < 265 || $img_wys < 265) {
//obraz za mały, przekierowanie na stronę błędu
} else if($img_szer >= 265 || $img_wys >= 265) {
//zapis obrazka na serwerze
move_uploaded_file($_FILES['zdjecie']['tmp_name'], "images/users/{$_FILES['zdjecie']['name']}");
//skalowanie obrazka
$zdjecie = imagecreatefrompng('images/users/'.$_FILES['zdjecie']['name']);
$x = imagesx($zdjecie);
$y = imagesy($zdjecie);
$final_x = 265;
$final_y = 265;
$tmp_x = 0;
$tmp_y = 0;
if($y<$x) {
$tmp_x = ceil(($x-$final_x*$y/$final_y)/2
); } else if($x<$y) {
$tmp_y = ceil(($y-$final_y*$x/$final_x)/2
); }
$nowe_zdjecie = imagecreatetruecolor($final_x, $final_y);
imagecopyresampled($nowe_zdjecie, $zdjecie, 0, 0, $tmp_x, $tmp_y, $final_x, $final_y, $x-2*$tmp_x, $y-2*$tmp_y);
imagepng($nowe_zdjecie, "images/users/nowe_zdjecie.png", 0);
unlink("images/users/{$_FILES['zdjecie']['name']}");
//nakladanie obrazków
$zdjecie_big = imagecreatefrompng('images/users/nowe_zdjecie.png');
$szablon = imagecreatefrompng('images/szablon_big.png');
imagecopymerge($zdjecie_big, $szablon, 0, 0, 0, 0, imagesx($zdjecie_big), imagesy($zdjecie_big), 100);
imagepng($zdjecie_big, "images/users/x_avatar.png", 0);
}
}
Niektóre wartości na sztywno, by łatwiej testować.
Pozdrawiam,
oskarro40
Edit: Tak to wyglada wynikowo:
>klik<a chciałbym aby było tak:
>klik<Przepraszam za spam... już rozwiazane:
if( $_FILES['zdjecie']['error'] > 0) {
//przekierowanie na stronę błędu
} else {
list
($img_szer, $img_wys) = getimagesize($_FILES['zdjecie']['tmp_name']);
if($img_szer < 265 || $img_wys < 265) {
//obraz za mały, przekierowanie na stronę błędu
} else if($img_szer >= 265 || $img_wys >= 265) {
//zapis obrazka na serwerze
move_uploaded_file($_FILES['zdjecie']['tmp_name'], "images/users/{$_FILES['zdjecie']['name']}");
//skalowanie obrazka
$zdjecie = imagecreatefrompng('images/users/'.$_FILES['zdjecie']['name']);
$x = imagesx($zdjecie);
$y = imagesy($zdjecie);
$final_x = 265;
$final_y = 265;
$tmp_x = 0;
$tmp_y = 0;
if($y<$x) {
$tmp_x = ceil(($x-$final_x*$y/$final_y)/2
); } else if($x<$y) {
$tmp_y = ceil(($y-$final_y*$x/$final_x)/2
); }
$nowe_zdjecie = imagecreatetruecolor($final_x, $final_y);
imagecopyresampled($nowe_zdjecie, $zdjecie, 0, 0, $tmp_x, $tmp_y, $final_x, $final_y, $x-2*$tmp_x, $y-2*$tmp_y);
imagepng($nowe_zdjecie, "images/users/nowe_zdjecie.png", 0);
unlink("images/users/{$_FILES['zdjecie']['name']}");
//nakladanie obrazków
$duze = imagecreatefrompng("images/users/nowe_zdjecie.png");
$w = imagesx($duze);
$h = imagesy($duze);
imagealphablending($duze,true);
$szablon = imagecreatefrompng("images/szablon_big.png");
imagecopy($duze,$szablon,0,0,0,0,$w,$h);
imagepng($duze,"images/users/output.jpg",0);
}
}
Ten post edytował oskarro40 23.10.2013, 19:46:12