Как я могу сделать фоновое изображение с шумом, используя PHP? - PullRequest
10 голосов
/ 28 апреля 2010

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

альтернативный текст http://www.loriswebs.com/tutorials/images/tealtexture3.jpg

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

Ответы [ 2 ]

13 голосов
/ 28 апреля 2010

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

5 голосов
/ 28 апреля 2010

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

  • ImageCreate[True]Color()
  • 2 х for петли
  • 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);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...