欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

裁剪图片并上传

程序员文章站 2022-03-02 12:48:36
...

转载自: https://blog.csdn.net/weixin_38023551/article/details/78792400


<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>裁剪图片</title>
<link href="https://cdn.bootcss.com/cropper/3.1.3/cropper.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<style>
        .row{
            margin-bottom: 5px;
        }
        #photo {
            max-width: 100%;
        }
        .img-preview {
            width: 100px;
            height: 100px;
            overflow: hidden;
        }
        button {
            margin-top:10px;
        }
        #result {
            width: 150px;
            height: 150px;
        }
</style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-sm-12 text-center">
            <label for="input" class="btn btn-danger" id="">
            <span>选择图片</span>
            <input type="file" id="input" class="sr-only">
            </label>
        </div>
    </div>
    <div class="row">
        <div class="col-sm-6 col-sm-offset-2">
            <img src="" id="photo">
        </div>
        <div class="col-sm-2">
            <div>
                <p>
                    预览(100*100):
                </p>
                <div class="img-preview">
                </div>
            </div>
            <button class="btn btn-primary" onclick="crop()">裁剪图片</button>
            <div>
                <br/>
                <p>
                    结果:
                </p>
                <img src="" alt="裁剪结果" id="result">
            </div>
        </div>
    </div>
</div>
<!-- Scripts -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/cropper/3.1.3/cropper.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
	// 修改自官方demo的js
	var initCropper = function (img, input){
		var $image = img;
		var options = {
			aspectRatio: 140/37, // 纵横比
			viewMode: 2,
			restore: true,  //在调整窗口大小后恢复裁剪的区域
			movable: true,  //是否允许可以移动后面的图片
			center: true,   //裁剪框在图片正中心
			scalable: true, //是否允许缩放图像
			zoomable: true, //是否允许放大图像
			cropBoxResizable: false,  //不允许改变裁切框大小
			toggleDragModeOnDblclick: true, //点击两次时可以在“crop”和“move”之间切换拖拽模式
			minCropBoxWidth: 140,   	     //裁剪层的最小宽度
			minCropBoxHeight: 37, 			 //裁剪层的最小gao度
			autoCropArea: 140/37, //定义自动裁剪面积大小(百分比)和图片进行对比
			//dragMode:move,
			preview: '.img-preview' // 预览图的class名
			//crop: function (e) {
			//	console.log("正在调试"+e);
			//}
		};
		$image.cropper(options);
		var $inputImage = input;
		var uploadedImageURL;
		if (URL) {
			// 给input添加监听
			$inputImage.change(function () {
				var files = this.files;
				var file;
				if (!$image.data('cropper')) {
					return;
				}				
				if (files && files.length) {
					file = files[0];
					// 判断是否是图像文件
					if (/^image\/\w+$/.test(file.type)) {
						// 如果URL已存在就先释放
						if (uploadedImageURL) {
							URL.revokeObjectURL(uploadedImageURL);
						}
						uploadedImageURL = URL.createObjectURL(file);
						// 销毁cropper后更改src属性再重新创建cropper
						$image.cropper('destroy').attr('src', uploadedImageURL).cropper(options);
						$inputImage.val('');
					} else {
					  window.alert('请选择一个图像文件!');
				  }
			  }
		  });
		} else {
			$inputImage.prop('disabled', true).addClass('disabled');
		}
	}
	var crop = function(){
		var $image = $('#photo');
		var $target = $('#result');
		$image.cropper('getCroppedCanvas',{
			width:140, // 裁剪后的长宽
			height:37
		}).toBlob(function(blob){
			// 裁剪后将图片放到指定标签
			$target.attr('src', URL.createObjectURL(blob));
		});
	}
	$(function(){
		initCropper($('#photo'),$('#input'));
	});
</script>
</body>
</html>

带模态框的第二个:


<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>上传头像</title>
<link href="https://cdn.bootcss.com/cropper/3.1.3/cropper.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
    #up_logo_box{
        text-align: center;
    }
    #up_logo_box #user-photo {
        width:300px;
        height:300px;
        margin-top: 10px;
    }
    #up_logo_box #photo {
        max-width:100%;
        max-height:350px;
    }
    #up_logo_box .img-preview-box {
        text-align: center;
    }
    #up_logo_box .img-preview-box > div {
        display: inline-block;;
        margin-right: 10px;
    }
    #up_logo_box .img-preview {
        overflow: hidden;
    }
    #up_logo_box .img-preview-box .img-preview-lg {
        width: 150px;
        height: 150px;
    }
    #up_logo_box .img-preview-box .img-preview-md {
        width: 100px;
        height: 100px;
    }
    #up_logo_box .img-preview-box .img-preview-sm {
        width: 50px;
        height: 50px;
        border-radius: 50%;
    }
</style>
</head>
<body

	<div id="up_logo_box">	
		<button class="btn btn-primary" data-target="#changeModal" data-toggle="modal">打开</button><br/>
		<img id="user-photo" src="">	
	</div>	
	
	
	<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
	<script src="https://cdn.bootcss.com/cropper/3.1.3/cropper.min.js"></script>
	<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
	
	<script type="text/javascript">
		var initCropperInModal = function(img, input, modal){
			var $image = img;
			var $inputImage = input;
			var $modal = modal;
			var options = {
				//aspectRatio: 1, // 纵横比
				aspectRatio: 140/37, // 纵横比
				viewMode: 2,
				preview: '.img-preview' // 预览图的class名
			};
			// 模态框隐藏后需要保存的数据对象
			var saveData = {};
			var URL = window.URL || window.webkitURL;
			var blobURL;
			$modal.on('show.bs.modal',function () {
				// 如果打开模态框时没有选择文件就点击“打开图片”按钮
				if(!$inputImage.val()){
					$inputImage.click();
				}
			}).on('shown.bs.modal', function () {
				// 重新创建
				$image.cropper( $.extend(options, {
					ready: function () {
						// 当剪切界面就绪后,恢复数据
						if(saveData.canvasData){
							$image.cropper('setCanvasData', saveData.canvasData);
							$image.cropper('setCropBoxData', saveData.cropBoxData);
						}
					}
				}));
			}).on('hidden.bs.modal', function () {
				// 保存相关数据
				saveData.cropBoxData = $image.cropper('getCropBoxData');
				saveData.canvasData = $image.cropper('getCanvasData');
				// 销毁并将图片保存在img标签
				$image.cropper('destroy').attr('src',blobURL);
			});
			if (URL) {
				$inputImage.change(function() {
					var files = this.files;
					var file;
					if (!$image.data('cropper')) {
						return;
					}
					if (files && files.length) {
						file = files[0];
						if (/^image\/\w+$/.test(file.type)) {
		 
							if(blobURL) {
								URL.revokeObjectURL(blobURL);
							}
							blobURL = URL.createObjectURL(file);
		 
							// 重置cropper,将图像替换
							$image.cropper('reset').cropper('replace', blobURL);
		 
							// 选择文件后,显示和隐藏相关内容
							$('.img-container').removeClass('hidden');
							$('.img-preview-box').removeClass('hidden');
							$('#changeModal .disabled').removeAttr('disabled').removeClass('disabled');
							$('#changeModal .tip-info').addClass('hidden');
		 
						} else {
							window.alert('请选择一个图像文件!');
						}
					}
				});
			} else {
				$inputImage.prop('disabled', true).addClass('disabled');
			}
		}
	 
		var sendPhoto = function(){
			$('#photo').cropper('getCroppedCanvas',{
				width:300,
				height:300
			}).toBlob(function(blob){
				// 转化为blob后更改src属性,隐藏模态框
				$('#user-photo').attr('src',URL.createObjectURL(blob));
				$('#changeModal').modal('hide');
			});
		}
	 
		$(function(){
			initCropperInModal($('#photo'),$('#photoInput'),$('#changeModal'));
		});
	</script>
</body>
</html>

<div class="modal fade" id="changeModal" tabindex="-1" role="dialog" aria-hidden="true">		
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
				<h4 class="modal-title text-primary">
				<i class="fa fa-pencil"></i>
							更换头像
				</h4>
			</div>
			<div class="modal-body">
				<p class="tip-info text-center">
					未选择图片
				</p>
				<div class="img-container hidden">
					<img src="" alt="" id="photo">
				</div>
				<div class="img-preview-box hidden">
					<hr>
					<span>150*150:</span>
					<div class="img-preview img-preview-lg">
					</div>
					<span>100*100:</span>
					<div class="img-preview img-preview-md">
					</div>
					<span>30*30:</span>
					<div class="img-preview img-preview-sm">
					</div>
				</div>
			</div>
			<div class="modal-footer">
				<label class="btn btn-danger pull-left" for="photoInput">
				<input type="file" class="sr-only" id="photoInput" accept="image/*">
				<span>打开图片</span>
				</label>
				<button class="btn btn-primary disabled" disabled="true" onclick="sendPhoto();">提交</button>
				<button class="btn btn-close" aria-hidden="true" data-dismiss="modal">取消</button>
			</div>
		</div>
	</div>
</div>


相关标签: THML 图片裁切