php图片隐写,把文本内容写入到图片里,图片的内容不变

原理:

首先把要隐写的字符串转化成二进制数,为了方便计算,每个字符都给分配30位,前面不足的位数补0。

然后,每张图片,都由大量的像素点组成,每个像素点又是由红绿蓝三个颜色值组成,把每个像素的蓝色的值用二进制表示,然后最后一位数改成对应的字符串二进制数,这样对整体图片不会有很大的变化,基本肉眼无法识别。同样,再把字符串的长度存到前20个像素的红色值的最后一位,这样解析的时候就知道多少位是有效的隐写数据。最后把二进制数据生成图片,就完成了图片的隐写,实现了把文本内容写入到图片里,别人也一般不会发现。

话不多说,上代码(案例是写在tp5里面的,原理都一样):

namespace app\tool\controller;
use think\Controller;
use think\Request;
header("Content-Type: text/html; charset=utf-8");
class Ceshi extends Controller
{
    //生成加密图片
	public function img_encrypt(){
		$txt='lzy'; //要写入的文字
		$str_arr=explode(' ',$this->StrToBin($txt));
		$src = 'ceshi.jpg'; //图片的路径
		$im = imagecreatefromjpeg($src);
		$max_x=imagesx($im)-1;
		$length=base_convert(count($str_arr),10,2);
		$x=0;
		$y=0;
		$jishu='';
		for($length_count=0;$length_count<20;$length_count++){
			if(mb_strlen($length)<20-$length_count){
				$jishu.='0';
			}else{
				$jishu.=$length[$length_count-(20-mb_strlen($length))];
			}
		}
		for($i=0;$i$max_x){
					$x=0;
					$y++;
				}
				$rgb = imagecolorat($im,$x,$y);
				$r = ($rgb >>16) & 0xFF;
				$g = ($rgb >>8) & 0xFF;
				$b = $rgb & 0xFF;
				if($j<30-mb_strlen($str_arr[$i])){
					$bu0_str=0;
				}else{
					$bu0_str=$str_arr[$i][$j-(30-mb_strlen($str_arr[$i]))];
				}
				$newB = $this->toBin($b);
				$newB[mb_strlen($newB)-1] = $bu0_str;
				$newB = $this->toString($newB);
				if($i==0 && $j<20){
					$r = $this->toBin($r);
					$r[mb_strlen($r)-1]=$jishu[$j];
					$r = $this->toString($r);
				}
				$new_color = imagecolorallocate($im,$r,$g,$newB);
				imagesetpixel($im,$x,$y,$new_color);
				$x++;
			}
		}
		imagepng($im,'simple.png');
		imagedestroy($im);
	}
    //解密图片文字
	public function decrypt(){
		$src = 'simple.png';
		$im = imagecreatefrompng($src);
		$len='';
		for($x=0;$x<20;$x++){
			$rgb = imagecolorat($im,$x,0);
			$r = ($rgb >>16) & 0xFF;
			$r = $this->toBin($r);
			$len.=$r[mb_strlen($r)-1];
		}
		$len=base_convert($len,2,10);
		$real_message = '';
		$max_x=imagesx($im)-1;
		$x=0;
		$y=0;
		for($i=0;$i<$len;$i++){
			$er_message='';
			for($j=0;$j<30;$j++){
				if($x>$max_x){
					$x=0;
					$y++;
				}
				$rgb = imagecolorat($im,$x,$y);
				$x++;
				$b = $rgb & 0xFF;
				$blue = $this->toBin($b);
				$er_message .= $blue[mb_strlen($blue)-1];
			}
			$real_message .= $this->toString($er_message);
		}
		echo $real_message;
		die;
	}
	public function toBin($str){
		$str = (string)$str;
		$l = mb_strlen($str);
		$result = '';
		while($l--){
			$result = str_pad(decbin(ord($str[$l])),8,"0",STR_PAD_LEFT).$result;
		}
		return $result;
	}
	public function toString($binary){
		return pack('H*',base_convert($binary,2,16));
	}
	/**
        * 将字符串转换成二进制
        * @param type $str
        * @return type
        */
        function StrToBin($str){
            //1.列出每个字符
            $arr = preg_split('/(?

 

你可能感兴趣的:(php,tp5,图片处理,php,图片隐写,tp5,图片处理,文本隐写)