• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imagewbmp()

    (PHP 4 >= 4.0.1, PHP 5, PHP 7)

    以 WBMP 格式将图像输出到浏览器或文件

    说明

    imagewbmp(resource $image[,string $filename[,int $foreground]]): bool

    imagewbmp()$image图像创建一个名为$filename的WBMP文件。$image参数是imagecreatetruecolor()的返回值。

    $filename参数是可选项,如果省略,则直接将原图像流输出。通过用header()发送image/vnd.wap.wbmp的 Content-type,可以创建直接输出 WBMP 图像的 PHP 脚本。

    Note:

    WBMP 支持仅能用于 PHP 编译时加入了 GD-1.8 或更高版本时。

    用可选的$foreground参数可以设定前景色,用imagecolorallocate()函数返回的颜色标识符。默认前景色是黑色。

    参见image2wbmp(),imagepng(),imagegif(),imagejpeg()和imagetypes()。

    As has been commented before, GD doesnt do a very good translation to 2-colours, especially for photos. The following routine converts to two colours, I believe using error diffusion (the algorithm's nicked off news). It's slow, but just about adequate for small images and low load. I suspect it can be made much more efficient :-)
    function ImageColorFloydSteinberg($dst_img, $src_img) {
      ImageColorAllocate($dst_img, 0,0,0);
      ImageColorAllocate($dst_img, 255,255,255);
      $grey_img = ImageCreate(ImageSX($src_img), ImageSY($src_img));
      for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
      for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
          $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
          $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
          ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
      }
      for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
          $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
          if ($color["red"] > 128) {
            ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
            $err = $color["red"] - 255;
          } else {
            ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
            $err = $color["red"];
          }
          if ($x != ImageSx($src_img)) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
            $newgrey = $color2["red"] + $err * 7 / 16;
            ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($x != 0) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
            $newgrey = $color2["red"] + $err * 3 / 16;
            ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($y != ImageSy($src_img)) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
            $newgrey = $color2["red"] + $err * 5 / 16;
            ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($x != ImageSx($src_img) && $y != ImageSy($src_img)) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
            $newgrey = $color2["red"] + $err / 16;
            ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          
        }
      }
      imagedestroy($grey_img);
    }
    To output your WBMP, use
    ImageWBMP($final_img, "", ImageColorClosest(255,255,255));
    In the previous note by -> lukeross at sys3175 dot co dot uk <- there is a coding error in the for() loops. After correcting the error, I found that this function did a great job of converting color images to 2 colors.
    The following is the corrected function code:
    function ImageColorFloydSteinberg($dst_img, $src_img) {
      ImageColorAllocate($dst_img, 0,0,0);
      ImageColorAllocate($dst_img, 255,255,255);
      $isx = ImageSX($src_img);
      $isy = ImageSY($src_img);
      $grey_img = ImageCreate($isx, $isy);
      for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
      $isx -= 1; // To correct pixel count in source image width starting from 0
      $isy -= 1; // Correcting pixel count in source image height starting from 0
      for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
          $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
          $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
          ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
      }
      for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
          $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
          if ($color["red"] > 128) {
            ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
            $err = $color["red"] - 255;
          } else {
            ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
            $err = $color["red"];
          }
          if ($x != $isx) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
            $newgrey = $color2["red"] + $err * 7 / 16;
            ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($x != 0) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
            $newgrey = $color2["red"] + $err * 3 / 16;
            ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($y != $isy) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
            $newgrey = $color2["red"] + $err * 5 / 16;
            ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          if ($x != $isx && $y != $isy) {
            $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
            $newgrey = $color2["red"] + $err / 16;
            ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
          }
          
        }
      }
      imagedestroy($grey_img);
    }

    上篇:imagetypes()

    下篇:imagewebp()