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

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

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

Идеально я хотел бы смочь изменить цвет также. Какие-либо идеи о том, как генерировать это?

10
задан Glorfindel 24 July 2019 в 19:10
поделиться

2 ответа

Сгенерировать случайный шум довольно просто. Вы можете легко сделать это с помощью некоторых библиотек изображений PHP, включая GD functions . Я уверен, что в 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 () . Различимые шаблоны могут развиваться в шуме из-за ограничений в этой комбинации функции / платформы.

13
ответ дан 3 December 2019 в 20:40
поделиться

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

  • ImageCreate [True] Color ()
  • 2 x для циклов
  • rand () или mt_rand ()
  • ImageColorAllocate ()
  • ImageSetPixel

Похоже на рецепт, смеется. Сообщите мне, если вам понадобится дополнительная помощь.


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

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

?>
5
ответ дан 3 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: