Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] nakładanie obrazka na obrazek
Forum PHP.pl > Forum > PHP
Darkhijacker
Mam skrypt, który nakłada jeden obrazek na drugi. Wszystko działa dobrze, tylko mam pytanie. Jak zrobić, żeby obrazek który nakładam wyświetlał się w prawym dolnym rogu obrazka źródłowego??

Kod
<?php

function gpixel($im,$x,$y){
return Array((($rgb=ImageColorAt($im,$x,$y))>>16) & 0xff,($rgb>>8) & 0xff,$rgb & 0xff);
}

function spixel($im,$x,$y,$color){
ImageSetPixel($im,$x,$y,ImageColorAllocate($im,$color[0],$color[1],$color[2]));
}

function aspixel($pix1,$pix2,$tol=2){
for($i=0,$podobne=true;$i<3;$i++)
  if(($pix1[$i]+$tol<$pix2[$i]) || ($pix1[$i]-$tol>$pix2[$i])) $podobne=false;
return $podobne;
}

function srednia($l1,$l2,$k){
return abs(round($l1-($l1-$l2)*$k));
}

function naloz($obrazek1,$obrazek2,$obrazek,$alpha=50,$nakryj=false,$tolerance=2){
$szer=imagesx($obrazek1);  $wys=imagesy($obrazek1);
$szer2=imagesx($obrazek2); $wys2=imagesy($obrazek2);
if($nakryj) $trans=gpixel($obrazek2,1,1);

for($i=0,$a=$alpha/100;$i<$szer;$i++){
  for($j=0;$j<$wys;$j++){
   $pixel1=gpixel($obrazek1,$i,$j);
   if($i<$szer2 && $j<$wys2) $pixel2=gpixel($obrazek2,$i,$j); else $pixel2=$pixel1;

   $pixel3=Array();
   if(($nakryj && aspixel($pixel2,$trans,$tolerance)) || aspixel($pixel1,$pixel2,0))
    $pixel3=$pixel1; else
    for($k=0;$k<3;$k++) $pixel3[$k]=srednia($pixel1[$k],$pixel2[$k],$a);
   spixel($obrazek,$i,$j,$pixel3);
  }
}
}

?>
<?php

$alpha=100;
// 0   = drugi obrazek bardziej przeźroczysty
// 50  = obrazki równo przeźroczyste
// 100 = pierwszy obrazek bardziej przeźroczysty

$nakryj=false;
// true  = drugi obrazek ma mieć przeźroczyste tło
// false = oba obrazki są tak samo ważne

$obrazek1=ImageCreateFromJpeg('obrazek1.jpg'); // obrazek źródłowy
$obrazek2=ImageCreateFromJpeg('obrazek2.jpg'); // obrazek do nałożenia
$obrazek=ImageCreateTrueColor(imagesx($obrazek1),imagesy($obrazek1)); // obrazek roboczy

naloz($obrazek1,$obrazek2,$obrazek,$alpha,$nakryj,50);

Header('Content-type: image/jpeg'); // ustawienie Content-type (nagłówek dla przeglądarki)
ImageJpeg($obrazek); // przesłanie do przeglądarki obrazka

ImageDestroy($obrazek1); // zniszcz je !
ImageDestroy($obrazek2);
ImageDestroy($obrazek);

?>
nithajasz
http://www.swww.pl/74,pokaz,Artykuly.html zerknij tu masz jak ustalić odpowiedni róg obrazka smile.gif
Darkhijacker
Przerobiłem kod, i teraz mam coś takiego:
Kod
<?php

$pozycja = "br";

function gpixel($im,$x,$y){
return Array((($rgb=ImageColorAt($im,$x,$y))>>16) & 0xff,($rgb>>8) & 0xff,$rgb & 0xff);
}

function spixel($im,$x,$y,$color){
ImageSetPixel($im,$x,$y,ImageColorAllocate($im,$color[0],$color[1],$color[2]));
}

function aspixel($pix1,$pix2,$tol=2){
for($i=0,$podobne=true;$i<3;$i++)
  if(($pix1[$i]+$tol<$pix2[$i]) || ($pix1[$i]-$tol>$pix2[$i])) $podobne=false;
return $podobne;
}

function srednia($l1,$l2,$k){
return abs(round($l1-($l1-$l2)*$k));
}

function naloz($obrazek1,$obrazek2,$obrazek,$alpha=50,$nakryj=false,$tolerance=2,$pozycja){
$szer=imagesx($obrazek1);  $wys=imagesy($obrazek1);
$szer2=imagesx($obrazek2); $wys2=imagesy($obrazek2);

if( $pozycja == "br" )
{
$od_x = $szer - $szer2;
$od_y = $wys - $wys2;
}

if($nakryj) $trans=gpixel($obrazek2,1,1);

for($i=0,$a=$alpha/100;$i<$szer;$i++){
  for($j=0;$j<$wys;$j++){
   $pixel1=gpixel($obrazek1,$i,$j);
   if($i<$szer2 && $j<$wys2) $pixel2=gpixel($obrazek2,$i,$j); else $pixel2=$pixel1;

   $pixel3=Array();
   if(($nakryj && aspixel($pixel2,$trans,$tolerance)) || aspixel($pixel1,$pixel2,0))
    $pixel3=$pixel1; else
    for($k=0;$k<3;$k++) $pixel3[$k]=srednia($pixel1[$k],$pixel2[$k],$a);
   spixel($obrazek,$i,$j,$pixel3);
  }
}
}

?>
<?php

$alpha=100;
// 0   = drugi obrazek bardziej przeźroczysty
// 50  = obrazki równo przeźroczyste
// 100 = pierwszy obrazek bardziej przeźroczysty

$nakryj=false;
// true  = drugi obrazek ma mieć przeźroczyste tło
// false = oba obrazki są tak samo ważne

$obrazek1=ImageCreateFromJpeg('obrazek.jpg'); // obrazek źródłowy
$obrazek2=ImageCreateFromJpeg('logo.jpg'); // obrazek do nałożenia
$obrazek=ImageCreateTrueColor(imagesx($obrazek1),imagesy($obrazek1)); // obrazek roboczy

naloz($obrazek1, $obrazek2, $obrazek, $od_x, $od_y, 0, 0, $szer2, $wys2, $nakryj, 50);

Header('Content-type: image/jpeg'); // ustawienie Content-type (nagłówek dla przeglądarki)
ImageJpeg($obrazek); // przesłanie do przeglądarki obrazka

ImageDestroy($obrazek1); // zniszcz je !
ImageDestroy($obrazek2);
ImageDestroy($obrazek);

?>


Coś nie działa i teraz nie widać obrazka, którego się nakłada na obrazek źródłowy :/
Athlan
Pewnie błędy w matematyce lub podanie niewłaściwych parametrów do funkcji.

Po krótce Ci wyjaśnie jak to zrobić, zrób to sam, nie ściągaj kodów:

Center:
X oraz Y analogicznie: [width(obrazu na który nakładasz)/2]-[width(nakładanego)-2]

Top-left:
X: 0; Y: 0;
Top-right:
X: width oryginału - width nakładanego obrazka;
Y: 0;
Top-center
X: z rozwiązania center;
Y: 0;
Center-left:
X: 0;
Y: z rozwiązania center;
Center-right:
X: z rozwiązania top-right
Y: z rozwiązania ceter

I tak analogicznie... wyobraź sobie to smile.gif

Kawałek mojego kodu:
  1. <?php
  2. final protected function _mathInsert($mPosition, $iSourceX, $iSourceY, $iInsertX, $iInsertY)
  3. {
  4. if(is_array($mPosition))
  5. {
  6. $iX = (isset($mPosition[0]) ? $mPosition[0] : 0);
  7. $iY = (isset($mPosition[1]) ? $mPosition[1] : 0);
  8. }
  9. // top left 
  10. elseif($mPosition == 1) 
  11. { 
  12. $iX = 0; 
  13. $iY = 0; 
  14. }
  15. // top right 
  16. elseif($mPosition == 2) 
  17. { 
  18. $iX = $iSourceX - $iInsertX; 
  19. $iY = 0; 
  20. }
  21. // bottom right 
  22. elseif($mPosition == 3) 
  23. { 
  24. $iX = $iSourceX - $iInsertX; 
  25. $iY = $iSourceY - $iInsertY;
  26. }
  27. // bottom left
  28. elseif($mPosition == 4) 
  29. { 
  30. $iX = 0; 
  31. $iY = $iSourceY - $iInsertY; 
  32. }
  33. // top middle 
  34. elseif($mPosition == 5) 
  35. { 
  36. $iX = (($iSourceX - $iInsertX) / 2); 
  37. $iY = 0; 
  38. }
  39. // middle right 
  40. elseif($mPosition == 6) 
  41. { 
  42. $iX = $iSourceX - $iInsertX; 
  43. $iY = ($iSourceY / 2) - ($iInsertY / 2); 
  44. }
  45.  
  46. // bottom middle
  47. elseif($mPosition == 7) 
  48. { 
  49. $iX = (($iSourceX - $iInsertX) / 2); 
  50. $iY = $iSourceY - $iInsertY; 
  51. }
  52. // middle left 
  53. elseif($mPosition == 8) 
  54. { 
  55. $iX = 0; 
  56. $iY = ($iSourceY / 2) - ($iInsertY / 2); 
  57. }
  58. // middle
  59. else
  60. {
  61. $iX = ($iSourceX / 2) - ($iInsertX / 2); 
  62. $iY = ($iSourceY / 2) - ($iInsertY / 2); 
  63. }
  64.  
  65. return array($iX, $iY);
  66. }
  67. ?>


Zwracam pozycję X i Y, tam, gdzie ma być nałożony obrazek.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.