Skip to content

Commit

Permalink
Image orientation #10
Browse files Browse the repository at this point in the history
  • Loading branch information
mtgrosser committed Apr 23, 2021
1 parent 1567f4f commit 368e5d3
Show file tree
Hide file tree
Showing 13 changed files with 293 additions and 105 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ build/
/spec/examples.txt

.byebug_history

/lib/rszr/rszr.bundle
2 changes: 1 addition & 1 deletion .ruby-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.6.4
2.6.6
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ GEM
memory_profiler (0.9.12)
mini_magick (4.9.5)
minitest (5.11.3)
rake (10.5.0)
rake (13.0.1)
rake-compiler (1.0.7)
rake
rspec (3.8.0)
Expand Down Expand Up @@ -54,7 +54,7 @@ DEPENDENCIES
memory_profiler
mini_magick
minitest
rake (~> 10.0)
rake (~> 13.0)
rake-compiler
rspec
rszr!
Expand Down
7 changes: 7 additions & 0 deletions ext/rszr/extconf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,11 @@
abort 'Imlib2 is missing'
end

unless find_library('exif', 'exif_data_new_from_file')
abort 'libexif is missing'
end

have_library('exif')
have_header('libexif/exif-data.h')

create_makefile 'rszr/rszr'
71 changes: 65 additions & 6 deletions ext/rszr/image.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,42 @@ static void rszr_image_deallocate(rszr_image_handle * handle)
}


static void rszr_image_autorotate(Imlib_Image image, char * path)
{
ExifData * exifData;
ExifByteOrder byteOrder;
ExifEntry * exifEntry;
int orientation = 0;
int turns = 0;

exifData = exif_data_new_from_file(path);

if (exifData) {
byteOrder = exif_data_get_byte_order(exifData);
exifEntry = exif_data_get_entry(exifData, EXIF_TAG_ORIENTATION);
if (exifEntry) {
orientation = exif_get_short(exifEntry->data, byteOrder);
}
}

if (orientation < 2 || orientation > 8) return;

imlib_context_set_image(image);

if (orientation == 2 || orientation == 4 || orientation == 5 || orientation == 7) {
imlib_image_flip_horizontal();
}

if (orientation == 5 || orientation == 6) {
imlib_image_orientate(1);
} else if (orientation == 3 || orientation == 4) {
imlib_image_orientate(2);
} else if (orientation == 7 || orientation == 8) {
imlib_image_orientate(3);
}
}


static VALUE rszr_image_s_allocate(VALUE klass)
{
rszr_image_handle * handle = calloc(1, sizeof(rszr_image_handle));
Expand All @@ -50,7 +86,7 @@ static VALUE rszr_image_initialize(VALUE self, VALUE rb_width, VALUE rb_height)
}


static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path)
static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path, VALUE autorotate)
{
rszr_image_handle * handle;
Imlib_Image image;
Expand All @@ -68,6 +104,8 @@ static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path)
return Qnil;
}

if (RTEST(autorotate)) rszr_image_autorotate(image, path);

oImage = rszr_image_s_allocate(cImage);
Data_Get_Struct(oImage, rszr_image_handle, handle);
handle->image = image;
Expand Down Expand Up @@ -246,20 +284,39 @@ static VALUE rszr_image__rotate(VALUE self, VALUE bang, VALUE rb_angle)
}
}

/*

static VALUE rszr_image_filter_bang(VALUE self, VALUE rb_filter_expr)
{
rszr_image_handle * handle;
Imlib_Image image;
char * filter_expr;

filter_expr = StringValueCStr(rb_filter_expr);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
imlib_apply_filter(filter_expr);

return self;
}


static VALUE rszr_image__brighten_bang(VALUE self, VALUE rb_brightness)
{
rszr_image_handle * handle;
double brightness;

brightness = NUM2DBL(rb_brightness);

Data_Get_Struct(self, rszr_image_handle, handle);

imlib_context_set_image(handle->image);
imlib_modify_color_modifier_brightness(brightness);
imlib_apply_filter("brightness(10);");

return self;
}
*/


static VALUE rszr_image__sharpen_bang(VALUE self, VALUE rb_radius)
{
Expand Down Expand Up @@ -419,14 +476,16 @@ void Init_rszr_image()
rb_define_alloc_func(cImage, rszr_image_s_allocate);

// Class methods
rb_define_private_method(rb_singleton_class(cImage), "_load", rszr_image_s__load, 1);
rb_define_private_method(rb_singleton_class(cImage), "_load", rszr_image_s__load, 2);

// Instance methods
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_get, 0);
rb_define_method(cImage, "dup", rszr_image_dup, 0);
rb_define_method(cImage, "filter!", rszr_image_filter_bang, 1);

// rb_define_method(cImage, "quality", rszr_image_get_quality, 0);
// rb_define_method(cImage, "quality=", rszr_image_set_quality, 1);

Expand All @@ -437,7 +496,7 @@ void Init_rszr_image()
rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
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, "_brighten!", rszr_image__brighten_bang, 1); */
rb_define_private_method(cImage, "_brighten!", rszr_image__brighten_bang, 1);

rb_define_private_method(cImage, "_save", rszr_image__save, 3);
}
Expand Down
1 change: 1 addition & 0 deletions ext/rszr/rszr.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "ruby.h"
#include <Imlib2.h>
#include <libexif/exif-data.h>

extern VALUE mRszr;
void Init_rszr();
Expand Down
14 changes: 14 additions & 0 deletions lib/rszr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,17 @@
require 'rszr/rszr'
require 'rszr/version'
require 'rszr/image'

module Rszr
class << self
@@autorotate = nil

def autorotate
@@autorotate
end

def autorotate=(value)
@@autorotate = !!value
end
end
end
24 changes: 24 additions & 0 deletions lib/rszr/batch_transformation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module Rszr
class BatchTransformation
attr_reader :transformations, :image

def initialize(path, **opts)
puts "INITIALIZED BATCH for #{path}"
@image = path.is_a?(Image) ? path : Image.load(path, **opts)
@transformations = []
end

Image::Transformations.instance_methods.grep(/\w\z/) do |method|
define_method method do |*args|
transformations << [method, args]
self
end
end

def call
transformations.each { |method, args| image.public_send("#{method}!", *args) }
image
end

end
end
Loading

0 comments on commit 368e5d3

Please sign in to comment.