php+croppic.js实现剪切上传图片功能


Posted in PHP onAugust 14, 2018

最近需要实现裁剪图片上传,想起之前公司用到的一个插件,却不知道叫什么名字了。

在网上找了有些时间,最终找到了这个网站。

http://www.croppic.net/

因为官网文档全部都是英文,所以看起来有些吃力,可以大概看懂80%,但是缺少详细的案例说明,所以真正配置起来还是非常懵逼。

如果完全按照官网文档的步骤,大概就是这样的

下载安装

php+croppic.js实现剪切上传图片功能 

官网提供两种下载方式,第一种类似于SDK的whole website,另外一种 简洁版croppic。前者提供了完整的项目结构以及前后端案例,后者只有croppic.css、croppic.js、croppic.min.js三个文件。

基本使用

// css 部分
#yourId {
  width: 200px;
  height: 150px;
  position:relative; /* or fixed or absolute */
}
// html 部分
<div id="yourId"></div>
// js部分
var options = [
uploadUrl:'图片上传地址',
cropUrl: '图片裁切后发送的地址',
// 等等各种参数配置信息
];
var cropperHeader = new Croppic('yourId',options);

Options 参数

uploadUrl

uploadUrl:'制定上传的地址',
uploadData:{
"dummyData":1,
"dummyData2":"text"
}

php处理时,和普通的上传文件一模一样,使用$_FILES['img']可以直接获取文件信息,上传并保存;使用$_REQUEST[]则直接可以获取js中uploadData中的数据。

php在处理完成后,根据成功状态返回如下json结构

成功时

{
 "status":"success",
  "url":"返回成功后的图片url地址",
  "width":源图片宽度, 
 "height":源图片高度
}

注意:源图片宽高获取方式 list($width, $height) = getimagesize($_FILES["img"]["tmp_name"]);

失败时

{
 "status":"error",
 "message":"这里是你的失败提示信息"
}

cropUrl

接下来是裁切图片的请求,基本使用

var cropperOptions = {
  uploadUrl:'裁切后请求的地址',
  uploadData:{
   "dummyData":1,
   "dummyData2":"text"
  }
}
var cropperHeader = new Croppic('yourId', cropperOptions);

请求php的参数基本如下:

php+croppic.js实现剪切上传图片功能 

php 端使用 nezamy/route 的request类获取croppic.js裁切后发送过来的参数

$request = app('request');
// 上传服务器的图片路径
$imgUrl = $request->body['imgUrl'];
// 原始图片宽高
$imgInitW = $request->body['imgInitW'];
$imgInitH = $request->body['imgInitH'];
// 新缩放的图片宽高
$imgW = $request->body['imgW'];
$imgH = $request->body['imgH'];
// 与缩放图像相关的裁剪图像的左上角
$imgY1 = $request->body['imgY1'];
$imgX1 = $request->body['imgX1'];
// 裁剪图像宽高
$cropW = $request->body['cropW'];
$cropH = $request->body['cropH'];
// 角度
$angle = $request->body['rotation'];

其他参数就不用介绍了,文档上面可以看,如果看不懂或者不太清晰的可以直接下载案例做参照,比文档要详细些。接下来的重头戏在php端的处理。

PHP 各种操作图片GD库

