rszr 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42f7ff2b0188f0d494a5ec087af2d15c835d309d276c0d4d2074138aa88e621b
4
- data.tar.gz: e808c1406cec89ce6d65a111531742140b678f003c9c786f172a1d5f14bc01fe
3
+ metadata.gz: fc66aac476d64b18383ef7f619bf6fcf632c00f0bbda3e8e203183886e9caecf
4
+ data.tar.gz: 4c0132a0e9f845fc5f92535c210ca693b9132d281a88444ab41192425b1cec7b
5
5
  SHA512:
6
- metadata.gz: 206c800ef7aad7318e4ad417332ab8c2647f7f05e1e92365be749833cfddd90e11048aa9088b390b8e8dfed820482b1955e1d4868fb7c15b365e1acd8e9ca55c
7
- data.tar.gz: 92299076d2bdb47a383692d5c26387969cf680d22806640503090acba11c1eb74310a71adf3ca33bde211e296a98de0f92ae2d04d25f8fc962296096991ac99d
6
+ metadata.gz: a118a405a2c54998e0236a3b4c34a8b02ac68160a0410f45cf2e2d1e0a0ca78e87a49854e0992fa042ea560f5f64377a28f10e33551308de6ecd6fd767b5ee8d
7
+ data.tar.gz: 49f0b00262e4cf38ec1aef0309dd6c3e13f2fbc70278a37ace2b651041f6e8323a4ec99dd7169c444492d391688fb0a5c440f57b09415f19583ab56647436712
data/README.md CHANGED
@@ -238,6 +238,14 @@ image.contrast(0.5)
238
238
 
239
239
  # gamma
240
240
  image.gamma(1.1)
