- 浏览: 335259 次
- 性别:
- 来自: 北京
文章分类
最新评论
jquery imgAeraSelect插件地址:http://odyniec.net/projects/imgareaselect/
原理很简单,就是将鼠标框住的区域两个定点坐标值传回服务器端,在服务器端用image magick处理。
由于rmagick存在内存泄露问题。这里选择了mini_magick。mini_magick是一个非常小的库,源代码不过300行。主要是通过调用系统命令行来处理图片。只要系统安装了image magick就可以。
view:主要是加四个隐藏域来传递裁剪区域。在form提交时候一起传递到服务器。
初始化裁剪框在待处理图片的中央和一些验证:
后台处理,主要就是做以下几件事情:
1.把上传来的照片压缩到200x200
2.通过content-type判断图片是否合法。以防用户自己改扩展名。
3.把gif和png格式转换成jpg,不然在裁剪时候后出问题。
4.裁剪
5.把裁剪后图片缩放成几种比例
效果预览:
纯中文也不一定可以吧,我目前发现“路”字,怎么写都是乱码……这可是常用字呢
你的表单是什么样子的?photo的class是HashWithIndifferentAccess说明你得到的不是File对象,没有read方法....
你把photo对象详细的打印出来就知道了。
<%=debug(@photo) %>
加文字没试过,但是如果有乱码可以先用Photoshop制作一个小图片用imagMagick的composite命令贴上去
原理很简单,就是将鼠标框住的区域两个定点坐标值传回服务器端,在服务器端用image magick处理。
由于rmagick存在内存泄露问题。这里选择了mini_magick。mini_magick是一个非常小的库,源代码不过300行。主要是通过调用系统命令行来处理图片。只要系统安装了image magick就可以。
view:主要是加四个隐藏域来传递裁剪区域。在form提交时候一起传递到服务器。
<input id="x1" type="hidden" value="0" name="x1"/> <input id="y1" type="hidden" value="0" name="y1"/> <input id="x2" type="hidden" value="150" name="x2"/> <input id="y2" type="hidden" value="150" name="y2"/>
初始化裁剪框在待处理图片的中央和一些验证:
<script type="text/javascript"> $(document).ready(function(){ var pos = initValue(); $('#avatar').imgAreaSelect({aspectRatio: '1:1', x1: pos.x1, y1: pos.y1, x2: pos.x2, y2: pos.y2, handles: true, onSelectEnd: function (img, selection) { $('input[name=x1]').val(selection.x1); $('input[name=y1]').val(selection.y1); $('input[name=x2]').val(selection.x2); $('input[name=y2]').val(selection.y2); } }); }); function initValue(){ var o = new Object(); var x = $("#avatar").width(); var y = $("#avatar").height(); var size = x >= y ? y : x; size = size >= 100 ? 100 : size; o.x1 = (x - size) / 2; o.y1 = (y - size) / 2; o.x2 = o.x1 + size; o.y2 = o.y1 + size; return o; } function checkImage(){ var image_name = $("#photo").val(); var reg = /\.png|jpeg|jpg|bmp|gif$/i if (reg.test(image_name)){ return true; }else if(image_name == "") { alert("没有选择图片!"); return false; }else{ alert("图片格式不正确!"); return false; } } </script>
后台处理,主要就是做以下几件事情:
1.把上传来的照片压缩到200x200
2.通过content-type判断图片是否合法。以防用户自己改扩展名。
3.把gif和png格式转换成jpg,不然在裁剪时候后出问题。
4.裁剪
5.把裁剪后图片缩放成几种比例
def upload_avatar if request.post? avatar_200_200 = RAILS_ROOT + "/public/files/avatar/200_200/" photo_name = "#{current_user.hash_id}.jpg" avatar_100_100 = RAILS_ROOT + "/public/files/avatar/100_100/" avatar_64_64 = RAILS_ROOT + "/public/files/avatar/64_64/" avatar_50_50 = RAILS_ROOT + "/public/files/avatar/50_50/" avatar_40_40 = RAILS_ROOT + "/public/files/avatar/40_40/" if params[:commit] == "上传照片" #TODO Validate Image Size! #TODO 增加白色背景,以防不规则图片! photo = params[:photo] raise "image type Error!" if photo.content_type !~ /^image\/.*?jpeg|jpg|png|bmp|gif$/i Dir.chdir avatar_200_200 img = MiniMagick::Image.from_blob(photo.read) img.format("jpg") if photo.content_type =~ /gif|png$/i img.resize "200x200" img.write photo_name redirect_to request.referer elsif params[:commit] == "保存设置" Dir.chdir avatar_200_200 if File.exist?(photo_name) width = params[:x2].to_i - params[:x1].to_i height= params[:y2].to_i - params[:y1].to_i img = MiniMagick::Image.open(photo_name) img.crop "#{width}x#{height}+#{params[:x1]}+#{params[:y1]}" img.resize 100 and Dir.chdir avatar_100_100 and img.write photo_name img.resize 64 and Dir.chdir avatar_64_64 and img.write photo_name img.resize 50 and Dir.chdir avatar_50_50 and img.write photo_name img.resize 40 and Dir.chdir avatar_40_40 and img.write photo_name end end end end
效果预览:
评论
26 楼
hexawing
2010-06-22
kamama 写道
请问有用mini_magick在图片上画中文字的么?
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
纯中文也不一定可以吧,我目前发现“路”字,怎么写都是乱码……这可是常用字呢
25 楼
guodong66
2010-06-11
不错哦, 支持。
24 楼
llfzy
2010-05-15
这功能不错。。。。我正需要
23 楼
rocheers
2010-04-07
我把<%=debug(@photo) %>加进表单里,不过打印出来的都是空……
这是我上传图片的表单
上面是我的controller里的跟上传图片有关的部分
之前看过你的回答后,我又修改了修改,但是无论怎么改都是不行,所以还是把原码给贴过来吧……
我把pic = params[:picture]换成pic = params[:picture][:uploaded_data]后pic的类型是Tempfile了,倒是可以用read了,但是还是报错,说pic里为空……不清楚是为什么……
我现在做的就是一个关于上传图片自动修改的项目,我的目的就是想让我上传的所有图片都按原比例变成一个分辨率,比如500x500,然后上下或左右加白边,加白边我看你之前给一个人的回答里有了,我试过了也可以。现在就是上传图片这块,实在是搞不懂……麻烦楼主帮忙解答一下~十分感谢~~!
<% form_for :picture, @picture, :url => {:action => 'create'}, :html => {:multipart => true} do |f| %> <p> <%= f.file_field :uploaded_data %> </p> <p> <%= submit_tag 'Create' %> </p> <% end %>
这是我上传图片的表单
def new @picture = Picture.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @picture } end end def create @picture = Picture.new(params[:picture]) pic = params[:picture] img = MiniMagick::Image.from_blob(pic.read) respond_to do |format| if @picture.save flash[:notice] = 'Picture was successfully created.' format.html { redirect_to(@picture) } format.xml { render :xml => @picture, :status => :created, :location => @picture } else format.html { render :action => "new" } format.xml { render :xml => @picture.errors, :status => :unprocessable_entity } end end end
上面是我的controller里的跟上传图片有关的部分
之前看过你的回答后,我又修改了修改,但是无论怎么改都是不行,所以还是把原码给贴过来吧……
我把pic = params[:picture]换成pic = params[:picture][:uploaded_data]后pic的类型是Tempfile了,倒是可以用read了,但是还是报错,说pic里为空……不清楚是为什么……
我现在做的就是一个关于上传图片自动修改的项目,我的目的就是想让我上传的所有图片都按原比例变成一个分辨率,比如500x500,然后上下或左右加白边,加白边我看你之前给一个人的回答里有了,我试过了也可以。现在就是上传图片这块,实在是搞不懂……麻烦楼主帮忙解答一下~十分感谢~~!
22 楼
Hooopo
2010-04-07
rocheers 写道
你好,我想请问一下,为什么我的程序总是在 img = MiniMagick::Image.from_blob(photo.read) 这句报错呢?错误是undefined methods “read”,我查了一下photo的class,是个很奇怪的类——HashWithIndifferentAccess,貌似这个类里没有read的方法?不解……等待楼主的帮助~万分感激~
你的表单是什么样子的?photo的class是HashWithIndifferentAccess说明你得到的不是File对象,没有read方法....
你把photo对象详细的打印出来就知道了。
<%=debug(@photo) %>
21 楼
rocheers
2010-04-07
你好,我想请问一下,为什么我的程序总是在 img = MiniMagick::Image.from_blob(photo.read) 这句报错呢?错误是undefined methods “read”,我查了一下photo的class,是个很奇怪的类——HashWithIndifferentAccess,貌似这个类里没有read的方法?不解……等待楼主的帮助~万分感激~
20 楼
Hooopo
2010-01-14
kamama 写道
请问有用mini_magick在图片上画中文字的么?
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
加文字没试过,但是如果有乱码可以先用Photoshop制作一个小图片用imagMagick的composite命令贴上去
19 楼
kamama
2010-01-14
请问有用mini_magick在图片上画中文字的么?
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
如在照片上,写上“你好”,“你好Hooopo”
我发现纯中文字是可以的,一旦字符串中夹杂数字或者字母就整个字符串打出来是乱码
18 楼
Hooopo
2010-01-14
<div class="quote_title">ywencn 写道</div>
<div class="quote_div">
<pre name="code" class="js"> function initValue(){
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
</div>
<p>这是和浏览器有关,ie下可以获取。其他浏览器有问题。。</p>
<p>有两种解决方案:</p>
<p>1.服务器端传回一个图片长宽的值放在页面隐藏域,js读取隐藏域来获取图片宽高。</p>
<p>2.在服务器端把图片不足200x200的添加白边到200x200(回复里已经有做法),然后初始化选择框的时候就可以指定一个定值。</p>
<div class="quote_div">
<pre name="code" class="js"> function initValue(){
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
</div>
<p>这是和浏览器有关,ie下可以获取。其他浏览器有问题。。</p>
<p>有两种解决方案:</p>
<p>1.服务器端传回一个图片长宽的值放在页面隐藏域,js读取隐藏域来获取图片宽高。</p>
<p>2.在服务器端把图片不足200x200的添加白边到200x200(回复里已经有做法),然后初始化选择框的时候就可以指定一个定值。</p>
17 楼
danielking
2010-01-14
<div class="quote_title">ywencn 写道</div>
<div class="quote_div">
<pre name="code" class="js"> function initValue(){
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
</div>
<p> </p>
<p>图片load完之后再执行不就行了?</p>
<div class="quote_div">
<pre name="code" class="js"> function initValue(){
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
</div>
<p> </p>
<p>图片load完之后再执行不就行了?</p>
16 楼
ywencn
2010-01-13
<pre name="code" class="js"> function initValue(){
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
var o = new Object();
var x = $("#avatar").width();
var y = $("#avatar").height();
var size = x >= y ? y : x;
size = size >= 100 ? 100 : size;
o.x1 = (x - size) / 2;
o.y1 = (y - size) / 2;
o.x2 = o.x1 + size;
o.y2 = o.y1 + size;
return o; </pre>
<p> </p>
<p>我发现如果图片加载比较慢的话就不能正确获取.width()和.height</p>
<p>因为jquery在DOM加载完毕后就开始执行,可能获取width的时候图片才加载了一点点,就导致了默认的选取框只有一个点。</p>
<p>这个有解决的办法么?</p>
15 楼
寄生虫
2009-12-15
不错啊,要是能在前台用JS剪裁就好了,YY一下
14 楼
zhonggeneral
2009-12-15
服务端技术,没什么看头。
13 楼
changyuxin
2009-12-11
挺不错的,收藏夹了!
12 楼
wujiazhao88
2009-12-10
写得不错啊,顶一个
11 楼
fl1429
2009-12-09
以前 我用 jquery imageselectarea.js + rmagick 同样实现了该功能。。原理一样
10 楼
freedomstyle
2009-12-09
听不错的哦,谢谢楼主分享
9 楼
kukuwuwu
2009-12-09
我一直以为楼主头像是一只手拿着一个发光物体呢,今天看到真相了哈哈
8 楼
gokure
2009-12-07
太帅了,就是这个效果.
7 楼
swen00
2009-12-07
能做成个组件么?像那个上传多个文件一样。
收藏下先..
收藏下先..
发表评论
-
新博客
2012-04-23 20:47 1734https://db-china.org -
Draper: View Models for Rails
2011-10-07 01:19 2268Draper是一个Ruby gem,它让Rails model ... -
Active Record batch processing in parallel processes
2011-10-07 01:20 2270Active Record 提供 find_each来分批处理 ... -
答复: Sinatra:一个可以作为Rails有益补充的框架. 简洁而不简单
2010-04-07 18:21 1656既然是这么简单的事情,用rack写也比较有趣: 一共5个文件, ... -
mass-assignment protection【?】
2010-03-18 18:31 101Attributes named in this ma ... -
Showing SQL statements in the Rails console
2009-10-23 13:29 19811.windows下创建_irbrc文件,并设置环境变量 2. ... -
Security Tips
2009-10-01 17:28 976Hackers Love Mass Assignment 对于 ... -
HTTP request 相关
2009-09-25 13:52 1258>> app.request.query_para ... -
可定制的Rails错误回显
2009-09-16 09:30 2831通常rails页面的错误信息提示都是放在首部用 error_m ... -
用户注册邮件激活
2009-09-04 17:26 50221.网站用户相关表中有一个字段用来记录用户帐号是否激活。 ... -
REST in Rails资料收集
2009-08-25 13:08 1254LetRails的一系列介绍: ... -
check-if-record-was-just-destroyed-in-rails
2009-08-20 11:02 1020问题: So there is record.new_ ... -
Using indexes in rails: Index your associations
2009-08-19 14:23 1152Many rails developers are g ... -
委托 in rails
2009-08-09 01:16 1167Delegation is a feature Rails ... -
还是习惯用法好啊。。。
2009-08-08 09:00 1219在看ASCIICast的rails示例里面看到这样的代码: ... -
弄了个小论坛...
2009-08-07 05:27 1059http://github.com/hooopo/Rails- ... -
I18n for Rails之hello world
2009-08-01 04:52 1184平台:rails 2.3.2 ruby 1.8.6 1.rai ... -
Using with_scope
2009-07-29 01:57 856In this episode we’ll talk abou ... -
Move Find Into Model
2009-07-29 01:52 983下面是在控制器里面通过model查找未完成的任务: c ... -
Find Through Association
2009-07-29 01:39 986Project model has_many tasks: ...
相关推荐
gem 'mini_magick' ``` 然后运行`bundle install`来安装MiniMagick。 **使用MiniMagick处理图像** MiniMagick的核心操作是`read`、`write`和`process`方法。`read`用于加载图像,`write`用于保存修改后的图像,而`...
使用它添加到您的Gemfile gem 'mojo_magick'在您的ruby代码中要求它require 'mojo_magick'去镇上! 查看几个简单的例子图像调整大小获取图像的大小(假设图像为“ 120wx222h”) dimensions = MojoMagick::get_image...
该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 … 如果...
这个库,名为“Magick Neversis”,是专门用于图像处理和操作的工具集,它为开发人员提供了一种高效、灵活的方式来处理各种图像格式和执行复杂的图像操作。 Magick,源自ImageMagick,是一个广泛使用的开源图像处理...
gem 'simple_magick' 然后执行: $ bundle 支持的版本 Ruby 2.0.0 或更高版本 用法 require 'simple_magick' if SimpleMagick . imagemagick_installed? image = SimpleMagick :: Image . new ( '/path/to/src_...
例子# Import thingsfrom breakpoint_magick import GetVSCodeBreakpoints# Get a list with VS Code breakpointsbreak_point_list = GetVSCodeBreakpoints ()# Example of processing to new formatprint ( "# ...
gem 'dummy_magick' end 然后执行: $ bundle 用法 ## # Generate a dummy image file # # @param width [Integer] The width of the image. # @param height [Integer] The height of the image. # @param ...
在IT领域,图片处理是一项常见的任务,而"Magick++实现图片压缩"的主题涉及到了图像处理库Magick++的应用,特别是在图像压缩和锐化方面的技术。Magick++是ImageMagick库的一部分,它提供了一个C++接口来处理各种图像...
Magick.NET是一个强大的开源类库,专为.NET平台设计,用于处理和操作图像。这个类库使得.NET开发者能够轻松地进行各种复杂的图像处理任务,包括转换、裁剪、旋转、调整大小、添加特效以及应用滤镜等。Magick.NET不仅...
Magick++ 提供了非常丰富的方法来操作图像,例如调整图像大小、裁剪、旋转、改变图像的对比度和亮度、应用滤镜效果、添加文本和图像水印等等。此外,Magick++ 还支持许多图像格式的读取和写入,这使其成为一个非常...
【标题】"Magick 图片处理"涉及到的核心技术是ImageMagick,这是一款开源的跨平台图像处理工具,用于在命令行中进行各种图像操作,包括但不限于图片转换、编辑、合成以及添加水印等。ImageMagick的强大功能使得它在...
Magick.NET库是基于ImageMagick开源项目构建的,ImageMagick是一个广泛使用的命令行工具集,而Magick.NET则将其功能无缝集成到.NET环境中。 **主要特性:** 1. **多格式支持**:Magick.NET 支持众多图像文件格式,...
linux下采用开源库Magick++实现图片合成,图片添加中英文字体:需要自己下载编译Magick++,如下为部分代码,下载可看完整代码 #include <Magick++.h> #include <Magick++/Image.h> #include <Magick++/Drawable.h> ...
- **Web 应用**:Web 服务器可以利用 Magick++ 实时生成图表、图形和注释图片等动态内容。 - **移动应用**:开发人员可以使用 Magick++ 来处理用户上传的照片,实现滤镜效果、尺寸调整等功能。 - **自动化工具**:...
这个库允许开发者在C#环境中轻松地执行复杂的图像操作,如转换、裁剪、调整大小、添加滤镜、读取和写入元数据等。它基于ImageMagick,一个广泛使用的跨平台开源图像处理工具。 Magick.NET 的核心类是 `MagickImage`...
检查系统上是否安装了上述gem $ gem list #安装要将valor-dual安装到系统中,请运行$ sudo gem install valor-dual #用法首先,在您的项目中需要mini_magick,aws-sdk,uri gem和YAML。 require "mini_magick...
rtesseract, 用于超立方体识别的ruby 库 rtesseract 用于超立方体识别的ruby 库。要求:要正常工作,需要使用 rtesseract:超正方体- 程序ImageMagick - 程序RMagick或者 mini_magick -
将administrate-field-active_storage和mini_magick到您的Gemfile中(第6条): gem 'administrate-field-active_storage' gem "image_processing" 对于rails 5.x,请使用以下命令 gem 'administrate-f
Magick.NET是一个开源的图像处理库,基于ImageMagick项目,允许开发者在C#环境中轻松地处理图像。"Q8"代表了该版本使用的是8位颜色深度,意味着它可以处理256种颜色级别的图像,适合大多数日常应用场景。"AnyCPU"则...
Magick.NET将其功能带入.NET世界,为C#和.NET Framework开发者提供了丰富的API,用于执行复杂的图像操作,如裁剪、缩放、旋转、颜色调整以及各种特效添加。 二、源码分析 1. 图片签名:在图像处理领域,签名通常指...