2010-04-28 10 views

Respuesta

13

Es bastante sencillo para generar ruido aleatorio. Puede lograr esto bastante fácilmente con algunas de las bibliotecas de imágenes de PHP, incluido el GD functions. Estoy seguro de que sería similar en ImageMagick.

Si desea generar ruido completamente aleatorio, puede usar valores aleatorios para cada color y cada píxel. Eso podría ser algo como esto con 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); 

Genera esto: alt text

Sin embargo, la imagen de ejemplo que usted envió claramente no se ve como el ruido de color completamente al azar. Parece más una elección arbitraria entre uno de dos colores, ya sea un píxel algo gris o un píxel algo coloreado. Que podría lograr que la misma familia:

//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); 

Genera esto: alt text

Su ejemplo parece un poco más complejo aún, con los píxeles que parecen aparecer en pequeños grupos para producir una apariencia blockier. Podría emular eso ajustando la lógica del bucle si lo desea, o coloreando cuadrados pequeños en lugar de píxeles individuales.

Una cosa interesante acerca de este tipo de generación es que realmente se puede ver el desglose de la función rand() en las plataformas de Windows si lo usa en lugar de mt_rand(). Discernible patterns can develop en el ruido debido a las limitaciones en esa combinación de función/plataforma.

5

Sí, es necesario utilizar:

  • ImageCreate[True]Color()
  • 2 x for bucles
  • rand() o mt_rand()
  • ImageColorAllocate()
  • ImageSetPixel

Suena como una receta, lol. Avíseme si necesita ayuda adicional.


Lo siento por la brevedad tenía que hacer algo, aquí hay un código de ejemplo:

<?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

Bueno, pero las coordenadas comienzan en 0, e is_resource debe probar $ im, además puede ser más simple usar ImageColorAllocate ($ im, 0x00, 0x00, 0xFF) por ejemplo. Entiendo que lo haya tipeado tan rápido, hago mis comentarios para evitar problemas al OP ... u otros lectores menos experimentados. Nota: la relación azul/blanco se puede cambiar cambiando 50 a otro valor. Última observación: al utilizar ImageFill o similar antes del ciclo, se reduciría la mitad de las llamadas a ImageSetPixel, lo que podría proporcionar cierta velocidad. – PhiLho

+0

@PhiLho: Tenía dudas con respecto a si las coordenadas comenzaban en 0 o 1, esa también fue la razón por la que elegí no usar 'ImageFill()'. Sin embargo, dejaré el código sin cambios, pero buenos consejos, ¡+1! –

Cuestiones relacionadas