这篇文章发布于 2009年11月13日,星期五,10:32,归类于 外文翻译。 阅读 160966 次, 今日 5 次 22 条评论
by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=359
原项目demo:http://deepliquid.com/projects/Jcrop/demos.php
可以看做废话的部分
一般来讲,图片的剪裁功能多用在生成缩略图以及生成头像。还在两三年前吧,剪裁这一功能还是较陌生的,例如人人网(原校内外)有些老用户的头像的尺寸可以说明这一点,那个时候剪裁技术少,未兴起,网站的头像是限定高度或宽度的,而没有像近几年这样限定高宽比例以及尺寸的,所以一些老用户的老头像的就是扁的。
使用限定大小的剪裁技术好处在于开发维护方便了,因为头像的尺寸统一了,我们做前端的有些事情就好办了。比如说,要给照片添加圆角投影效果,一旦照片尺寸固定,直接根据大小量身做一张圆角投影的背景图就可以了。例如下面开心网头像的圆角投影效果。
如果照片各个比例的都有,那么这个高宽固定的背景图片就显得捉襟见肘,碍手碍脚的。要想在各个比例图片下显示良好,则需要自适应技术,那需要的技术成本就高了。本文主要讲jQuery插件的,所以对于如何使用css实现自适应图片大小的圆角投影效果这里就不做说明了。
回到正题,要实现图片的剪裁,方法多种多样,例如目前人人网就是通过在一个大小限死的div格子内移动一个头像缩略图实现的,这样的好处是代码简单了很多,实现也容易了;开心网则通过移动大图与控制大图的显示比例实现头像剪裁的,好处在于易上手;而最近挺火的新浪微博的头像生成就是采用改变选区大小+终图预览方式实现,而本文要讲解的这款图片剪裁的jQuery插件Jcrop的效果表现就与新浪微博的一致,当然,从UI上来讲,要比新浪微博的舒服多了。(下图为新浪微博头像剪裁截图,请原谅我拿鄙人的陋照做演示)
其实,图片剪裁jQuery插件不少,但其中实现原理有差异,从HTML显示上讲,本文所演示的这个Jcrop插件是比较简单易懂的,其余一类插件的黑色半透明外围背景是通过上下左右四个<div>
组装成了,其实无需如此麻烦,只需要上下两层图片,通过控制上层表现图片的大小和位移即可,而这款Jcrop插件就是如此实现的,如果您有兴趣,可以研究下实现原理的。也正由于这个原理,所以这款插件才有另外一个很有趣也实现的扩展功能——改变外围图片——其实就是将底层图片替换。
本文最关键的部分
我已经制作了非常详细的Demo演示与讲解页面,所以对于演示或讲解的重点不在本文,而在Demo上,本文可以说是一个leader,引导者,指引如何在最短的时间内消化与上手这款优秀的插件。
您可以狠狠地单击这里:中文Demo实例页面 | 中文版源文件下载(有删改 .zip 149K)
额外补充的部分
关于此插件其他一些细节就不在这里叙述了,很多,不过Demo已经比较详尽的展示了这款插件,这里说多了,反而显得啰嗦。我已经提到过,图片剪裁的插件不止本文的Jcrop这一款,如果您觉得Jcrop不合您的胃口,您也可以试试下面两种图片照片剪裁插件:
1、Image Upload and Auto Crop
您可以单击这里: 项目主页 | Demo演示 | 打包下载(V1.2)
2、imgAreaSelect
您可以单击这里: 项目主页 | Demo演示 | 打包下载(v0.7)
最后的废话
我提供的源文件与原项目提供的源文件在形式上还是有不少差异的,不是单纯的英文换成中文,界面有改动,HTML代码,翻译,注释,JavaScript代码等都有改动。为了是更加方便的理解,生搬硬套是不可取的,本地化很重要。
然而,我初生小犊,才疏学浅,且时间仓促,所以在源文件中或demo上难免会出现书写,翻译甚至一些语句的错误,欢迎指正,也希望多多包涵。
Jcrop是款很不错的照片剪裁插件,希望我做的些工作能够对您的学习或是工作有所帮助。
本文为原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=359
(本篇完)
- 图片旋转+剪裁js插件(兼容各浏览器) (0.575)
- CSS clip:rect矩形剪裁功能及一些应用介绍 (0.531)
- CSS3/SVG clip-path路径剪裁遮罩属性简介 (0.510)
- 半深入理解CSS3 object-position/object-fit属性 (0.510)
- 微信网页悬浮窗交互效果的web实现 (0.510)
- jQuery Pagination Ajax分页插件中文详解 (0.469)
- jQuery图片文本滚动切换插件jCarousel中文翻译与详解 (0.429)
- jQuery-两款不同原理的圆角插件讲解 (0.429)
- jQuery Lightbox(balupton版)图片展示插件讲解 (0.429)
- 翻译-IE7/8@font-face嵌入字体与文字平滑 (0.327)
- 翻译 - CSS继承详解 (RANDOM - 0.212)
请教楼主,怎么同时在一张图上画多个选区?
你好! 当我 第一次上传图裁剪没有问题,第二次上传图片的时候发现缩略图出不来了
楼主,请教个问题,我在用这个插件的时候,是用的弹窗,弹窗固定大小,图片大的时候就出现滚动条,但是在点击图片中间的时候,鼠标就跑掉,固定不了这个选择框,楼主有没有遇到呢?
你好,图片过大的话,如将图片通过样式按比例缩小,裁剪出来的图片不是你选择的的那个区域。
噢,搞定了。
这个可以设置选框成固定比例嘛
动态加载更换图片和尺寸后插件不正常,图片大于选择框时会失效。
这个插件只适合截取限定大小范围的图片,对于与目标差别很大小就无能为力。只能重新修改插件。
看完顶一下.哈哈
非常好,非常感谢你的文章
Good Job !
两次图片比例不同的情况可以解决吗?我是用弹出层放置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]
});
});
”•PHP页面下的剪裁示范“ 是动态的生成了缩略图,”•锁定纵横比/剪裁效果图预览“也是动态的生成了缩略图,一个是用纯js实现的,一个是用js+php实现的,仅仅是实现语言的不同吗?有什么其它的不一样吗?比方说效率方面的,谢谢。
貌似IE6有问题啊 我现在遇到了 刚测试你的demo和我遇到的一样啊
这个插件有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.’;
}
能否贴上如何 存储到数据库和本地的代码 不胜感激
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 不工作了;
您好,Jcrop确实很好用,但是有一个很麻烦的问题,Jcrop好像没实现图片的容器控制,如果用户上传一个很大的图片,显示到界面以后会使布局混乱。
这样可以在后台按比例不失真的缩减图片大小,比如1200*800,最后返回来300*200的大小。这样虽然能保持布局正常了,但是用户就不满意了,截取的时候发现反而不清晰了。
不知道您有研究过没,如果Jcrop实现它来动态缩放图片,在截取计算实际长宽时再按相同比例扩大。或者为图片增加一个容器,使图片可在容器内移动,类似于CropZoom,http://www.gastonrobledo.com.ar/cropzoom/index.html。
我发现Jcrop在IE6下面只改变高度会出现一个Bug。
在官网中没发现这个问题。
我对比源文件后发现应该是网页 跟xmlns定义的问题
官网上面是没有定义这些内容。。在他的示例中确实没有发现问题。
但是自己操作的时候就出现了问题。包括博主你的示例
我把图片剪裁的页面用一个单独的页面,然后在其他用到的地方用$(“#div”).load(“pic.html”);去调用,但是在裁剪的时候,选取的区域在拉动浏览器滚动条后会出现选择区域出现偏差。
请问在所有浏览器下均是如此吗?
我也有用到这个插件,但该plugin好像不支持多变形图像的截取,只支持矩形,不知你是否研究过?
不好意思。多边形图像的剪裁我尚未遇到过,也没有这方面的研究。可能帮不上忙。