rszr 1.4.0 → 1.5.0

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 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: