Page 1 sur 1

Problème imagecopy GD

Posté : 07 juin 2007, 20:00
par djblagues
Bonjour, je fais de php depuis déjà pas mal de temps mais je me suis arrêté sur un problème très spécial!

En fait pour tout vous dire, je découpe un Autotiles de RPG Maker XP pour mettre celui-ci en morceau.

Ce sont des bloques de 32 pixels de côtés et jusque là, tout va bien. Ensuite sur un dés bloque, je souhaite le couper en quatre pour les replacer sur une image de fond (là c'est de l'herbe).

Un exemple de ces Autotiles (coupé en 3*4)::
Image

Pour la première découpe en replacement avec la fonction imagecopy, tout ce passe bien.
Mais les trois autres images créée contiennent le découpage précédent alors que je n'ai pas l'impression de l'avoir demandé à php dans le code...

Pour que sa soit plus clair, voici le code ::
<?php
  $autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png'); // C'est le premier bloque
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png'); // C'est le deuxième bloque
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 16, 16, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hd.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 0, 0, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 0, 16, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bd.png');
  imagedestroy($coin);
?>
Si je ne sauve pas les images une par une, les variables contenant ceux-ci contiennent tous la même chose ::
Image

Alors que sa doit ce présenter comme ceci (sans les carrés gris)::
Image

Pouvez-vous m'aider!!

Posté : 07 juin 2007, 22:21
par Sékiltoyai
C'est ca que tu veux ?
<?php

  $autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles 

  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png'); // C'est le premier bloque 
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png'); // C'est le deuxième bloque 
  $coin = $zototilesplus; 
  imagecopy($coin, $zototiles, 0, 0, 0, 0, 16, 16); 
  imagecopy($coin, $zototiles, 16, 0, 16, 0, 16, 16); 
  imagecopy($coin, $zototiles, 32, 0, 0, 16, 16, 16); 
  imagecopy($coin, $zototiles, 64, 0, 16, 16, 16, 16);
  imagedestroy($coin); 
?>

Posté : 08 juin 2007, 16:11
par djblagues
Non, sa ne me donne pas le résultat voulu.

En fait, je ne veux pas qu'ils soit tous sur la même image donc sa me ferai 4 bloques séparés comme l'image au dessus. une image par bloque car par la suite je génèrerai une map avec des conditions de placement et pour que cela fonctionne bien je voudrai avec que des bloques de 32*32

Posté : 08 juin 2007, 16:21
par djblagues
Une petite explication pour la suite, le nombre à placer en GET (dans le lien) est de trois chiffres ce sont les trois premier du nom de l'autotile comme 006-[...]! (mapage.php?num=006)

Je vous donne mon script complet ::
<?php
$autotiles_rep = 'Autotiles'; // Répertoire regroupant les autotiles
// Vous pouvez tester en mettant l'autotile du premier post!
$autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

// Seulement si le nombre fait trois chiffres
if (strlen($_GET['num']) == 3) {
 $autotiles_open = opendir($autotiles_rep);

 // Scan du répertoire des autotiles
 unset($nbr, $passe);
 while ($autotiles_scan = readdir($autotiles_open)) {
  if ($autotiles_scan != '.' && $autotiles_scan != '..') {
   $autotiles_ext = substr($autotiles_scan, strrpos($autotiles_scan, '.') + 1);
   if ($autotiles_ext == 'png') {
    $nbr++;
    $autotiles_nom[substr($autotiles_scan, 0, 3)] = $autotiles_scan;
    if ($_GET['num'] == substr($autotiles_scan, 0, 3)) {$passe = 1;}
   }
  }
 }

 closedir($autotiles_open);
 clearstatcache();

 // Si le passage est confirmé et si le répertoire de sauvegarde n'existe pas!
 if ($passe == 1 && !file_exists($autotiles_replus.'/'.$_GET['num'])) {
  // On créer le répertoire de sauvegarde
  mkdir($autotiles_replus.'/'.$_GET['num'], 0700);

  // Repérage de l'autotile choisi
  $autotiles = imagecreatefrompng($autotiles_rep.'/'.$autotiles_nom[$_GET['num']]);

  // Indexation de l'Autotiles
  unset($k, $l);
  for ($j = 0; $j <= 11; $j++) {
   $autotiles_[$j] = imagecreate(32, 32);
   imagecopy($autotiles_[$j], $autotiles, 0, 0, $k * 32, $l * 32, 32, 32);
   imagepng($autotiles_[$j], $autotiles_replus.'/'.$_GET['num'].'/zoto_'.($j + 1).'.png');
   imagedestroy($autotiles_[$j]);
   $k++;
   if ($k > 2) {$k = 0; $l++;}
  }

  imagedestroy($autotiles);
  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png');
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 16, 16, 0, 16, 16);
  imagepng($coin, $autotiles_replus.'/hd.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 16, 0, 0, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bg.png');
  $coin = $zototilesplus;
  imagecopy($coin, $zototiles, 0, 0, 16, 16, 16, 16);
  imagepng($coin, $autotiles_replus.'/bd.png');
  imagedestroy($coin);
 }
}
?>

Résolu

Posté : 10 juin 2007, 10:11
par djblagues
J'ai réussi à trouver un échappatoire grace à toi 'Sékiltoyai', voici mon code ::
<?php
$autotiles_rep = 'Autotiles'; // Répertoire regroupant les autotiles
$autotiles_replus = 'Zototiles'; // Répertoire regroupant les autotiles

// Seulement si le nombre fait trois chiffres
if (strlen($_GET['num']) == 3) {
 $autotiles_open = opendir($autotiles_rep);

 // Scan du répertoire des autotiles
 unset($nbr, $passe);
 while ($autotiles_scan = readdir($autotiles_open)) {
  if ($autotiles_scan != '.' && $autotiles_scan != '..') {
   $autotiles_ext = substr($autotiles_scan, strrpos($autotiles_scan, '.') + 1);
   if ($autotiles_ext == 'png') {
    $nbr++;
    $autotiles_nom[substr($autotiles_scan, 0, 3)] = $autotiles_scan;
    if ($_GET['num'] == substr($autotiles_scan, 0, 3)) {$passe = 1;}
   }
  }
 }

 closedir($autotiles_open);
 clearstatcache();

 // Si le passage est confirmé et si le répertoire de sauvegarde n'existe pas!
 if ($passe == 1 && !file_exists($autotiles_replus.'/'.$_GET['num'])) {
  // On créer le répertoire de sauvegarde
  mkdir($autotiles_replus.'/'.$_GET['num'], 0700);

  // Repérage de l'autotile choisi
  $autotiles = imagecreatefrompng($autotiles_rep.'/'.$autotiles_nom[$_GET['num']]);

  // Indexation de l'Autotiles
  unset($k, $l);
  for ($j = 0; $j <= 11; $j++) {
   $autotiles_[$j] = imagecreate(32, 32);
   imagecopy($autotiles_[$j], $autotiles, 0, 0, $k * 32, $l * 32, 32, 32);
   imagepng($autotiles_[$j], $autotiles_replus.'/'.$_GET['num'].'/zoto_'.($j + 1).'.png');
   imagedestroy($autotiles_[$j]);
   $k++;
   if ($k > 2) {$k = 0; $l++;}
  }

  imagedestroy($autotiles);
  $zototiles = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_1.png');
  $coin = imagecreate(128, 32);
  $zototilesplus = imagecreatefrompng($autotiles_replus.'/'.$_GET['num'].'/zoto_2.png');
  imagecopy($coin, $zototilesplus, 0, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 32, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 64, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototilesplus, 96, 0, 0, 0, 32, 32);
  imagecopy($coin, $zototiles, 16, 16, 0, 0, 16, 16);
  imagecopy($coin, $zototiles, 0 + 32, 16, 16, 0, 16, 16);
  imagecopy($coin, $zototiles, 16 + 64, 0, 0, 16, 16, 16);
  imagecopy($coin, $zototiles, 0 + 96, 0, 16, 16, 16, 16);
  $coinplus = imagecreate(32, 32);
  imagecopy($coinplus, $coin, 0, 0, 0, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/bd.png');
  imagecopy($coinplus, $coin, 0, 0, 32, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/bg.png');
  imagecopy($coinplus, $coin, 0, 0, 64, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/hd.png');
  imagecopy($coinplus, $coin, 0, 0, 96, 0, 32, 32);
  imagepng($coinplus, $autotiles_replus.'/'.$_GET['num'].'/hg.png');
  imagedestroy($coin);
  imagedestroy($coinplus);
 }
}
?>