php上传图片并添加水印

效果图如下:

在这里插入图片描述

index.html代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>上传图片加水印</title>
</head>
<body>
  <!-- action为空表示提交到当前页面  enctype编码格式 -->
  <form action="" method="post" enctype="multipart/form-data">
    <!-- 上传文件的名称为img -->
    <input type="file" name="img" value="image/*">
     <button type="submit" name="button">上传图片加水印</button>
  </form>
</body>
</html>

index.php代码如下:

<?php

//获取图片信息函数
function get_image_contents($file){
  $data['img'] = file_get_contents($file);
  if( !$data['img'] ){
    return false;
  };
  $data['size'] = getimagesize($file);
  return $data;
};

//生成水印并上传图片函数
function upload_watermark_image(
  $file,
  $output_dir = './output_img/',
  $alpha = 20,
  $logo_dir= './watermark/logo.png'
){
  $file_type = explode('/',$file['type']);
  //判断文件类型 正则匹配
  if(!preg_match('/^image/',$file_type[0])){
    return false;
  };
  //获取水印logo图片信息
  $logo_info = get_image_contents($logo_dir);
  //是否获取失败
  if( !$logo_info )return false;
  //获取水印logo图片宽高
  list($logo_width,$logo_height) = $logo_info['size'];

  //打开上传的图像信息
  $up_img_info = get_image_contents($file['tmp_name']);
  //是否获取失败
  if(!$up_img_info )return false;
  //获取水印logo图片宽高
  list($img_width,$img_height) = $up_img_info['size'];

  //imagecreatefromstring — 从字符串中的图像流新建一图像  生成水印 与 生成上传图片
  $logo = imagecreatefromstring($logo_info['img']);
  $img = imagecreatefromstring($up_img_info['img']);

  //生成的水印在右下角(10,10)位置
  $dis_x = $img_width - $logo_width - 10;
  $dis_y = $img_height - $logo_height - 10;

  //imagecopymerge(上传图片,水印,位置,水印宽,水印高,透明度0~100) — 拷贝并合并图像的一部分
  imagecopymerge($img,$logo,$dis_x,$dis_y,0,0,$logo_width,$logo_height,$alpha);

  //上传图片的种类
  $img_types = ['jpeg','png','gif','webp'];
  //获取图片后缀 是否在种类内 不是默认上传png格式图片
  $img_type = (in_array($file_type[1],$img_types)) ? $file_type[1] : 'png';
  //设置上传不同图片的函数名调用 .号是字符串连接符
  $save_img_name = 'image'.$img_type;
  //保存图片路径名称
  $img_path = $output_dir.uniqid().'.'.$img_type;
  //该目录是否存在  || 不存在创建该目录
  is_dir($output_dir) || mkdir($output_dir);
  //上传生成好的有水印图片 如:imagepng(上传的图片,上传的路径)
  $save_img_name($img,$img_path);
  //用完后 销毁与内存关联的图像资源
  imagedestroy($img);
  imagedestroy($logo);
  //输出上传的图片地址
  return $img_path;
}


//empty():检查一个变量是否为空  /  $_FILES数组:接收上传的文件
if(empty($_FILES)){ //提交的文件是否为空
  //没有文件则显示提交页面
  include 'index.html';
}else{
  $name = 'img';
  //获取上传的图片信息
  $file = $_FILES[$name];

  $output_img = upload_watermark_image($file);

  if($output_img){
    echo "<img src='".$output_img." ' /> <br>";
  }else{
    echo "这不是图片文件";
  }

  //原图
  //imagecreatefromstring — 从字符串中的图像流新建一图像 
  //file_get_contents — 将整个文件读入一个字符串 ($file['tmp_name']是图片地址)
  $dst_image = imagecreatefromstring(file_get_contents($file['tmp_name']));
  //获取图片宽高
  list($file_width,$file_height) = getimagesize($file['tmp_name']);

};
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uniapp中上图片/视频并添加水印,可以按照以下步骤: 1. 在前端页面中,添加一个文件上控件,例如: ```html <template> <div> <input type="file" ref="fileInput" @change="uploadFile"> </div> </template> ``` 2. 在前端编写上文件的逻辑,可以使用uniapp提供的上组件,例如: ```js methods: { // 上文件 uploadFile() { const file = this.$refs.fileInput.files[0] uni.uploadFile({ url: '/upload', filePath: file.tempFilePath, name: 'file', success: (res) => { console.log('上成功', res) }, fail: (err) => { console.log('上失败', err) } }) } } ``` 3. 在后端编写一个接口,用于接收上的文件并添加水印。可以使用Java、PHP等语言实现添加水印的逻辑,下面以Java为例。在接口中,可以使用以下代码实现添加水印: ```java // 获取上的文件 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // 添加水印 Image image = ImageIO.read(fileContent); Graphics2D g = image.createGraphics(); g.drawImage(image, 0, 0, null); g.setFont(new Font("Arial", Font.BOLD, 30)); g.setColor(Color.RED); g.drawString("Watermark", 10, 30); g.dispose(); // 保存文件到服务器 File file = new File("/path/to/save/" + fileName); ImageIO.write(image, "jpg", file); ``` 4. 在前端接收后端返回的结果,例如: ```js success: (res) => { console.log('上成功', res) // 处理上成功的逻辑 }, fail: (err) => { console.log('上失败', err) // 处理上失败的逻辑 } ``` 以上是uniapp中上图片/视频并添加水印的基本步骤,需要注意的是,添加水印时需要使用服务器端的代码实现,客户端无法实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值