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 相关文章推荐
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
php设计模式 Observer(观察者模式)
Jun 26 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
PHP两种快速排序算法实例
Feb 15 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
怎样搭建PHP开发环境
Jul 28 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 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查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
python处理按钮消息的实例详解
2017/07/11 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python安装教程
2018/02/28 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python第三方库学习笔记
2020/02/07 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
python之随机数函数的实现示例
2020/12/30 Python
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
股份合作协议书
2014/09/10 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS