【问题标题】:How can I make a noisy background image using PHP?如何使用 PHP 制作嘈杂的背景图像?
【发布时间】:2010-04-28 07:14:05
【问题描述】:

我正在寻找一个只是噪音的图像,可能是这样的:


(来源:loriswebs.com

理想情况下,我也希望能够更改颜色。关于如何生成这个的任何想法?

【问题讨论】:

    标签: php imagemagick


    【解决方案1】:

    生成随机噪声相当简单。您可以使用一些 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);
    

    生成这个:

    但是,您发布的示例图片显然不像完全随机的颜色噪点。它看起来更像是在两种颜色之一之间的任意选择,要么是有点灰色的像素,要么是有点颜色的像素。你可以像这样完成它:

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

    生成这个:

    您的示例似乎仍然有点复杂,像素似乎以小组形式出现以产生更块状的外观。如果需要,您可以通过调整循环逻辑或为小方块着色而不是单个像素来模拟这一点。

    关于这种生成的一个有趣的事情是,如果你使用它而不是 mt_rand(),你实际上可以在 Windows 平台上看到 rand() 函数的故障。 Discernible patterns can develop 由于该功能/平台组合的限制而引起的噪音。

    【讨论】:

      【解决方案2】:

      是的,你需要使用:

      • ImageCreate[True]Color()
      • 2 x 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);
      
      ?>
      

      【讨论】:

      • 很好,但是坐标从 0 开始,并且 is_resource 应该测试 $im,另外使用 ImageColorAllocate($im, 0x00, 0x00, 0xFF) 可能更简单。我知道你打字很快,我发表评论是为了避免给 OP 或其他经验不足的读者带来麻烦。旁注:可以通过将 50 更改为另一个值来更改蓝/白比率。最后一点:通过在循环之前使用 ImageFill 或类似方法,它会减少一半的 ImageSetPixel 调用,这可能会提供一些加速。
      • @PhiLho:我一直怀疑坐标是从0还是1开始,这也是我选择不使用ImageFill()的原因。我将保持代码不变,但很好的指针,+1!
      猜你喜欢
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2017-11-07
      • 2020-03-03
      相关资源
      最近更新 更多