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:
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:
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.
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
@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! –