jQuery照片图像剪裁插件Jcrop中文翻译详解

这篇文章发布于 2009年11月13日,星期五,10:32,归类于 外文翻译。 阅读 160783 次, 今日 3 次 22 条评论

 

可以看做废话的部分

一般来讲,图片的剪裁功能多用在生成缩略图以及生成头像。还在两三年前吧,剪裁这一功能还是较陌生的,例如人人网(原校内外)有些老用户的头像的尺寸可以说明这一点,那个时候剪裁技术少,未兴起,网站的头像是限定高度或宽度的,而没有像近几年这样限定高宽比例以及尺寸的,所以一些老用户的老头像的就是扁的。

使用限定大小的剪裁技术好处在于开发维护方便了,因为头像的尺寸统一了,我们做前端的有些事情就好办了。比如说,要给照片添加圆角投影效果,一旦照片尺寸固定,直接根据大小量身做一张圆角投影的背景图就可以了。例如下面开心网头像的圆角投影效果。

开心网首页圆角投影头像截图

如果照片各个比例的都有,那么这个高宽固定的背景图片就显得捉襟见肘,碍手碍脚的。要想在各个比例图片下显示良好,则需要自适应技术,那需要的技术成本就高了。本文主要讲jQuery插件的,所以对于如何使用css实现自适应图片大小的圆角投影效果这里就不做说明了。

回到正题,要实现图片的剪裁,方法多种多样,例如目前人人网就是通过在一个大小限死的div格子内移动一个头像缩略图实现的,这样的好处是代码简单了很多,实现也容易了;开心网则通过移动大图与控制大图的显示比例实现头像剪裁的,好处在于易上手;而最近挺火的新浪微博的头像生成就是采用改变选区大小+终图预览方式实现,而本文要讲解的这款图片剪裁的jQuery插件Jcrop的效果表现就与新浪微博的一致,当然,从UI上来讲,要比新浪微博的舒服多了。(下图为新浪微博头像剪裁截图,请原谅我拿鄙人的陋照做演示)

新浪微博头像剪裁界面截图

其实,图片剪裁jQuery插件不少,但其中实现原理有差异,从HTML显示上讲,本文所演示的这个Jcrop插件是比较简单易懂的,其余一类插件的黑色半透明外围背景是通过上下左右四个<div>组装成了,其实无需如此麻烦,只需要上下两层图片,通过控制上层表现图片的大小和位移即可,而这款Jcrop插件就是如此实现的,如果您有兴趣,可以研究下实现原理的。也正由于这个原理,所以这款插件才有另外一个很有趣也实现的扩展功能——改变外围图片——其实就是将底层图片替换。

本文最关键的部分

我已经制作了非常详细的Demo演示与讲解页面,所以对于演示或讲解的重点不在本文,而在Demo上,本文可以说是一个leader,引导者,指引如何在最短的时间内消化与上手这款优秀的插件。

1、Demo页面共有7个页面,一个首页,起导航作用,链接至5个静态演示页面,以及一个php动态演示页面。每个具体的Demo页面都有一个回到首页的链接,方便跳转。
2、5个静态页面的复杂度,使用难易程度逐渐提升,方便循序渐进的掌握此插件,从最简单的类似”Hello,word!”程度的用法,到一些基本事件处理程度,再到初级、高级API的使用。源文件中JavaScript代码部分有比较详尽的中文注释,对照效果,相信很快就会上手的。
3、php动态页面演示了如何生成终缩略图,但是没有演示存储到数据库,一是必要性,而是安全。在此页面上,只要在大图上划定一个选区,单击“确认剪裁”按钮,就可以看到效果了。

您可以狠狠地单击这里:中文Demo实例页面 | 中文版源文件下载(有删改 .zip 149K)

额外补充的部分

关于此插件其他一些细节就不在这里叙述了,很多,不过Demo已经比较详尽的展示了这款插件,这里说多了,反而显得啰嗦。我已经提到过,图片剪裁的插件不止本文的Jcrop这一款,如果您觉得Jcrop不合您的胃口,您也可以试试下面两种图片照片剪裁插件:
1、Image Upload and Auto Crop
您可以单击这里: 项目主页 | Demo演示 | 打包下载(V1.2)
2、imgAreaSelect
您可以单击这里: 项目主页 | Demo演示 | 打包下载(v0.7)

最后的废话

我提供的源文件与原项目提供的源文件在形式上还是有不少差异的,不是单纯的英文换成中文,界面有改动,HTML代码,翻译,注释,JavaScript代码等都有改动。为了是更加方便的理解,生搬硬套是不可取的,本地化很重要。
然而,我初生小犊,才疏学浅,且时间仓促,所以在源文件中或demo上难免会出现书写,翻译甚至一些语句的错误,欢迎指正,也希望多多包涵。
Jcrop是款很不错的照片剪裁插件,希望我做的些工作能够对您的学习或是工作有所帮助。

(本篇完)

分享到:


发表评论(目前22 条评论)

  1. 同时画多个区说道:

    请教楼主,怎么同时在一张图上画多个选区?

  2. 梅耀向说道:

    你好! 当我 第一次上传图裁剪没有问题,第二次上传图片的时候发现缩略图出不来了

  3. kaidalizi说道:

    楼主,请教个问题,我在用这个插件的时候,是用的弹窗,弹窗固定大小,图片大的时候就出现滚动条,但是在点击图片中间的时候,鼠标就跑掉,固定不了这个选择框,楼主有没有遇到呢?

  4. zona说道:

    你好,图片过大的话,如将图片通过样式按比例缩小,裁剪出来的图片不是你选择的的那个区域。

  5. hello说道:

    噢,搞定了。

  6. hello说道:

    这个可以设置选框成固定比例嘛

  7. okool说道:

    动态加载更换图片和尺寸后插件不正常,图片大于选择框时会失效。
    这个插件只适合截取限定大小范围的图片,对于与目标差别很大小就无能为力。只能重新修改插件。

  8. 夜来香说道:

    看完顶一下.哈哈

  9. wenyejie说道:

    非常好,非常感谢你的文章

  10. dong说道:

    Good Job !

  11. windforce说道:

    两次图片比例不同的情况可以解决吗?我是用弹出层放置jcrop,比如第一次放置的图片比例为1:5,然后未作裁切或做了裁切,第二次再点开弹出层选择一张2:3的图片,预览区的比例就会出错,仍然是1:5的比例,附代码:
    success:function(responseText){
    if (jcrop_api) { //若之前创建了jcrop对象则销毁
    jcrop_api.destroy();
    }
    if(responseText[‘mark’]==’correct’)
    {
    $(‘#target’).attr(‘src’, responseText[‘cont’]); //responsetext为图片路径 赋给target和preview
    $(‘#preview’).attr(‘src’, responseText[‘cont’]);
    $(‘#target’).Jcrop({
    onChange: updatePreview,
    onSelect: updatePreview,
    allowSelect: false,
    aspectRatio: 1 / 1,
    setSelect: [0, 0, 100, 100]
    }, function(){
    jcrop_api = this;
    jcrop_api.setImage(responseText[‘cont’]);
    var bounds = jcrop_api.getBounds();
    boundx = bounds[0];
    boundy = bounds[1];
    jcrop_api.setOptions({
    onChange: updatePreview,
    onSelect: updatePreview,
    aspectRatio: 1 / 1,
    setSelect: [0, 0, 100, 100]
    });
    });

  12. 小桥流水说道:

    ”•PHP页面下的剪裁示范“ 是动态的生成了缩略图,”•锁定纵横比/剪裁效果图预览“也是动态的生成了缩略图,一个是用纯js实现的,一个是用js+php实现的,仅仅是实现语言的不同吗?有什么其它的不一样吗?比方说效率方面的,谢谢。

  13. admin_li说道:

    貌似IE6有问题啊 我现在遇到了 刚测试你的demo和我遇到的一样啊

  14. mardy说道:

    这个插件有BUG 就是6楼所说的
    7楼的回答是不正确的 不要被误解 那样根本解决不了bug只改变了css里的高和宽怎么可能啊大哥
    需要对那张图用php处理 等比例缩放 然后返回到客户端再显示 这才能行
    我的和你们写法不一样 所以我发下代码 仅供参考
    $targetFolder = ‘/preview’; // Relative to the root
    if (!empty($_FILES[‘Filedata’])) {
    $tempFile = $_FILES[‘Filedata’][‘tmp_name’];
    $targetPath = $_SERVER[‘DOCUMENT_ROOT’] . $targetFolder;
    $targetFile = rtrim($targetPath,’/’) . ‘/’ .time().$_FILES[‘Filedata’][‘name’];

    // Validate the file type
    $fileTypes = array(‘jpg’,’jpeg’,’gif’,’png’); // File extensions
    $fileParts = pathinfo($_FILES[‘Filedata’][‘name’]);

    if (in_array($fileParts[‘extension’],$fileTypes)) {
    $result=move_uploaded_file($tempFile,$targetFile);
    if($result)
    {
    $thumbname=time().$_FILES[‘Filedata’][‘name’];//先获得原地址 然后处理图片后覆盖
    $src=$targetFile;
    $imginfo=getimagesize($src);
    $imtype=$imginfo[2];
    $imw=$imginfo[0];
    $imh=$imginfo[1];
    //缩放图
    if($imw>$imh){
    $timw=400;//如果宽比长 大 那么宽就等于400
    $bili=$imh/$imw;//获得比例
    echo $timh=$timw*$bili;//获得缩显图的高
    }
    else
    {
    $timh=400;//如果长比宽 大 那么长就等于400
    $bili=$imw/$imh;//获得比例
    $timw=$timh*$bili;//获得缩显图的宽
    }
    if($imw==$imh)
    {
    $imw=$imh=400;
    }
    switch ($imtype)
    {
    case 1:$img_r=imagecreatefromgif($src);break;
    case 2:$img_r=imagecreatefromjpeg($src);break;
    case 3:$img_r=imagecreatefrompng($src);break;
    case 6:$img_r=imagecreatefrombmp($src);break;
    case 15:$img_r=imagecreatefromwbmp($src);break;
    case 16:$img_r=imagecreatefromxbm($src);break;
    case IMG_XPM:$img_r=imagecreatefromxpm($src);break;
    }
    $suofang = ImageCreateTrueColor($timw,$timh);
    imagecopyresampled($suofang,$img_r,0,0,0,0,$timw,$timh,$imw,$imh);
    imagejpeg($suofang,$_SERVER[‘DOCUMENT_ROOT’].’/preview’.’/’.$thumbname,90);
    }
    $data[‘status’]=’1′;
    $data[‘filename’]=$thumbname; //返回处理后的图片名字
    echo json_encode($data);
    } else {
    echo ‘Invalid file type.’;
    }

  15. redlink说道:

    能否贴上如何 存储到数据库和本地的代码 不胜感激

  16. 6楼的解决方法挺简单;我是这么做的
    图片宽度高度均不会超过400px
    function imgresize(){
    headImage = new Image();
    headImage.src = $( ‘#cropbox’).attr( “src”);
    if(headImage.height<=400){
    zoomRatio=headImage.width/400;
    $('#cropbox').height(headImage.height/zoomRatio)
    $('#cropbox').width(400)
    }else{
    zoomRatio=headImage.height/400;
    $('#cropbox').height(400);
    $('#cropbox').width(headImage.width/zoomRatio);
    $('#headcontainer').css({height:"400px"});
    }
    }

    ————————–分界线————————————-

    请教博主一些问题

    我想裁剪的图片是用户通过html5拖拽上传至 浏览器上传到服务器 在加载 上传的这个图片的图片地址

    部分代码

    function imgcrop(i){
    $(".maskDiv").hide("fast");
    $('#dropbox').remove();
    $("#headUploadDone").show();
    $( '#headcontainer').empty();
    $( '#headcontainer').append("”);
    $( ‘#cropbox’).attr(“src”,”./images/avator/orginal/”+i);
    imgresize();
    $(‘#croppreview’).attr(“src”,”./images/avator/orginal/”+i);
    $(‘#f’).val(i);
    }
    结果发现图片加载了之后 jcrop 不工作了;

  17. guonsf说道:

    您好,Jcrop确实很好用,但是有一个很麻烦的问题,Jcrop好像没实现图片的容器控制,如果用户上传一个很大的图片,显示到界面以后会使布局混乱。
    这样可以在后台按比例不失真的缩减图片大小,比如1200*800,最后返回来300*200的大小。这样虽然能保持布局正常了,但是用户就不满意了,截取的时候发现反而不清晰了。
    不知道您有研究过没,如果Jcrop实现它来动态缩放图片,在截取计算实际长宽时再按相同比例扩大。或者为图片增加一个容器,使图片可在容器内移动,类似于CropZoom,http://www.gastonrobledo.com.ar/cropzoom/index.html。

  18. Jcrop在IE6下面的问题。说道:

    我发现Jcrop在IE6下面只改变高度会出现一个Bug。
    在官网中没发现这个问题。
    我对比源文件后发现应该是网页 跟xmlns定义的问题

    官网上面是没有定义这些内容。。在他的示例中确实没有发现问题。
    但是自己操作的时候就出现了问题。包括博主你的示例

  19. 关于Jcrop裁剪问题说道:

    我把图片剪裁的页面用一个单独的页面,然后在其他用到的地方用$(“#div”).load(“pic.html”);去调用,但是在裁剪的时候,选取的区域在拉动浏览器滚动条后会出现选择区域出现偏差。

  20. lnx说道:

    我也有用到这个插件,但该plugin好像不支持多变形图像的截取,只支持矩形,不知你是否研究过?