Подтвердить что ты не робот

Как я могу сделать шумное фоновое изображение с помощью PHP?

Я хочу сделать изображение, которое просто шумит, может быть, что-то вроде этого:

alt text
(источник: loriswebs.com)

В идеале я бы хотел изменить цвет. Любые идеи о том, как создать это?

4b9b3361

Ответ 1

Это довольно простой способ генерировать случайный шум. Вы можете сделать это довольно легко с некоторыми библиотеками изображений PHP, включая функции GD. Я уверен, что это будет похоже на ImageMagick.

Если вы хотите генерировать полностью случайный шум, вы можете использовать случайные значения для каждого цвета и каждого пикселя. Это может выглядеть примерно так: 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);

Генерирует это: alt text

Однако пример изображения, который вы опубликовали, не выглядит абсолютно случайным цветовым шумом. Это больше похоже на произвольный выбор между одним из двух цветов, либо несколько серым пикселем, либо разноцветным пикселем. Вы могли бы сделать это примерно так:

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

Генерирует это: alt text

Ваш пример кажется еще более сложным, так как пиксели кажутся появляющимися небольшими группами, чтобы создать более яркий вид. Вы могли бы эмулировать это путем настройки логики цикла, если хотите, или окрашивания небольших квадратов вместо отдельных пикселей.

Интересной особенностью такого типа генерации является то, что вы можете увидеть разбивку функции rand() на платформах Windows, если вы используете ее вместо mt_rand(). Заметные шаблоны могут развиваться в шуме из-за ограничений в этой комбинации функций/платформ.

Ответ 2

Да, вам нужно использовать:

  • ImageCreate[True]Color()
  • 2 x for петли
  • rand() или mt_rand()
  • ImageColorAllocate()
  • ImageSetPixel

Звучит как рецепт, LOL. Дайте мне знать, если вам нужна дополнительная помощь.


Извините за краткость, нужно было что-то сделать, вот пример кода:

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

?>