首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 图片裁剪上传 源码

图片裁剪上传是一个常见的前端功能,它允许用户在上传图片之前对其进行裁剪,以确保图片符合特定的尺寸或格式要求。以下是一个简单的JavaScript实现,使用了HTML5的Canvas API和FileReader API来实现图片的裁剪和上传。

基础概念

  • Canvas API: 提供了一个可以通过JavaScript脚本来绘制图形、动画等的HTML元素。
  • FileReader API: 允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用File或Blob对象指定要读取的文件或数据。
  • Blob: 表示不可变的原始数据的类文件对象。

优势

  1. 用户体验: 用户可以在上传前预览和调整图片,提高上传的准确性。
  2. 服务器负载: 减少不必要的数据传输,只上传裁剪后的图片。
  3. 灵活性: 可以根据需要裁剪成不同的尺寸和比例。

类型

  • 固定尺寸裁剪: 用户必须按照预设的尺寸裁剪图片。
  • 自由裁剪: 用户可以自由选择裁剪区域。
  • 比例裁剪: 用户必须按照特定的宽高比裁剪图片。

应用场景

  • 社交媒体: 用户上传头像或封面图时。
  • 电商平台: 商品图片上传时。
  • 新闻网站: 新闻图片上传时。

示例代码

以下是一个简单的图片裁剪上传的示例代码:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图片裁剪上传</title>
<style>
  #imagePreview {
    max-width: 100%;
    border: 1px solid #ccc;
  }
</style>
</head>
<body>

<input type="file" id="fileInput" accept="image/*">
<img id="imagePreview" src="#" alt="图片预览" style="display:none;">
<button onclick="uploadImage()">上传图片</button>

<script>
let startX, startY, endX, endY;
let image = new Image();
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');

document.getElementById('fileInput').addEventListener('change', function(event) {
  let file = event.target.files[0];
  let reader = new FileReader();
  
  reader.onload = function(e) {
    image.src = e.target.result;
    image.onload = function() {
      document.getElementById('imagePreview').src = this.src;
      document.getElementById('imagePreview').style.display = 'block';
    };
  };
  
  reader.readAsDataURL(file);
});

document.getElementById('imagePreview').addEventListener('mousedown', function(event) {
  startX = event.offsetX;
  startY = event.offsetY;
});

document.getElementById('imagePreview').addEventListener('mouseup', function(event) {
  endX = event.offsetX;
  endY = event.offsetY;
});

function uploadImage() {
  let width = Math.abs(endX - startX);
  let height = Math.abs(endY - startY);
  canvas.width = width;
  canvas.height = height;
  
  ctx.drawImage(image, startX < endX ? startX : endX, startY < endY ? startY : endY, width, height, 0, 0, width, height);
  
  let croppedImage = canvas.toDataURL('image/jpeg');
  
  // 这里可以添加代码将croppedImage发送到服务器
  console.log(croppedImage);
}
</script>

</body>
</html>

可能遇到的问题及解决方法

  1. 跨域问题: 如果图片来源于不同的域,可能会遇到跨域资源共享(CORS)问题。解决方法是确保图片服务器设置了正确的CORS头部。
  2. 性能问题: 大图片可能会导致性能问题。可以通过压缩图片或在服务器端进一步处理来解决。
  3. 兼容性问题: 不同浏览器对Canvas API的支持可能有所不同。可以通过特性检测来确保兼容性。

解决方法

  • CORS: 确保图片服务器设置了Access-Control-Allow-Origin头部。
  • 图片压缩: 使用canvas.toBlob方法在客户端压缩图片,或者在服务器端使用图像处理库进行压缩。
  • 特性检测: 使用Modernizr等库来检测浏览器对Canvas API的支持情况,并提供回退方案。

这个示例提供了一个基本的图片裁剪上传功能,实际应用中可能需要根据具体需求进行调整和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cropper.js 实现HTML5 裁剪图片并上传(裁剪上传头像。)「建议收藏」

************* 注: cropper.js 版本更新至1.5.11 。...**** 我的需求功能:在手机端实现上传头像,带裁剪框。 cropper.js 通过canvas实现图片裁剪,最后在通过canvas获取裁剪区域的图片base64串。...如 0.1 就是图片的10% crop(裁剪框)相关 aspectRatio 裁剪框比例 默认NaN 例如:: 1 / 1,//裁剪框比例 1:1 modal:类型:Boolean,默认值true...然后又把图片上传到七牛上面,发现可以使用二进制流上传,就不用jpg了 后台处理base64 java代码片段 /** * 上传base64 * @param imgBase64...3.HTML5 本地裁剪图片并上传至服务器(老梗) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140638.html原文链接:https://javaforall.cn

