Skip to content

Commit

Permalink
Support image_processing for Rails apps
Browse files Browse the repository at this point in the history
  • Loading branch information
mtgrosser committed Sep 7, 2019
1 parent 8d80365 commit 3ca98ed
Show file tree
Hide file tree
Showing 12 changed files with 418 additions and 39 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ build/
.DS_Store

/spec/examples.txt

.byebug_history
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.6.1
2.6.4
64 changes: 64 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
PATH
remote: .
specs:
rszr (0.7.0)

GEM
remote: https://rubygems.org/
specs:
byebug (11.0.0)
diff-lcs (1.3)
docile (1.3.1)
ffi (1.10.0)
gd2-ffij (0.3.0)
ffi (>= 1.0.0)
image_processing (1.8.0)
mini_magick (>= 4.9.3, < 5)
ruby-vips (>= 2.0.13, < 3)
json (2.2.0)
memory_profiler (0.9.12)
mini_magick (4.9.3)
minitest (5.11.3)
rake (10.5.0)
rake-compiler (1.0.7)
rake
rspec (3.8.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
ruby-vips (2.0.13)
ffi (~> 1.9)
simplecov (0.16.1)
docile (~> 1.1)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.2)

PLATFORMS
ruby

DEPENDENCIES
bundler (~> 1.17)
byebug
gd2-ffij
image_processing
memory_profiler
mini_magick
minitest
rake (~> 10.0)
rake-compiler
rspec
rszr!
simplecov

BUNDLED WITH
1.17.2
37 changes: 27 additions & 10 deletions benchmark/speed.rb
Original file line number Diff line number Diff line change
@@ -1,36 +1,53 @@
require 'benchmark'
require 'fileutils'

require 'rszr'
require 'mini_magick'
require 'gd2-ffij'


def root
Pathname.new(__FILE__).dirname
end

def work_path(name)
root.join('work', name)
end

ITERATIONS = 100
ORIGINAL = root.join('..', 'spec', 'images', 'test.jpg').to_s
WIDTH = 800
HEIGHT = 532

puts 'Preparing ...'
(1..ITERATIONS).each { |i| FileUtils.cp ORIGINAL, work_path("#{i - 1}.jpg") }

Benchmark.bm(100) do |x|
original = Pathname.new(__FILE__).dirname.join('../spec/images/test.jpg')

resized = Pathname.new(__FILE__).dirname.join('output.jpg')

x.report 'MiniMagick' do
ITERATIONS.times do
image = MiniMagick::Image.open(original.to_s)
image.resize '800x532'
ITERATIONS.times do |i|
image = MiniMagick::Image.open(work_path("#{i}.jpg").to_s)
image.resize "#{WIDTH}x#{HEIGHT}"
image.write resized.to_s
image = nil
end
end

x.report 'GD2' do
ITERATIONS.times do
image = GD2::Image.import(original.to_s)
image.resize! 800, 532
ITERATIONS.times do |i|
image = GD2::Image.import(work_path("#{i}.jpg").to_s)
image.resize! WIDTH, HEIGHT
image.export resized.to_s
image = nil
end
end

x.report 'Rszr' do
ITERATIONS.times do
image = Rszr::Image.load(original.to_s)
image.resize! 800, 532
ITERATIONS.times do |i|
image = Rszr::Image.load(work_path("#{i}.jpg").to_s)
image.resize! WIDTH, HEIGHT
image.save resized.to_s
image = nil
end
Expand Down
129 changes: 124 additions & 5 deletions ext/rszr/image.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path)
}


static VALUE rszr_image_format(VALUE self)
static VALUE rszr_image_format_get(VALUE self)
{
rszr_image_handle * handle;
char * format;
Expand All @@ -93,6 +93,20 @@ static VALUE rszr_image_format(VALUE self)
}


static VALUE rszr_image__format_set(VALUE self, VALUE rb_format)
{
rszr_image_handle * handle;
char * format = StringValueCStr(rb_format);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
imlib_image_set_format(format);

return self;
}


static VALUE rszr_image_width(VALUE self)
{
rszr_image_handle * handle;
Expand Down Expand Up @@ -120,6 +134,44 @@ static VALUE rszr_image_height(VALUE self)
return INT2NUM(height);
}

/*
static VALUE rszr_image_get_quality(VALUE self)
{
rszr_image_handle * handle;
int quality;
Data_Get_Struct(self, rszr_image_handle, handle);
imlib_context_set_image(handle->image);
quality = imlib_image_get_attached_value("quality");
if (quality) {
return INT2NUM(quality);
} else {
return Qnil;
}
}
static VALUE rszr_image_set_quality(VALUE self, VALUE rb_quality)
{
rszr_image_handle * handle;
int quality;
Check_Type(rb_quality, T_FIXNUM);
quality = FIX2INT(rb_quality);
if (quality <= 0) {
rb_raise(rb_eArgError, "quality must be >= 0");
return Qnil;
}
Data_Get_Struct(self, rszr_image_handle, handle);
imlib_context_set_image(handle->image);
imlib_image_attach_data_value("quality", NULL, quality, NULL);
return INT2NUM(quality);
}
*/

static VALUE rszr_image_dup(VALUE self)
{
Expand Down Expand Up @@ -159,6 +211,62 @@ static VALUE rszr_image__turn_bang(VALUE self, VALUE orientation)
}


static VALUE rszr_image__rotate(VALUE self, VALUE bang, VALUE rb_angle)
{
rszr_image_handle * handle;
rszr_image_handle * rotated_handle;
Imlib_Image rotated_image;
VALUE oRotatedImage;
double angle;

angle = NUM2DBL(rb_angle);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
rotated_image = imlib_create_rotated_image(angle);

if (!rotated_image) {
rb_raise(eRszrTransformationError, "error rotating image");
return Qnil;
}

if (RTEST(bang)) {
rszr_free_image(handle->image);
handle->image = rotated_image;

return self;
}
else {
oRotatedImage = rszr_image_s_allocate(cImage);
Data_Get_Struct(oRotatedImage, rszr_image_handle, rotated_handle);
rotated_handle->image = rotated_image;

return oRotatedImage;
}
}


static VALUE rszr_image__sharpen_bang(VALUE self, VALUE rb_radius)
{
rszr_image_handle * handle;
int radius;

radius = NUM2INT(rb_radius);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
if (radius >= 0) {
imlib_image_sharpen(radius);
} else {
imlib_image_blur(radius);
}

return self;
}


static Imlib_Image rszr_create_cropped_scaled_image(const Imlib_Image image, VALUE rb_src_x, VALUE rb_src_y, VALUE rb_src_w, VALUE rb_src_h, VALUE rb_dst_w, VALUE rb_dst_h)
{
Imlib_Image resized_image;
Expand Down Expand Up @@ -262,20 +370,24 @@ static VALUE rszr_image__crop(VALUE self, VALUE bang, VALUE rb_x, VALUE rb_y, VA
}


static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format)
static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format, VALUE rb_quality)
{
rszr_image_handle * handle;
char * path;
char * format;
int quality;
Imlib_Load_Error save_error;

path = StringValueCStr(rb_path);
format = StringValueCStr(rb_format);

quality = (NIL_P(rb_quality)) ? 0 : FIX2INT(rb_quality);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
imlib_image_set_format(format);
if (quality)
imlib_image_attach_data_value("quality", NULL, quality, NULL);
imlib_save_image_with_error_return(path, &save_error);

if (save_error) {
Expand All @@ -298,12 +410,19 @@ void Init_rszr_image()
rb_define_method(cImage, "initialize", rszr_image_initialize, 2);
rb_define_method(cImage, "width", rszr_image_width, 0);
rb_define_method(cImage, "height", rszr_image_height, 0);
rb_define_method(cImage, "format", rszr_image_format, 0);
rb_define_method(cImage, "format", rszr_image_format_get, 0);
rb_define_method(cImage, "dup", rszr_image_dup, 0);
// rb_define_method(cImage, "quality", rszr_image_get_quality, 0);
// rb_define_method(cImage, "quality=", rszr_image_set_quality, 1);

rb_define_protected_method(cImage, "_format=", rszr_image__format_set, 1);

rb_define_private_method(cImage, "_resize", rszr_image__resize, 7);
rb_define_private_method(cImage, "_crop", rszr_image__crop, 5);
rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
rb_define_private_method(cImage, "_save", rszr_image__save, 2);
rb_define_private_method(cImage, "_rotate", rszr_image__rotate, 2);
rb_define_private_method(cImage, "_sharpen!", rszr_image__sharpen_bang, 1);
rb_define_private_method(cImage, "_save", rszr_image__save, 3);
}

#endif
Loading

0 comments on commit 3ca98ed

Please sign in to comment.