2011-05-22 80 views
7

我想要做的是上传一张图片,然后将用户带到一个新页面,在那里我将使用Jcrop让用户选择想要裁剪的图像部分,然后存储该图像。从本质上讲,我想让它成为一个两阶段的过程。如何在导轨中使用carrierwave'事实'后裁剪图像?

我知道如何做javascript部分,并且我了解如何创建此功能的基本流程。但是,我不知道如何完成此载波的具体细节。

我能找到最接近的是:

image.recreate_versions! 

但我仍然无法在高度/宽度通过并启动X,Y裁剪它。

例如,我怎样才能告诉carrierwave在事后'剪裁' - 即不是当图像第一次上传时?我看到了“处理”图像的方法,但它们会自动以固定的高度和宽度进行。我该如何推迟?

从本质上讲,我希望做的是动态定义版本,在那里我可以指定高度和宽度与X,Y

感谢

回答

5

这是我能做到的最好。有可能是一个更简单的方法来做到这一点,但是这是我的黑客:

这里是当裁剪信息传递我的“POST”控制器动作:

def update_crop 
    @user = User.find(current_user.id) 
    @user.crop(params[:x].to_i, params[:y].to_i, params[:h].to_i, params[:w].to_i) 

    redirect_to(profile_path, :notice => 'Your profile and avatar was successfully updated.') 
    end 

下面是添加到用户的方法模型包含一个“阿凡达”图片上传:

def crop(x, y, h, w) 
    image = Magick::ImageList.new(avatar.current_path) 
    cropped_image = image.crop(x, y, h, w) 
    cropped_image.write(avatar.current_path) 

    avatar.recreate_versions! 
    end 

基本上这只是高新插孔当前,覆盖它,然后告诉Carrierwave创建