2010-04-28 5 views

Répondre

13

Il est assez simple de générer un bruit aléatoire. Vous pouvez accomplir cela assez facilement avec certaines des bibliothèques d'images de PHP, y compris le GD functions. Je suis sûr que ce serait similaire dans ImageMagick.

Si vous souhaitez générer un bruit complètement aléatoire, vous pouvez utiliser des valeurs aléatoires pour chaque couleur et chaque pixel. Cela pourrait ressembler à ceci avec GD:

//random colored noise 
$x = 150; 
$y = 150; 
$im = imagecreatetruecolor($x,$y); 
for($i = 0; $i < $x; $i++) { 
    for($j = 0; $j < $y; $j++) { 
     $color = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255)); 
     imagesetpixel($im, $i, $j, $color); 
    } 
}  
header('Content-Type: image/png'); 
imagepng($im); 

produit ce: alt text

Cependant, l'image par exemple que vous ne clairement posté ressemble pas à un bruit de couleur complètement aléatoire. Cela ressemble plus à un choix arbitraire entre l'une des deux couleurs, soit un pixel quelque peu gris ou un pixel un peu coloré. Vous pouvez accomplir cela plus comme ceci:

//two-color random noise 
$x = 150; 
$y = 150; 
$im = imagecreatetruecolor($x,$y); 
$color1 = imagecolorallocate($im, 200, 240, 242); 
$color2 = imagecolorallocate($im,220,220,220); 
imagefill($im,0,0,$color1); 
for($i = 0; $i < $x; $i++) { 
    for($j = 0; $j < $y; $j++) { 
     if (mt_rand(0,1) == 1) imagesetpixel($im, $i, $j, $color2); 
    } 
} 
header('Content-Type: image/png'); 
imagepng($im); 

produit ce: alt text

Votre exemple semble un peu plus complexe encore, avec les pixels semblant apparaître en petits groupes pour produire une apparence blockier. Vous pouvez l'émuler en ajustant la logique de boucle si vous le souhaitez, ou en coloriant de petits carrés au lieu de pixels individuels.

Une chose intéressante à propos de ce type de génération est que vous pouvez réellement voir la répartition de la fonction rand() sur les plates-formes Windows si vous l'utilisez au lieu de mt_rand(). Discernible patterns can develop dans le bruit dû aux limitations de cette combinaison fonction/plate-forme.

5

Oui, vous devez utiliser:

  • ImageCreate[True]Color()
  • 2 x for boucles
  • rand() ou mt_rand()
  • ImageColorAllocate()
  • ImageSetPixel

On dirait une recette, lol. Faites-moi savoir si vous avez besoin d'aide supplémentaire.


Désolé pour la brièveté devait faire quelque chose, voici un exemple de code:

<?php 

$im = ImageCreateTrueColor(200, 300); 

if (is_resource($im)) { 
    $blue = array_map('hexdec', str_split('0000FF', 2)); 
    $white = array_map('hexdec', str_split('FFFFFF', 2)); 

    $blue = ImageColorAllocate($im, $blue[0], $blue[1], $blue[2]); 
    $white = ImageColorAllocate($im, $white[0], $white[1], $white[2]); 

    for ($w = 1; $w <= 200; $w++) { 
     for ($h = 1; $h <= 300; $h++) { 
      if (mt_rand(1, 100) >= 50) 
       ImageSetPixel($im, $w, $h, $blue); 
      else 
       ImageSetPixel($im, $w, $h, $white); 
     } 
    } 
} 

header('Content-type: image/png'); 

ImagePNG($im, null, 9); 
ImageDestroy($im); 

?> 
+1

Bon, mais les coordonnées commencent à 0, et is_resource devrait tester $ im, plus il pourrait être plus simple d'utiliser ImageColorAllocate ($ im, 0x00, 0x00, 0xFF) par exemple. Je comprends que vous avez tapé si rapidement, je fais mes remarques pour éviter les ennuis à l'OP ... ou d'autres lecteurs moins expérimentés. Note latérale: le rapport bleu/blanc peut être changé en changeant 50 à une autre valeur. Dernière remarque: en utilisant ImageFill ou un élément similaire avant la boucle, les appels ImageSetPixel seraient réduits de moitié, ce qui pourrait accélérer le processus. – PhiLho

+0

@PhiLho: J'étais dans le doute quant à savoir si les coordonnées commençaient à 0 ou 1, c'était aussi la raison pour laquelle j'ai choisi de ne pas utiliser 'ImageFill()'. Je vais laisser le code inchangé, mais bon pointeurs, +1! –