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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
PHP 动态随机生成验证码类代码
Apr 09 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php中require和require_once的区别说明
Feb 27 PHP
php实现两个数组相加的方法
Feb 17 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
由php if 想到的些问题
2008/03/22 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
php实现通过ftp上传文件
2015/06/19 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
密码强度检测效果实现原理与代码
2013/01/04 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Django之form组件自动校验数据实现
2020/01/14 Python
numba提升python运行速度的实例方法
2021/01/25 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
积极贯彻学习两会精神总结
2014/03/17 职场文书
2014年教师节寄语
2014/08/11 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
技术员个人工作总结
2015/03/03 职场文书
《正比例》教学反思
2016/02/23 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers