carrierwave-crop-on-fly 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +67 -0
- data/app/assets/javascripts/jcrop.js +145 -0
- data/app/assets/stylesheets/jcrop_fix.css +3 -0
- data/lib/carrierwave-crop-on-fly.rb +1 -0
- data/lib/carrierwave/crop/all.rb +13 -0
- data/lib/carrierwave/crop/engine.rb +8 -0
- data/lib/carrierwave/crop/error.rb +8 -0
- data/lib/carrierwave/crop/extension_crop_data.rb +29 -0
- data/lib/carrierwave/crop/helpers.rb +84 -0
- data/lib/carrierwave/crop/railtie.rb +10 -0
- data/lib/carrierwave/crop/uploaded_file_additions.rb +15 -0
- data/lib/carrierwave/crop/uploader_additions.rb +67 -0
- data/lib/carrierwave/crop/version.rb +5 -0
- data/vendor/assets/images/Jcrop.gif +0 -0
- data/vendor/assets/javascripts/jquery.jcrop.js +1694 -0
- data/vendor/assets/stylesheets/jquery.jcrop.css +165 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a4b2b20f10b010c98b7c72ce473beddc9fd9fbab
|
4
|
+
data.tar.gz: 4568c7d682db0640d53151093ccc37ef6494f1d1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e4195a367c327aef9ed2c66bd7f5aa9a59564bf40584c6815de72dadf6eb545d026d51a9ad36d6b7e0142c145be2b255c0067ea0513fde64497f8a55ccc1ef92
|
7
|
+
data.tar.gz: 0e5fbcfc2ec2988ee9d0308dfcdb27b3d3276c200a44a28dbeb93fd05d9a0d243a9857f5c8c07169d958dea6a35830f56e3bc905a3ea787874ef5479e95fb3d5
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2015 evg2108
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# CarrierWave-Fly-Crop
|
2
|
+
|
3
|
+
CarrierWave extension for on fly specifying crop area with preview and cropping images before they saved.
|
4
|
+
|
5
|
+
this gem based on [carrierwave-crop](https://github.com/kirtithorat/carrierwave-crop)
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Install the latest stable release:
|
10
|
+
|
11
|
+
$[sudo] gem install carrierwave-fly-crop
|
12
|
+
|
13
|
+
In Rails, add it to your Gemfile:
|
14
|
+
|
15
|
+
gem 'carrierwave-fly-crop'
|
16
|
+
|
17
|
+
Also you must add mini_magick gem
|
18
|
+
|
19
|
+
gem 'mini_magick'
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
|
23
|
+
$ bundle
|
24
|
+
|
25
|
+
Finally, restart the server to apply the changes.
|
26
|
+
|
27
|
+
## Getting Started
|
28
|
+
|
29
|
+
Add the required files in assets
|
30
|
+
|
31
|
+
In .js file
|
32
|
+
|
33
|
+
//= require jquery
|
34
|
+
//= require jcrop_init
|
35
|
+
|
36
|
+
In .css file
|
37
|
+
|
38
|
+
*= require jquery.jcrop
|
39
|
+
*= require jcrop_fix
|
40
|
+
|
41
|
+
## Usage
|
42
|
+
|
43
|
+
Open your model file and add the CarrierWave uploader:
|
44
|
+
|
45
|
+
class User < ActiveRecord::Base
|
46
|
+
mount_uploader :avatar, AvatarUploader
|
47
|
+
end
|
48
|
+
|
49
|
+
In the CarrierWave uploader:
|
50
|
+
|
51
|
+
class BaseUploader < CarrierWave::Uploader::Base
|
52
|
+
include CarrierWave::MiniMagick
|
53
|
+
process crop: [100, 100]
|
54
|
+
end
|
55
|
+
|
56
|
+
In the view:
|
57
|
+
|
58
|
+
<%= form_for @user do |f| %>
|
59
|
+
<%= f.file_field :avatar %>
|
60
|
+
<%= f.cropbox :avatar, width: 300, height: 300 %>
|
61
|
+
<%= f.previewbox :avatar %>
|
62
|
+
<%= f.submit 'Crop' %>
|
63
|
+
<% end %>
|
64
|
+
|
65
|
+
### Credits and resources
|
66
|
+
* [CarrierWave](https://github.com/carrierwaveuploader/carrierwave)
|
67
|
+
* [Deep Liquid's JCrop](http://deepliquid.com/content/Jcrop.html)
|
@@ -0,0 +1,145 @@
|
|
1
|
+
//= require jquery.jcrop.js
|
2
|
+
//= require_self
|
3
|
+
|
4
|
+
document.jcrop = (function() {
|
5
|
+
var exports = { };
|
6
|
+
|
7
|
+
var centerSelection = function(input_image_sizes, output_image_sizes) {
|
8
|
+
var x_offset = 0;
|
9
|
+
var y_offset = 0;
|
10
|
+
var orig_w = input_image_sizes[0];
|
11
|
+
var orig_h = input_image_sizes[1];
|
12
|
+
|
13
|
+
var ratio = output_image_sizes[0] / output_image_sizes[1];
|
14
|
+
var current_image_ratio = orig_w / orig_h;
|
15
|
+
|
16
|
+
var width = orig_w;
|
17
|
+
var height = orig_h;
|
18
|
+
if (ratio < current_image_ratio) {
|
19
|
+
width = orig_h * ratio;
|
20
|
+
x_offset = (orig_w - width) / 2;
|
21
|
+
} else if (ratio > current_image_ratio) {
|
22
|
+
height = orig_w * ratio;
|
23
|
+
y_offset = (orig_h - height) / 2
|
24
|
+
}
|
25
|
+
|
26
|
+
return { aspect_ratio: ratio, position_and_size: [x_offset, y_offset, width, height] }
|
27
|
+
};
|
28
|
+
|
29
|
+
var readURL = function(input)
|
30
|
+
{
|
31
|
+
if (input.files && input.files[0]) {
|
32
|
+
var reader = new FileReader();
|
33
|
+
|
34
|
+
reader.onload = function(e){
|
35
|
+
if (!document.jcrop.options.image_loaded) {
|
36
|
+
document.jcrop.options.image_loaded = true;
|
37
|
+
document.jcrop.options.cropbox_image.on('load', function () {
|
38
|
+
document.jcrop.options.current_image_width = this.width;
|
39
|
+
document.jcrop.options.current_image_height = this.height;
|
40
|
+
|
41
|
+
var selection = centerSelection([document.jcrop.options.current_image_width, document.jcrop.options.current_image_height],
|
42
|
+
[document.jcrop.options.output_width, document.jcrop.options.output_height]);
|
43
|
+
|
44
|
+
var data = document.jcrop.options.cropbox_image.data('Jcrop');
|
45
|
+
if (data) { data.destroy(); }
|
46
|
+
|
47
|
+
document.jcrop.options.cropbox_image.Jcrop({
|
48
|
+
aspectRatio: selection.aspect_ratio,
|
49
|
+
setSelect: selection.position_and_size,
|
50
|
+
onChange: showPreview,
|
51
|
+
onSelect: showPreview,
|
52
|
+
boxWidth: 300, boxHeight: 300
|
53
|
+
});
|
54
|
+
});
|
55
|
+
}
|
56
|
+
|
57
|
+
document.jcrop.options.cropbox_image.attr('src', e.target.result);
|
58
|
+
if (document.jcrop.options.previewbox_image.length > 0) { document.jcrop.options.previewbox_image.attr('src', e.target.result); }
|
59
|
+
};
|
60
|
+
reader.readAsDataURL(input.files[0]);
|
61
|
+
}
|
62
|
+
};
|
63
|
+
|
64
|
+
var showPreview = function(coords) {
|
65
|
+
if (document.jcrop.options.crop_x.length > 0) { document.jcrop.options.crop_x.val(coords.x); }
|
66
|
+
if (document.jcrop.options.crop_y.length > 0) { document.jcrop.options.crop_y.val(coords.y); }
|
67
|
+
if (document.jcrop.options.crop_w.length > 0) { document.jcrop.options.crop_w.val(coords.w); }
|
68
|
+
if (document.jcrop.options.crop_h.length > 0) { document.jcrop.options.crop_h.val(coords.h); }
|
69
|
+
|
70
|
+
if (document.jcrop.options.previewbox_image.length > 0) {
|
71
|
+
var original_picture_height = document.jcrop.options.current_image_height;
|
72
|
+
var original_picture_width = document.jcrop.options.current_image_width;
|
73
|
+
|
74
|
+
var preview_height = document.jcrop.options.output_height;
|
75
|
+
var preview_width = document.jcrop.options.output_width;
|
76
|
+
|
77
|
+
var imaginary_picture_height = (original_picture_height * preview_height) / coords.h;
|
78
|
+
var imaginary_picture_width = (original_picture_width * preview_width) / coords.w;
|
79
|
+
|
80
|
+
var imaginary_picture_x_shift = imaginary_picture_width * coords.x / (original_picture_width);
|
81
|
+
var imaginary_picture_y_shift = imaginary_picture_height * coords.y / (original_picture_height);
|
82
|
+
|
83
|
+
document.jcrop.options.previewbox_image.css({
|
84
|
+
width: Math.round(imaginary_picture_width) + 'px',
|
85
|
+
height: Math.round(imaginary_picture_height) + 'px',
|
86
|
+
marginLeft: '-' + Math.round(imaginary_picture_x_shift) + 'px',
|
87
|
+
marginTop: '-' + Math.round(imaginary_picture_y_shift) + 'px'
|
88
|
+
});
|
89
|
+
}
|
90
|
+
};
|
91
|
+
|
92
|
+
var init_options = function(options) {
|
93
|
+
options = options || {};
|
94
|
+
|
95
|
+
options.file_input_id = options.file_input_id ? '#' + options.file_input_id : '#file_input_cropper';
|
96
|
+
options.file_input = $(options.file_input_id);
|
97
|
+
if (options.file_input.length == 0) { throw "element '" + options.file_input_id + "' not found"; }
|
98
|
+
|
99
|
+
options.cropbox_image_id = options.cropbox_image_id || options.file_input_id + '_cropbox';
|
100
|
+
options.cropbox_image = $(options.cropbox_image_id);
|
101
|
+
if (options.cropbox_image.length == 0) { throw "element '" + options.cropbox_image_id + "' not found"; }
|
102
|
+
|
103
|
+
options.previewbox_image_id = options.previewbox_image_id || options.file_input_id + '_previewbox';
|
104
|
+
options.previewbox_image = $(options.previewbox_image_id);
|
105
|
+
if (options.previewbox_image.length == 0) { console.info("element '" + options.previewbox_image_id + "' not found"); }
|
106
|
+
|
107
|
+
options.crop_x_id = options.crop_x_id || options.file_input_id + '_crop_x';
|
108
|
+
options.crop_x = $(options.crop_x_id);
|
109
|
+
if (options.crop_x.length == 0) { console.warn("element '" + options.crop_x_id + "' not found. You can not send horizontal offset data to the server"); }
|
110
|
+
|
111
|
+
options.crop_y_id = options.crop_y_id || options.file_input_id + '_crop_y';
|
112
|
+
options.crop_y = $(options.crop_y_id);
|
113
|
+
if (options.crop_y.length == 0) { console.warn("element '" + options.crop_y_id + "' not found. You can not send vertical offset data to the server"); }
|
114
|
+
|
115
|
+
options.crop_w_id = options.crop_w_id || options.file_input_id + '_crop_w';
|
116
|
+
options.crop_w = $(options.crop_w_id);
|
117
|
+
if (options.crop_w.length == 0) { console.warn("element '" + options.crop_w_id + "' not found. You can not send width data to the server"); }
|
118
|
+
|
119
|
+
options.crop_h_id = options.crop_h_id || options.file_input_id + '_crop_h';
|
120
|
+
options.crop_h = $(options.crop_h_id);
|
121
|
+
if (options.crop_h.length == 0) { console.warn("element '" + options.crop_h_id + "' not found. You can not send height data to the server"); }
|
122
|
+
|
123
|
+
options.output_width = options.output_width || options.cropbox_image.data('output-width') || 100;
|
124
|
+
options.output_height = options.output_height || options.cropbox_image.data('output-height') || 100;
|
125
|
+
|
126
|
+
document.jcrop.options = options;
|
127
|
+
|
128
|
+
return options;
|
129
|
+
};
|
130
|
+
|
131
|
+
exports.init = function(options) {
|
132
|
+
init_options(options);
|
133
|
+
|
134
|
+
var file_input = $(document.jcrop.options.file_input_id);
|
135
|
+
|
136
|
+
if (file_input.length > 0) {
|
137
|
+
file_input.change(function(){
|
138
|
+
if (document.jcrop.options.after_change) { document.jcrop.options.after_change(); }
|
139
|
+
readURL(this);
|
140
|
+
});
|
141
|
+
}
|
142
|
+
};
|
143
|
+
|
144
|
+
return exports;
|
145
|
+
})();
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'carrierwave/crop/all'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'carrierwave/crop/version'
|
4
|
+
require 'carrierwave/crop/error'
|
5
|
+
|
6
|
+
if defined? Rails
|
7
|
+
require 'carrierwave/crop/engine'
|
8
|
+
require 'carrierwave/crop/helpers'
|
9
|
+
require 'carrierwave/crop/uploader_additions'
|
10
|
+
require 'carrierwave/crop/uploaded_file_additions'
|
11
|
+
require 'carrierwave/crop/extension_crop_data'
|
12
|
+
require 'carrierwave/crop/railtie'
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
module Crop
|
3
|
+
module ExtensionCropData
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
before :cache, :remember_crop_data
|
8
|
+
|
9
|
+
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def remember_crop_data(file)
|
15
|
+
self.crop_x = file.file.crop_x
|
16
|
+
self.crop_y = file.file.crop_y
|
17
|
+
self.crop_w = file.file.crop_w
|
18
|
+
self.crop_h = file.file.crop_h
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if defined? CarrierWave::Uploader::Base
|
26
|
+
CarrierWave::Uploader::Base.class_eval do
|
27
|
+
include ::CarrierWave::Crop::ExtensionCropData
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module CarrierWave
|
4
|
+
module Crop
|
5
|
+
module Helpers
|
6
|
+
|
7
|
+
# Form helper to render the preview of a cropped attachment.
|
8
|
+
# Loads the actual image. Previewbox has no constraints on dimensions, image is renedred at full size.
|
9
|
+
# By default box size is 100x100. Size can be customized by setting the :width and :height option.
|
10
|
+
# If you override one of width/height you must override both.
|
11
|
+
#
|
12
|
+
# previewbox :avatar
|
13
|
+
# previewbox :avatar, width: 200, height: 200
|
14
|
+
#
|
15
|
+
# @param attachment [Symbol] attachment name
|
16
|
+
# @param opts [Hash] specify version or width and height options
|
17
|
+
def previewbox(attachment, opts = {})
|
18
|
+
attachment = attachment.to_sym
|
19
|
+
attachment_instance = self.object.send(attachment)
|
20
|
+
|
21
|
+
if(attachment_instance.is_a? CarrierWave::Uploader::Base)
|
22
|
+
model_name = self.object.class.name.demodulize.underscore
|
23
|
+
width, height = 100, 100
|
24
|
+
if(opts[:width] && opts[:height])
|
25
|
+
width, height = opts[:width].round, opts[:height].round
|
26
|
+
elsif (sizes = find_output_sizes(attachment_instance))
|
27
|
+
width, height = *sizes
|
28
|
+
end
|
29
|
+
wrapper_attributes = {id: "#{model_name}_#{attachment}_previewbox_wrapper", style: "width:#{width}px; height:#{height}px; overflow:hidden", class: 'previewbox_wrapper'}
|
30
|
+
|
31
|
+
preview_image = @template.image_tag(attachment_instance.url, id: "#{model_name}_#{attachment}_previewbox")
|
32
|
+
@template.content_tag(:div, preview_image, wrapper_attributes)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_output_sizes(attachment_instance)
|
37
|
+
attachment_instance.class.processors.reverse.find{ |a| a[0].to_s.include?('crop') }.try(:[], 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Form helper to render the actual cropping box of an attachment.
|
41
|
+
# Loads the actual image. Cropbox has no constraints on dimensions, image is renedred at full size.
|
42
|
+
# Box size can be restricted by setting the :width and :height option. If you override one of width/height you must override both.
|
43
|
+
#
|
44
|
+
# cropbox :avatar
|
45
|
+
# cropbox :avatar, width: 550, height: 600
|
46
|
+
#
|
47
|
+
# @param attachment [Symbol] attachment name
|
48
|
+
# @param opts [Hash] specify version or width and height options
|
49
|
+
def cropbox(attachment, opts = {})
|
50
|
+
attachment = attachment.to_sym
|
51
|
+
attachment_instance = self.object.send(attachment)
|
52
|
+
|
53
|
+
if(attachment_instance.is_a? CarrierWave::Uploader::Base)
|
54
|
+
model_name = self.object.class.name.demodulize.underscore
|
55
|
+
|
56
|
+
output = ActiveSupport::SafeBuffer.new
|
57
|
+
[:crop_x ,:crop_y, :crop_w, :crop_h].each do |attribute|
|
58
|
+
output << @template.hidden_field_tag("#{model_name}[#{attachment}][#{attribute}]", nil, id: "#{model_name}_#{attachment}_#{attribute}")
|
59
|
+
end
|
60
|
+
|
61
|
+
wrapper_attributes = {id: "#{model_name}_#{attachment}_cropbox_wrapper", class: 'cropbox_wrapper'}
|
62
|
+
if(opts[:width] && opts[:height])
|
63
|
+
wrapper_attributes.merge!(style: "width:#{opts[:width].round}px; height:#{opts[:height].round}px; overflow:hidden")
|
64
|
+
end
|
65
|
+
|
66
|
+
width, height = 100, 100
|
67
|
+
if (sizes = find_output_sizes(attachment_instance))
|
68
|
+
width, height = *sizes
|
69
|
+
end
|
70
|
+
|
71
|
+
output << @template.image_tag(attachment_instance.url, id: "#{model_name}_#{attachment}_cropbox", data: { output_width: width, output_height: height })
|
72
|
+
|
73
|
+
@template.content_tag(:div, output, wrapper_attributes)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if defined? ActionView::Helpers::FormBuilder
|
81
|
+
ActionView::Helpers::FormBuilder.class_eval do
|
82
|
+
include CarrierWave::Crop::Helpers
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class ActionDispatch::Http::UploadedFile
|
2
|
+
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
|
3
|
+
|
4
|
+
alias_method :old_initialize, :initialize
|
5
|
+
|
6
|
+
def initialize(hash)
|
7
|
+
parameters = hash.with_indifferent_access
|
8
|
+
@crop_x = parameters[:crop_x]
|
9
|
+
@crop_y = parameters[:crop_y]
|
10
|
+
@crop_w = parameters[:crop_w]
|
11
|
+
@crop_h = parameters[:crop_h]
|
12
|
+
|
13
|
+
old_initialize(hash)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
module Crop
|
3
|
+
module UploaderAdditions
|
4
|
+
# Performs cropping.
|
5
|
+
#
|
6
|
+
# Resizes the original image to 600x600 and then performs cropping
|
7
|
+
# process crop: [600, 600]
|
8
|
+
def crop(width = nil, height = nil)
|
9
|
+
if self.respond_to? "resize_to_limit"
|
10
|
+
begin
|
11
|
+
manipulate! do |img|
|
12
|
+
if crop_w.present? && crop_h.present?
|
13
|
+
w = crop_w
|
14
|
+
h = crop_h
|
15
|
+
else
|
16
|
+
orig_w = img['width']
|
17
|
+
orig_h = img['height']
|
18
|
+
|
19
|
+
ratio = width.to_f / height
|
20
|
+
orig_ratio = orig_w / orig_h
|
21
|
+
|
22
|
+
w = h = [orig_w, orig_h].min
|
23
|
+
if ratio < orig_ratio
|
24
|
+
w = orig_h * ratio
|
25
|
+
elsif ratio > orig_ratio
|
26
|
+
h = orig_w * ratio
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
if crop_x.blank? && crop_y.blank?
|
31
|
+
img.combine_options do |op|
|
32
|
+
op.crop "#{w.to_i}x#{h.to_i}+0+0"
|
33
|
+
op.gravity 'Center'
|
34
|
+
end
|
35
|
+
else
|
36
|
+
img.crop("#{w.to_i}x#{h.to_i}+#{crop_x.to_i}+#{crop_y.to_i}")
|
37
|
+
end
|
38
|
+
img.resize("#{width}x#{height}")
|
39
|
+
img
|
40
|
+
end
|
41
|
+
|
42
|
+
rescue Exception => e
|
43
|
+
raise CarrierWave::Crop::ProcessingError, "Failed to crop - #{e.message}"
|
44
|
+
end
|
45
|
+
|
46
|
+
else
|
47
|
+
raise CarrierWave::Crop::MissingProcessorError, "Failed to crop #{attachment}. Add mini_magick."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Checks if the attachment received cropping attributes
|
52
|
+
# @param attachment [Symbol] Name of the attribute to be croppedv
|
53
|
+
#
|
54
|
+
# @return [Boolean]
|
55
|
+
# def cropping?
|
56
|
+
# crop_x.present? && crop_y.present? && crop_w.present? && crop_h.present?
|
57
|
+
# end
|
58
|
+
|
59
|
+
end ## End of UploaderAdditions
|
60
|
+
end ## End of Crop
|
61
|
+
end ## End of CarrierWave
|
62
|
+
|
63
|
+
if defined? CarrierWave::Uploader::Base
|
64
|
+
CarrierWave::Uploader::Base.class_eval do
|
65
|
+
include CarrierWave::Crop::UploaderAdditions
|
66
|
+
end
|
67
|
+
end
|