zoukankan      html  css  js  c++  java
  • php自动识别背景并且把它改为白色

    此源码有个阈值可以自己调节,精确度等自测

    <?php
    /*$Colorimg = new Colorimg();
    $image=$Colorimg->IMGaction("G:/www/20161220/demo/5.jpg",1,1,50);
    //告诉浏览器以图片形式解析
    header('content-type:image/jpeg');
    imagejpeg($image, "G:/www/20161220/demo/3.jpg");
    */
     
    class Colorimg
    {
        public $image;//图片
        private $cs;//比对阈值
        public function IMGaction($imgurl,$if_url=1,$if_deflate=0,$cs='50') {
            if($if_url==1) {
                $image $this->ImgcolorCRRATE($imgurl);
            }else{
                $image $imgurl;
            }
            if($if_deflate==1) {
                $image $this->ImgDEFLATE($image);
            }
            //平均值
            $sample $this->ColorGETMEANrgb($image);
     
           $image=$this->ImgsetPIXEL($image,$sample,$cs);
     
            return $image;
     
        }
        /**
         * 打开一张图片
         */
        public function ImgcolorCRRATE($image)
        {
            list($width$height) = getimagesize($image);//获取图片信息
            $img_info getimagesize($image);
            switch ($img_info[2]) {
                case 1:
                    $img = imagecreatefromgif($image);
                    break;
                case 2:
                    $img = imagecreatefromjpeg($image);
                    break;
                case 3:
                    $img = imagecreatefrompng($image);
                    break;
            }
            return $img;
        }
     
        /**
         * $rate为图片长宽最大值
         */
        public function ImgDEFLATE($image$rate '800')
        {
            $w = imagesx($image);
            $h = imagesy($image);
    //指定缩放出来的最大的宽度(也有可能是高度)
            $max $rate;
    //根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
            if ($w $h) {
                $w $max;
                $h $h * ($max / imagesx($image));
            else {
                $h $max;
                $w $w * ($max / imagesy($image));
            }
    //声明一个$w宽,$h高的真彩图片资源
            $i = imagecreatetruecolor($w$h);
     
    //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
            imagecopyresampled($i$image, 0, 0, 0, 0, $w$h, imagesx($image), imagesy($image));
            return $i;
        }
     
        /**
         * 传入多维数组n个点计算平均值
         *$rgbarrays=array(
         * $rgb1=array(
         * 'r'=>255,
         * 'g'=>255,
         * 'b'=>255
         * )
         * )
         */
        public function ColorRECKmean($rgbarrays)
        {
    //获取总共几个点
            $sum count($rgbarrays);
            $mean1['r'] = '';
            $mean1['g'] = '';
            $mean1['b'] = '';
            foreach ($rgbarrays as $rbg) {
                $mean1['r'] += $rbg['r'];
                $mean1['g'] += $rbg['g'];
                $mean1['b'] += $rbg['b'];
            }
            $mean['r'] = intval($mean1['r'] / $sum);
            $mean['g'] = intval($mean1['g'] / $sum);
            $mean['b'] = intval($mean1['b'] / $sum);
            return $mean;
        }
     
        /**
         * 取四个点,返回平均点的rgb数组
         */
        public function ColorGETMEANrgb($image)
        {
            $rgb1 = imagecolorat($image, 0, 0);
            $rgb2 = imagecolorat($image, 0, imagesy($image) - 1);
            $rgb3 = imagecolorat($image, imagesx($image) - 1, 0);
            $rgb4 = imagecolorat($image, imagesx($image) - 1, imagesy($image) - 1);
    //平均值
            $sample $this->ColorRECKmean(array($this->ColorRGBresolved($rgb1)), $this->ColorRGBresolved($rgb2), $this->ColorRGBresolved($rgb3), $this->ColorRGBresolved($rgb4));
            return $sample;
        }
     
        public function ImgsetPIXEL($image,$sample,$cs){
            //如果相似就加一个白色的点
            for ($x = 0; $x < imagesx($image); $x++) {
                for ($y = 0; $y < imagesy($image); $y++) {
                    $rgb = imagecolorat($image$x$y);
                    $than $this->ColorTHANrgb($this->ColorRGBComp($this->ColorRGBresolved($rgb), $sample),$cs);
                    if ($than) {
                        $color = imagecolorallocate($image, 255, 255, 255);
                        imagesetpixel($image$x$y$color);
                    }
                }
            }
            return $image;
        }
     
        /**
         * 比对颜色相似度
         * $rgb1和$rgb2必须数组$rgb['r']....
         */
        public function ColorRGBComp($rgb1$rgb2)
        {
            $tbsr abs($rgb1['r'] - $rgb2['r']);
            $tbsg abs($rgb1['g'] - $rgb2['g']);
            $tbsb abs($rgb1['b'] - $rgb2['b']);
            $cv = sqrt(pow($tbsr, 2) + pow($tbsg, 2) + pow($tbsb, 2));
            return $cv;
        }
        /**
         *把rgb颜色分解成数组
         *
         */
        function ColorRGBresolved($rgb)
        {
            $img['r'] = intval(($rgb >> 16) & 0xFF);
            $img['g'] = intval(($rgb >> 8) & 0xFF);
            $img['b'] = intval(($rgb) & 0xFF);
            return $img;
        }
     
        /**
         * 对比像素是否相似,相似返回true
         */
        public function ColorTHANrgb($cv$cs)
        {
            if ($cv <=$cs) {
                return true;
            else {
                return false;
            }
        }
    }
  • 相关阅读:
    [整理]弦图学习笔记
    [整理]NOI Online 2021第一场题解
    [整理]Pólya 定理入门到入土
    [游记]2021省选抱灵记
    [整理]一些好玩的/板子的动态规划题目
    [整理]网络流随记——终(有关网络流的一些杂项)
    [整理][持续更新]多项式知识点大全(超简洁!)
    [洛谷P4338][题解][ZJOI2018]历史
    [游记]WC2021游记
    Codeforces Round #703 (Div. 2) (A~E)
  • 原文地址:https://www.cnblogs.com/myJuly/p/12986501.html
Copyright © 2011-2022 走看看