侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 8年前   334

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

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

http://www.croppic.net/

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

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

下载安装

 

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

基本使用

// css 部分#yourId {  width: 200px;  height: 150px;  position:relative; /* or fixed or absolute */}// html 部分
// 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 端使用 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: '加dD片',    processInline: true,    loaderHtml: '
', 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(''); } else { $('#image_input').val(''); $('.croppedImg').remove(); } }, onReset: function () { var res = confirm('您是要使用原图还是清除图片?\n\r[确认]使用原图,[取消]清除图片'); if (res) { $('#image_input').val(crop_image_src); $('#cropContainerEyecandy').prepend(''); } else { $('#image_input').val(''); } }, onError: function (errormessage) { alert('onError:' + errormessage) } }; var cropperBox = new Croppic('cropContainerEyecandy', croppedOptions);

总结

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

您可能感兴趣的文章:

  • 原生JS实现前端本地文件上传
  • JS实现可视化文件上传
  • js实现文件上传功能 后台使用MultipartFile
  • JS+Struts2多文件上传实例详解
  • vue.js 图片上传并预览及图片更换功能的实现代码
  • JavaScript使用享元模式实现文件上传优化操作示例
  • JS实现图片上传多次上传同一张不生效的处理方法
  • js实现图片上传并预览功能
  • vue.js图片转Base64上传图片并预览的实现方法
  • Angularjs实现多图片上传预览功能
  • JavaScript实现异步图像上传功能
  • SpringBoot+Vue.js实现前后端分离的文件上传功能
  • node.js自动上传ftp的脚本分享
  • JS实现的文件拖拽上传功能示例
  • Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
  • JS和Canvas实现图片的预览压缩和上传功能
  • JavaScript代码实现txt文件的上传预览功能
  • js 实现 input type="file" 文件上传示例代码
  • js实现上传图片预览的方法
  • Servlet+Jsp实现图片或文件的上传功能具体思路及代码
  • 上传图片预览JS脚本 Input file图片预览的实现示例
  • JS实现上传图片的三种方法并实现预览图片功能
  • js实现图片上传并正常显示
  • 一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
  • JS中使用FormData上传文件、图片的方法
  • 客户端js判断文件类型和文件大小即限制上传大小
  • js获取上传文件的绝对路径实现方法
  • 原生JS和jQuery版实现文件上传功能
  • 微信JSSDK上传图片
  • 简单实现js上传文件功能
  • JS文件上传神器bootstrap fileinput详解
  • js实现上传图片之上传前预览图片
  • Javascript图片上传前的本地预览实例
  • 学习使用AngularJS文件上传控件
  • JS简单实现文件上传实例代码(无需插件)
  • 分享5个好用的javascript文件上传插件


  • 上一条:
    浅谈Ruby on Rails的国际化
    下一条:
    Ruby中的迭代器详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    • 2025-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客