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 +4 -4
- data/README.md +8 -0
- data/ext/rszr/image.c +58 -9
- data/ext/rszr/image.h +4 -0
- data/lib/rszr/image.rb +11 -0
- data/lib/rszr/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc66aac476d64b18383ef7f619bf6fcf632c00f0bbda3e8e203183886e9caecf
|
4
|
+
data.tar.gz: 4c0132a0e9f845fc5f92535c210ca693b9132d281a88444ab41192425b1cec7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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",
|
692
|
-
rb_define_private_method(cImage, "_resize",
|
693
|
-
rb_define_private_method(cImage, "_crop",
|
694
|
-
rb_define_private_method(cImage, "_turn!",
|
695
|
-
rb_define_private_method(cImage, "_rotate",
|
696
|
-
rb_define_private_method(cImage, "_sharpen!",
|
697
|
-
rb_define_private_method(cImage, "
|
698
|
-
rb_define_private_method(cImage, "
|
699
|
-
rb_define_private_method(cImage, "
|
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
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
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
|
+
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-
|
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:
|