7.8K60
  • Android 图片裁剪 (附源码)

    Android 图片裁剪 前言 正文 一、创建并配置项目 二、权限申请 三、获取图片Uri 四、图片裁剪 五、源码 尾声 运行效果图 前言   图片裁剪是对图片进行区域选定,然后裁剪选定的区域,形成一个图片...四、图片裁剪 既然是调用Android系统的图片裁剪,那么自然也和打开系统相册差不多,依然是先创建一个请求码: /** * 图片剪裁请求码 */ public static...intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高...= null) { //在这里获得了剪裁后的Bitmap对象,可以用于上传 Bitmap image = bundle.getParcelable...Glide.with(this).load(image).apply(requestOptions).into(ivPicture); 运行一下: 五、源码 源码地址:PictureCroppingDemo

    1.8K30

    js拖拽上传图片

    有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传。...1、后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候,用Java的SpringMVC+MyBatis的框架写了一个简单的后台管理的一些接口,刚好有一个上传用户头像的接口,该接口是把上传后的图片存储在另外一台...Tomcat下,这里就直接使用这个接口来上传图片。...ie=edge"> Document js...里面用的formData对象来上传图片的,该对象的作用是:   1、用一些键值对来模拟一系列表单控件,即把form中所有表单元素的name与value组装成一个queryString;   2、异步上传二进制文件

    18.2K30

    前端:选取、预览、裁剪、上传、断点续传,关于图片上传那点事

    03 — 预览 以前在页面上实现预览功能,要么将图片上传到服务器上,拿到 url 再拉回本地,赋值给 img 显示;要么使用 Flash 技术。...img 组件接受并预览的图片地址。...04 — 裁剪 实现选取、裁剪图片部分区域的功能。...://github.com/satazor/js-spark-md5 这是一个在本地就可以给 Blog 对象签名生成唯一标识的类库,只要上传的是同一个文件,只要分段大小一致,网络断了再次上传,生成的标识也是一样的...每次上传完一个切片,就将标识存储在本地,页面刷新后先看看本地哪些分片已经上传过了。 — END — 2019 年冬天于北京 ---- ▼ 往期精选 ▼ JS是如何计算 1+1=2 的?

    1.6K40

    Android图片裁剪之自由裁剪

    是这种,客户须要做一个图片上传的功能,这个图片须要裁剪。一般而言,这东西用系统自带的裁剪就搞定了。但是客户不,他要能够自由裁剪,就是长宽比不固定,想裁成什么比例就裁成什么比例,我一听,蛋都碎了。   ...图片裁剪的功能系统自带了,和我的需求仅仅有一点不一样,就是它是固定宽高比的,设定了宽高比就不能再改变,而我须要自由宽高比。好吧,既然仅仅有这一点不一样,那给他改改即可了。   ...下载gallery的源代码,抽取裁剪功能的代码,如图 这基本就好了,然后CropImage.java里面有叉叉,自己改下就好了。...,我这里直接凝视掉,仅仅传一个要剪切图片的uri就能够。   ...然后怎么让他自由裁剪呢,看下mAspectX变量的使用,源代码里面用mAspectX和mAspectY来做宽高比计算的,我们就把他计算宽高比的地方凝视掉就好了。

    2.6K20

    js批量上传文件_批量上传图片java

    今天说一说js批量上传文件_批量上传图片java,希望能够帮助大家进步!!!...文件上传无疑是web应用中一个非常常用的功能,下面小编给大家分享一下diyUpload.js+ThinkPHP中的UploadFile类实现图片的批量上传。...,可以点击图片上的“X”按钮删除,如下: 页面上js代码如下: 此代码由Java架构师必看网-架构君整理 /* * 服务器地址,成功返回,失败返回参数格式依照jquery.ajax习惯...allowMagnify:false, // 是否允许裁剪。...‘开始上传’按钮上传图片,上传完成后页面展示如下图: 可以修改或者删除图片,也可以点击‘全选图片’按钮,批量删除图片,或者选择多张图片删除: PHP上传图片代码: 此代码由Java

    27.4K40
    领券