Creez de la 3d sur vos images avec 1 ligne de code

Soyez le premier à donner votre avis sur cette source.

Vue 8 821 fois - Téléchargée 538 fois

Description

Avec l'include 'Image3D.php' il vous suffit d'écrire :
Image3D($im,$r,$v,$b,$dir,$h);

Pour la signification des paramètres, voyez la source :

Source / Exemple :


<?
/*********************************************/
/* Nom     : Image3D                         */
/* Auteur  : pgpp05@hotmail.com              */
/* Créé    : 22/05/2004                      */
/* Modifié : 22/05/2004                      */
/*********************************************/
/* Utilité : Crée un effet 3D sur une image  */
/*********************************************/
/* Arguments : ($im,$dr,$dg,$db,$dir,$h)     */
/*   $im : Pointeur sur l'image              */
/*   $dr,$dg,$db : Composantes couleurs      */
/*       r,v,b à décaler sur l'effet 3D      */
/*   $dir : direction de la 3D, combinaison  */
/*       booléenne des constantes sivantes:  */
/*       BAS|HAUT|DROITE|GAUCHE|X2|Y2        */
/*       X2,Y2 doublent l'effet sur X ou Y   */
/*   $h : Hauteur de l'effet 3D              */
/*********************************************/

define(BAS,1);
define(HAUT,2);
define(DROITE,4);
define(GAUCHE,8);
define(Y2,16);
define(X2,32);

function Image3D(&$im,$dr,$dg,$db,$dir,$h)
{
  global $dx,$dy;$dx=$dy=0;
  $sx=imageSX($im);$sy=imageSY($im);
  if(($dir&BAS)==BAS) $dy-=1;
  if(($dir&HAUT)==HAUT) $dy+=1;
  if(($dir&DROITE)==DROITE) $dx-=1;
  if(($dir&GAUCHE)==GAUCHE) $dx+=1;
  if(($dir&Y2)==Y2) $dy*=2;
  if(($dir&X2)==X2) $dx*=2;

  if($dy<0)
    for($x=0;$x<=$sx;$x++)
      scan3D($im,$x,$sy,$h,$dr,$dg,$db);
  if($dy>0)
    for($x=0;$x<=$sx;$x++)
      scan3D($im,$x,0,$h,$dr,$dg,$db);
  if($dx<0)
    for($y=1;$y<$sy;$y++)
      scan3D($im,$sx,$y,$h,$dr,$dg,$db);
  if($dx>0)
    for($y=1;$y<$sy;$y++)
      scan3D($im,0,$y,$h,$dr,$dg,$db);
}

function scan3D(&$im,$x,$y,$h,$dr,$dg,$db)
{
  global $dx,$dy;
  $cx=0;$cy=0;
  if($dx>0)$cx=1;if($dx<0)$cx=-1;if($dy>0)$cy=1;if($dy<0)$cy=-1;
  $sx=imageSX($im);$sy=imageSY($im);
  while($x>=0 && $y>=0 && $x<=$sx && $y<=$sy)
  {
    $x+=$dx;$y+=$dy;
    $bx=$by=false;
    while($x>=0 && $y>=0 && $x<=$sx && $y<=$sy)
    {
      if(($c=imageColorAt($im,$x,$y))!=0) break;
      else if($bx===false && $by===false){$bx=$x;$by=$y;}
      $x+=$dx;$y+=$dy;
    }
    if($x<0 || $y<0 || $x>$sx || $y>$sy) return(1);
    if($bx===false || $by===false) continue;
    if(abs(($bx-$x)/($dx?$dx:1))>=$h) $bx=$x-$dx*$h;
    if(abs(($by-$y)/($dy?$dy:1))>=$h) $by=$y-$dy*$h;
    $c=imageColorsForIndex($im,$c);
    $r=$c['red']+$dr;$g=$c['green']+$dg;$b=$c['blue']+$db;
    if($r>255)$r=255;if($r<0)$r=0;
    if($g>255)$g=255;if($g<0)$g=0;
    if($b>255)$b=255;if($b<0)$b=0;
    if(($color=ImageColorExact($im,$r,$g,$b))==-1) $color=ImageColorAllocate($im,$r,$g,$b);
    ImageLine($im,$bx,$by,$x-$cx,$y-$cy,$color);
  }
  return(0);
}

$im=ImageCreate(300,170);
ImageColorAllocate($im,255,255,255);
ImageColorAllocate($im,128,80,128);
ImageColorAllocate($im,30,200,30);
ImageColorAllocate($im,150,0,0);
ImageColorAllocate($im,0,60,150);
ImageColorAllocate($im,150,150,0);
ImageFilledPolygon($im,array(50,50,100,80,150,75,200,50,100,35,150,25,80,15),7,3);
//ImageFilledEllipse($im,250,100,75,50,2);
ImageFilledRectangle($im,240,20,255,150,2);
ImageFilledRectangle($im,260,50,275,150,4);
ImageFilledRectangle($im,280,80,295,150,5);
ImageString($im,5,30,115,"function Image3D()",1);
ImageString($im,5,30,135,"pgpp05@hotmail.com",1);
Image3D($im,60,60,60,HAUT|GAUCHE,6);
ImagePNG($im);
?>

Conclusion :


Les dernières lignes sont un exemple (cf la capture d'écran).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
58
Date d'inscription
dimanche 16 mai 2004
Statut
Membre
Dernière intervention
2 septembre 2004

Prérequis ? Quelques bases en PHP et un peu de sens de l'observation peut-être :/
Dans ta ligne il y a deux erreurs flagrantes :
- Le premier paramètre doit être une ressource vers une image (créée par une des fonctions GD imagecreate*)
- Le 5e paramètre doit être une CONSTANTE et non une chaîne de caractères

Ainsi tu aurais du écrire :
$im = imagecreatefromjpeg('screenshot.jpg');
Image3D($im,5,5,12,HAUT,18000);

Mais il reste deux problèmes :
- Un effet 3D de 18000 pixels me paraît un peu... exagéré !!
- L'effet 3D est une simple recopie des pixels de couleur sur le fond (couleur d'index 0) ce qui n'a que peu de sens avec une copie d'écran.
En effet ça ne fonctionne qu'avec des images à palette (couleurs indexées), et j'ignore comment opère imagecreatefromjpeg pour construire sa palette.

PS : il est rarement bon d'utiliser une source datant de 6 ans en arrière...
Messages postés
5
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
27 mai 2008

j'ai tester et j'ai les erreurs suivant : Notice: imagecolorat() [function.imagecolorat]: 8,170 is out of bounds in D:\EasyPHP 2.0b1\www\projet_osonti\Image3D.php on line 61
ensuite
Fatal error: Cannot pass parameter 1 by reference in D:\EasyPHP 2.0b1\www\projet_osonti\index.php on line 58
j'ai mis un include dans le fichier index.php et j'ai passer la fonction avec les paramètres suivants : Image3D('screenshot.jpg',5,5,12,'HAUT',18000);
merci de me dire ce qu'il faut comme préalable pour que ça marche.
Messages postés
56
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
30 novembre 2007

Ca c'est vraiment ce qu'on appelle ==> 1 Ligne !! ;)

Sinon GOOD !!!
Messages postés
58
Date d'inscription
dimanche 16 mai 2004
Statut
Membre
Dernière intervention
2 septembre 2004

No problem ! y'a pas de copyright lol
Merci pour vos commentaires !

bye,
pgpp
Messages postés
18
Date d'inscription
dimanche 31 août 2003
Statut
Membre
Dernière intervention
18 novembre 2004

Ca en jette ! Très bien vraiment, j'ai mis neuf et, avec ta permission, je vais m'en servir pour améliorer mon script d'affichage de l'espace disque ... ^^

byebye,

atrickofthetail
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.