$temp_name    = "crop_temp_" . uniqid();
$temp_path    = sys_get_temp_dir() . "/";
$output_filename = $temp_path . $temp_name;
$what      = getimagesize($imgUrl);
// 创建画布并载入图像
switch (strtolower($what['mime'])) {
  case 'image/png':
    $source_image = imagecreatefrompng($imgUrl);
    $type     = '.png';
    break;
  case 'image/jpeg':
    $source_image = imagecreatefromjpeg($imgUrl);
    $type     = '.jpeg';
    break;
  case 'image/gif':
    $source_image = imagecreatefromgif($imgUrl);
    $type     = '.gif';
    break;
  default:
    throw new \Exception('不支持的图片类型');
}
if (!is_writable(dirname($output_filename))) {
  throw new \Exception('文件无法写入');
}
// 创建一幅真彩色的图像,从而支持更为丰富的色彩,gif文件不可使用
$resizedImage = imagecreatetruecolor($imgW, $imgH);
if ($type == '.png') {
  // 将黑色定义为透明色
  imagecolortransparent($resizedImage, imagecolorallocate($resizedImage, 0, 0, 0));
}
imagecopyresampled($resizedImage, $source_image, 0, 0, 0, 0, $imgW, $imgH, $imgInitW, $imgInitH);
// 旋转图像
$rotated_image = $angle ? imagerotate($resizedImage, -$angle, 0) : $resizedImage;
// 获取图像宽高
$rotated_width = imagesx($rotated_image);
$rotated_height = imagesy($rotated_image);
// 旋转后 - 缩放后
$dx = $rotated_width - $imgW;
$dy = $rotated_height - $imgH;
// 裁剪旋转后的图片到图像
$cropped_rotated_image = imagecreatetruecolor($imgW, $imgH);
if ($type == '.png') {
  // 设置黑色为透明
  imagecolortransparent($cropped_rotated_image, imagecolorallocate($cropped_rotated_image, 0, 0, 0));
}
imagecopyresampled($cropped_rotated_image, $rotated_image, 0, 0, $dx / 2, $dy / 2, $imgW, $imgH, $imgW, $imgH);
// 剪切图像到规定区域
$final_image = imagecreatetruecolor($cropW, $cropH);
if ($type == '.png') {
  imagecolortransparent($final_image, imagecolorallocate($final_image, 0, 0, 0));
}
imagecopyresampled($final_image, $cropped_rotated_image, 0, 0, $imgX1, $imgY1, $cropW, $cropH, $cropW, $cropH);
// 最后输出图像到文件,就可以直接使用file_get_content('output_filename'.$type)获取图片了
imagepng($final_image, $output_filename . $type);
/**
 * 这里需要进行上传服务器操作
 */
echo json_encode([
  'status' => 'success',
  'url'  => $output_filename . $type,
]);
// 最后删除缓存图片
//unlink($output_filename . $type);

JS各种配置

var crop_image_src = 'image_src';
  var croppedOptions = {
    cropUrl: 'http://deng.com/m/tool/crop_pic/crop',
    modal: true,
    doubleZoomControls: false,
    enableMousescroll: true,
    imgEyecandyOpacity: 0.4,
    rotateFactor: 90,
    zoomFactor: 20,
    outputUrlId: 'image_input',
    // loadPicture: '加??D片',
    processInline: true,
    loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> ',
    onBeforeImgUpload: function () {
      crop_image_src = $('#image_input').val();
    },
    onAfterRemoveCroppedImg: function () {
      var res = confirm('您是要使用原图还是清除图片?\n\r[确认]使用原图,[取消]清除图片');
      if (res) {
        $('#image_input').val(crop_image_src);
        $('#cropContainerEyecandy').prepend('<img class="croppedImg" src=' + crop_image_src + ' width="100%">');
      } else {
        $('#image_input').val('');
        $('.croppedImg').remove();
      }
    },
    onReset: function () {
      var res = confirm('您是要使用原图还是清除图片?\n\r[确认]使用原图,[取消]清除图片');
      if (res) {
        $('#image_input').val(crop_image_src);
        $('#cropContainerEyecandy').prepend('<img class="croppedImg" src=' + crop_image_src + ' width="100%">');
      } else {
        $('#image_input').val('');
      }
    },
    onError: function (errormessage) {
      alert('onError:' + errormessage)
    }
  };
  var cropperBox = new Croppic('cropContainerEyecandy', croppedOptions);

总结

以上所述是小编给大家介绍的php+croppic.js实现剪切上传图片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 PHP
php 中文处理函数集合
Aug 27 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
PHP的全局错误处理详解
Apr 25 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
php面向对象程序设计入门教程
Jun 22 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 #PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 #PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 #PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 #PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 #PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 #PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 #PHP
You might like
谈谈PHP语法(5)
2006/10/09 PHP
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python 私有化操作实例分析
2019/11/21 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
新年联欢会主持词
2014/03/27 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
婚前协议书范本
2014/04/15 职场文书
音乐教师求职信范文
2015/03/20 职场文书
台风停课通知
2015/04/24 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
化验室安全管理制度
2015/08/06 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript