>웹 프론트엔드 >JS 튜토리얼 >jquery 이미지 캡처 도구 jquery.imagecropper.js_jquery

jquery 이미지 캡처 도구 jquery.imagecropper.js_jquery

WBOY
WBOY원래의
2016-05-16 18:29:481120검색

jquery 외에도 이 플러그인은 ui.draggable.js를 포함한 UI 라이브러리도 참조합니다.
ImageCropper 데모에는 asp.net 지원이 필요합니다. 테스트 통과
ImageCropper 다운로드http://www.jb51.net/jiaoben/25688.html
플러그인 사용법:

코드 복사 코드는 다음과 같습니다.

var imageCropper = $('#imgBackground').imageCropper()

이 플러그인은 src 속성이 있는 img 태그에만 적용된다는 점에 유의하세요.
플러그인이 출력하는 매개변수를 통해 서버 측 코드를 통해 이미지를 가로챌 수 있습니다. 예:
코드 복사 코드는 다음과 같습니다:

$('#imgCroppedImage').attr('src', 'CropImage.ashx?p=' imageCropper.settings.imagePath '&z= ' imageCropper.settings.zoomLevel '&t=' imageCropper.settings.top '&l=' imageCropper.settings.left '&w=' imageCropper.settings.width '&h=' imageCropper.settings.height '&' Math.random() );

asp.net 핸들러 CropImage.ashx:
코드 복사 코드는 다음과 같습니다.

public class CropImage : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string imgPath = Convert.ToString(context) .Request["p"]);
float ZoomLevel = Convert.ToSingle(context.Request["z"])
int top = Convert.ToInt32(context.Request["t"]); 🎜>int left = Convert.ToInt32(context.Request["l "]);
int width = Convert.ToInt32(context.Request["w"])
int height = Convert.ToInt32(context) .Request["h"]);
context.Response .ContentType = "image/jpeg";
Crop(HttpContext.Current.Server.MapPath(imgPath), ZoomLevel, 상단, 왼쪽, 너비, 높이) .WriteTo(context.Response.OutputStream);
}
public MemoryStream Crop(string imgPath, float ZoomLevel, int top, int left, int width, int height)
{
Image img = Image .FromFile(imgPath);
Bitmap bitmap = new Bitmap(width, height);
그래픽 g = Graphics.FromImage(bitmap)
g.DrawImage(img, new Rectangle(0, 0, width) , height), new Rectangle((int)(left / ZoomLevel) , (int)(top / ZoomLevel), (int)(width / ZoomLevel), (int)(height / ZoomLevel)), GraphicsUnit.Pixel)
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.드로잉.Imaging.ImageFormat.Jpeg)
img.Dispose()
bitmap.Dispose();
return ms;
}
public bool IsReusable
{
get
{
return false; 🎜>}


소스 코드 주석이 비교적 완전하기 때문에 초점은 플러그인에 있습니다. 코드는 여기에 직접 게시됩니다.



복사 코드
코드는 다음과 같습니다.

/**
* Copyright (c) 2010 Viewercq (http://www.cnblogs.com/viewercq/archive/2010/04/04/1704093.html)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Version: 1.0
*
* Demo: https://dl.dropbox.com/u/4390741/ImageCropper.htm
*/
; (function($) {
$.fn.extend({
imageCropper: function(options) {
if (!this.is('img') || typeof this.attr('src') == 'undefined' || this.attr('src') == '') {
throw 'Please notice that this jquery plguin only could be applied to img and the src of img could not be null!';
}
var defaults = {
//原图路径
imagePath: this.attr('src'),
//缩放级别
zoomLevel: 1,
//图片相对于截取框是否居中
center: false,
//截取框与图片的相对位置
left: 0, top: 0,
//截取框的大小
width: 200, height: 200,
//工作区大小
cropWorkAreaSize: { width: 600, height: 400 },
//截取框相对于工作区的位置
cropFrameRect: { center: true, top: 0, left: 0 },
//缩放范围
zoom: { min: 0, max: 2, step: 0.01 },
//回调函数
callbacks: {
//移动图片后
dragging: false,
//缩放后
zoomed: false
}
};
if (options) {
defaults = $.extend(defaults, options);
}
return new imageCropper(this, defaults);
}
});
function imageCropper(image, settings) {
this.init(image, settings);
};
imageCropper.prototype = {
settings: false,
wrapper: $('
'),
zoomWrapper: $('
'),
img: false,
init: function(image, settings) {
var context = this;
this.settings = settings;
image.addClass('background-img');
//生成html
image.wrap(this.wrapper).wrap('
').wrap('
');
this.wrapper = $('.image-cropper-wrapper');
$('.crop-work-area', this.wrapper).append('
');
this.wrapper.append(this.zoomWrapper);
$('.image-cropper-wrapper', this.wrapper).disableSelection();
this.reset();
//그림 이미지
$('.crop-Background', this.wrapper).draggable({
containment: $('.drag-containment', this.wrapper),
cursor: 'move',
drag: function(event, ui) {
var self = $(this).data('draggable')
//同时移动前景图
$ ('.foreground-img', this.wrapper).css({
left: (parseInt(self.position.left) - context.settings.cropFrameRect.left - 1) 'px',
top: (parseInt(self.position.top) - context.settings.cropFrameRect.top - 1) 'px'
});
//得到截图左上点坐标
context.settings.left = context. settings.cropFrameRect.left -parseInt($(this).css('left'));
context.settings.top = context.settings.cropFrameRect.top -parseInt($(this).css('top' ));//사진 콜백
context.fireCallback(context.settings.callbacks.draging)
}
});
$('.foreground-img', this.wrapper).draggable({
containment: $('.drag-containment', this.wrapper),
cursor: 'move',
drag: function(event, ui) {
var self = $(this).data('draggable');
//同时移动背景
$('.crop-Background', this. 래퍼).css({
왼쪽: (parseInt(self.position.left) context.settings.cropFrameRect.left 1) 'px',
top: (parseInt(self.position.top) context.settings .cropFrameRect.top 1) 'px'
});
//得到截图左上点坐标
context.settings.left = context.settings.cropFrameRect.left -parseInt($('.crop- background', this.wrapper).css('left'));
context.settings.top = context.settings.cropFrameRect.top -parseInt($('.crop-Background', this.wrapper).css ('top'));
//移动图그림적 콜백
context.fireCallback(context.settings.callbacks.draging)
}
});
//点击缩放
$('.zoom-out-button,.zoom-in-button', this.wrapper).click(function() {
var step = $(this). hasClass('zoom-in-button') ? context.settings.zoom.step : -context.settings.zoom.step;
var tempZoomLevel = context.formatNumber(context.settings.zoomLevel step, 3); >//如果缩放级别超伩放导致图文右下角没在截取框内 则取消缩放
if (context.settings.zoomLevel >= context.settings.zoom.min
&& context.settings. ZoomLevel <= context.settings.zoom.max
&& parsInt($('.crop-ground', this.wrapper).css('left')) tempZoomLevel * context.img.width > .cropFrameRect.left context.settings.width
&& parsInt($('.crop-Background', this.wrapper).css('top')) tempZoomLevel * context.img.height > .top context.settings.height
) {
context.settings.zoomLevel = tempZoomLevel;
context.zoom(context.img.width * context.settings.zoomLevel, context.img.height * context. settings.zoomLevel);
$('.zoom-scroller', this.wrapper).css('left', context.settings.zoomLevel * 200 / (context.settings.zoom.max - context.settings.zoom .min) 'px');
}
context.fireCallback(context.settings.callbacks.zoomed);
});
//滚动条缩放
var cancelZoomScroll = false;
$('.zoom-scroller', this.wrapper).draggable({
containment: $('.zoom-scrollbar', this.wrapper),
축: 'x',
드래그: function(event, ui) {
var tempZoomLevel = (context.settings.zoom.max - context.settings.zoom.min) *parseInt($(this).css('left')) / 200 ;; this.wrapper).css('왼쪽 ')) tempZoomLevel * context.img.width > context.settings.cropFrameRect.left context.settings.width
&&parseInt($('.crop-Background', this.wrapper).css('top') ) tempZoomLevel * context.img.height > context.settings.cropFrameRect.top context.settings.height
) {
context.settings.zoomLevel = tempZoomLevel
context.zoom(context.img.width) * context.settings.zoomLevel, context.img.height * context.settings.zoomLevel);
cancelZoomScroll = false;
context.fireCallback(context.settings.callbacks.zoomed)
else {
cancelZoomScroll = true;
}
},
stop: function(event, ui) {
//如果缩放级别无效 则重置滚动条的值
if (cancelZoomScroll) {
$('.zoom-scroller', this.wrapper).css('left', context.settings.zoomLevel * 200 / (context.settings.zoom.max - context.settings.zoom. 최소) 'px');
}
}
});
},
reset: function() {
this.img = new Image();
this.img.src = this.settings.imagePath;
//截取框大于工작품区,则放大工작품
var tempSize = {
width: Math.max(this.settings.cropWorkAreaSize.width, this.settings.width),
height : Math.max(this.settings.cropWorkAreaSize.height, this.settings.height)
};
//캡처 프레임이 작업 공간 중앙에 있는 경우 캡처 프레임의 위치를 ​​재설정합니다.
if (this.settings.cropFrameRect.center) {
this.settings.cropFrameRect.left = (tempSize . width - this.settings.width) / 2;
this.settings.cropFrameRect.top = (tempSize.height - this.settings.height) / 2;
}
//캡처 프레임 이미지에 있음 If (this.settings.center) {
this.settings.left = (this.img.width * this.settings.zoomLevel - this.settings .width) /
this.settings; .top = (this.img.height * this.settings.zoomLevel - this.settings.height) / 2
}
this.wrapper.width( tempSize.width 2).height(tempSize.height 25 );
$('.foreground-img,.Background-img', this.wrapper).attr('src', this.settings.imagePath); , this.wrapper).width(tempSize.width).height(tempSize.height);
$('.crop-frame', this.wrapper).css ({
왼쪽: this.settings.cropFrameRect .left 'px',
top: this.settings.cropFrameRect.top 'px',
width: this.settings.width 'px',
height: this.settings.height 'px'
});
$('.foreground-img', this.wrapper).css({
left: (-this.settings.cropFrameRect.left - 1) 'px',
top : (-this.settings.cropFrameRect.top - 1) 'px'
})
$('.zoom-scroller', this.wrapper) .css('left', this.settings.zoomLevel * 200 / (this.settings.zoom.max - this.settings.zoom.min) 'px')
$('.crop-Background', this .wrapper).css({
불투명도: 0.3,
왼쪽: this.settings.cropFrameRect.left - this.settings.left 'px',
top: this.settings.cropFrameRect.top - this .settings.top 'px'
}) ;
$('.foreground-img', this.wrapper).css({
left: -this.settings.left 'px',
top: -this.settings.top 'px'
});
this.settings.left = this.settings.cropFrameRect.left - parsInt($('.crop-Background', this.wrapper) .css('left')); this.settings.top = this.settings.cropFrameRect.top - parsInt($('.crop-Background', this.wrapper).css('top'))
this.zoom(this.img.width * this.settings.zoomLevel, this.img.height * this.settings.zoomLevel);
},
zoom: function(width, height) {
$('.crop-Background, .Background) -img, .foreground-img', this.wrapper).width(width).height(height);
//드래그 제한 상자 조정
$ ('.drag-containment', this.wrapper) .css({
왼쪽: this.settings.cropFrameRect.left this.settings.width - this.settings.zoomLevel * this.img.width 1 'px',
top: this.settings.cropFrameRect.top this.settings.height - this.settings.zoomLevel * this.img.height 1 'px',
width: 2 * this.settings.zoomLevel * this.img .width - this.settings.width 'px',
높이: 2 * this.settings.zoomLevel * this.img.height - this.settings.height 'px'
})
},
formatNumber: 함수(숫자, 비트) {
return Math.round(숫자 * Math.pow(10, 비트)) / Math.pow(10, 비트)
},
fireCallback : function(fn) {
if ($ .isFunction(fn)) {
fn.call(this)
}
})(jQuery );
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.