241
+
242
+ # convert to grayscale (automatic mode)
243
+ image.desaturate
244
+
245
+ # convert to grayscale with mode
246
+ image.desaturate(:lightness)
247
+ image.desaturate(:luminosity)
248
+ image.desaturate(:average)
241
249
  ```
242
250
 
243
251
  ### Image auto orientation
data/ext/rszr/image.c CHANGED
@@ -394,6 +394,54 @@ static VALUE rszr_image__sharpen_bang(VALUE self, VALUE rb_radius)
394
394
  }
395
395
 
396
396
 
397
+ static void rszr_desaturate_pixel(rszr_raw_pixel * pixel, int mode)
398
+ {
399
+ uint8_t grey;
400
+ if (mode == 2 || (mode == 0 && (pixel->blue > pixel->red && pixel->blue > pixel->green))) {
401
+ // lightness
402
+ grey = (pixel->blue + (pixel->red > pixel->green ? pixel->green : pixel->red)) / 2;
403
+ } else if (mode == 1 || mode == 0) {
404
+ // luminosity
405
+ grey = 0.21 * pixel->red + 0.72 * pixel->green + 0.07 * pixel->blue;
406
+ } else {
407
+ // average
408
+ grey = (pixel->red + pixel->green + pixel->blue) / 3;
409
+ }
410
+ pixel->red = grey;
411
+ pixel->green = grey;
412
+ pixel->blue = grey;
413
+ }
414
+
415
+ static VALUE rszr_image__desaturate_bang(VALUE self, VALUE rb_mode)
416
+ {
417
+ rszr_image_handle * handle;
418
+ rszr_raw_pixel * pixels;
419
+ uint64_t size;
420
+ int mode;
421
+
422
+ mode = NUM2INT(rb_mode);
423
+
424
+ Data_Get_Struct(self, rszr_image_handle, handle);
425
+
426
+ imlib_context_set_image(handle->image);
427
+
428
+ pixels = (rszr_raw_pixel *) imlib_image_get_data();
429
+ if (pixels == NULL) {
430
+ rb_raise(eRszrTransformationError, "error desaturating image");
431
+ return Qnil;
432
+ }
433
+
434
+ size = imlib_image_get_width() * imlib_image_get_height();
435
+ for (uint64_t i = 0; i < size; i++) {
436
+ rszr_desaturate_pixel(&pixels[i], mode);
437
+ }
438
+
439
+ imlib_image_put_back_data((uint32_t *) pixels);
440
+
441
+ return self;
442
+ }
443
+
444
+
397
445
  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)
398
446
  {
399
447
  Imlib_Image resized_image;
@@ -688,15 +736,16 @@ void Init_rszr_image()
688
736
  rb_define_protected_method(cImage, "_format", rszr_image__format_get, 0);
689
737
  rb_define_protected_method(cImage, "_format=", rszr_image__format_set, 1);
690
738
 
691
- rb_define_private_method(cImage, "_initialize", rszr_image__initialize, 2);
692
- rb_define_private_method(cImage, "_resize", rszr_image__resize, 7);
693
- rb_define_private_method(cImage, "_crop", rszr_image__crop, 5);
694
- rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
695
- rb_define_private_method(cImage, "_rotate", rszr_image__rotate, 2);
696
- rb_define_private_method(cImage, "_sharpen!", rszr_image__sharpen_bang, 1);
697
- rb_define_private_method(cImage, "_pixel", rszr_image__pixel_get, 2);
698
- rb_define_private_method(cImage, "_blend", rszr_image__blend, 11);
699
- rb_define_private_method(cImage, "_rectangle!", rszr_image__rectangle_bang, 5);
739
+ rb_define_private_method(cImage, "_initialize", rszr_image__initialize, 2);
740
+ rb_define_private_method(cImage, "_resize", rszr_image__resize, 7);
741
+ rb_define_private_method(cImage, "_crop", rszr_image__crop, 5);
742
+ rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
743
+ rb_define_private_method(cImage, "_rotate", rszr_image__rotate, 2);
744
+ rb_define_private_method(cImage, "_sharpen!", rszr_image__sharpen_bang, 1);
745
+ rb_define_private_method(cImage, "_desaturate!", rszr_image__desaturate_bang, 1);
746
+ rb_define_private_method(cImage, "_pixel", rszr_image__pixel_get, 2);
747
+ rb_define_private_method(cImage, "_blend", rszr_image__blend, 11);
748
+ rb_define_private_method(cImage, "_rectangle!", rszr_image__rectangle_bang, 5);
700
749
 
701
750
  rb_define_private_method(cImage, "_save", rszr_image__save, 4);
702
751
  }
data/ext/rszr/image.h CHANGED
@@ -5,6 +5,10 @@ typedef struct {
5
5
  Imlib_Image image;
6
6
  } rszr_image_handle;
7
7
 
8
+ typedef struct {
9
+ uint8_t blue, green, red, alpha; //alpha, red, green, blue;
10
+ } rszr_raw_pixel;
11
+
8
12
  extern VALUE cImage;
9
13
 
10
14
  void Init_rszr_image();
data/lib/rszr/image.rb CHANGED
@@ -2,6 +2,7 @@ module Rszr
2
2
  class Image
3
3
  GRAVITIES = [true, :center, :n, :nw, :w, :sw, :s, :se, :e, :ne].freeze
4
4
  BLENDING_MODES = %i[copy add subtract reshade].freeze
5
+ DESATURATION_MODES = %i[dynamic luminosity lightness average].freeze
5
6
 
6
7
  extend Identification
7
8
  include Buffered
@@ -119,6 +120,16 @@ module Rszr
119
120
  _sharpen!(-radius)
120
121
  end
121
122
 
123
+ def desaturate!(mode = :dynamic)
124
+ _mode = DESATURATION_MODES.index(mode)
125
+ raise ArgumentError, 'illegal mode' unless _mode
126
+ _desaturate!(_mode);
127
+ end
128
+
129
+ def desaturate(*args, **opts)
130
+ dup.desaturate!(*args, **opts)
131
+ end
132
+
122
133
  def filter(filter_expr)
123
134
  dup.filter!(filter_expr)
124
135
  end
data/lib/rszr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rszr
2
- VERSION = '1.4.0'
2
+ VERSION = '1.5.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rszr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-10 00:00:00.000000000 Z
11
+ date: 2024-02-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fast image resizer - do one thing and do it fast.
14
14
  email: