rszr 0.3.2 → 0.4.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 +11 -6
- data/lib/rszr.rb +1 -0
- data/lib/rszr/base.rb +2 -0
- data/lib/rszr/image.rb +40 -44
- data/lib/rszr/lock.rb +23 -0
- data/lib/rszr/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6ab5d9447d5919f0bed35e0562f7645bb5a23db
|
4
|
+
data.tar.gz: 88988dc45c31575db6a1cf11618298be6641fca8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a5d7d5ba83088cce7de9af7a0d68c92d2e2c0f58029617dfa1c270a83aa58af96168b11b2bebdd0c3ad1a930598726acd0809b5b3a7dea901567402bf23ed1b
|
7
|
+
data.tar.gz: 1a53df4fcbd02f524d42cfadcd9dbacdba3945423f5a244af8da190e4cc59de2b87b267de78b0481c4c8d106d27dc16a2ec30f4f728310eced9e9da8a0191f0f
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/rszr.svg)](http://badge.fury.io/rb/rszr) [![Build Status](https://travis-ci.org/mtgrosser/rszr.svg)](https://travis-ci.org/mtgrosser/rszr)
|
2
|
-
# Rszr
|
2
|
+
# Rszr - fast image resizer for Ruby
|
3
3
|
|
4
|
-
Rszr is
|
4
|
+
Rszr is an image resizer for Ruby based on the Imlib2 library. It is faster and consumes less memory than MiniMagick, rmagick and GD2.
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
|
@@ -23,7 +23,7 @@ Using homebrew:
|
|
23
23
|
brew install imlib2
|
24
24
|
```
|
25
25
|
|
26
|
-
|
26
|
+
#### Linux
|
27
27
|
|
28
28
|
Using your favourite package manager:
|
29
29
|
|
@@ -66,12 +66,17 @@ image.height => 300
|
|
66
66
|
image.dimensions => [400, 300]
|
67
67
|
```
|
68
68
|
|
69
|
+
## Thread safety
|
70
|
+
|
71
|
+
As of version 0.4.0, Rszr provides thread safety by synchronizing access to imlib2 function calls.
|
72
|
+
Use of any previous versions in a threaded environment is discouraged.
|
73
|
+
|
69
74
|
## Speed
|
70
75
|
|
71
76
|
Resizing an 1500x997 JPEG image to 800x532, 100 times:
|
72
77
|
|
73
78
|
Library | Time
|
74
79
|
----------------|-----------
|
75
|
-
MiniMagick |
|
76
|
-
GD2 | 7.
|
77
|
-
Rszr |
|
80
|
+
MiniMagick | 12.9 s
|
81
|
+
GD2 | 7.5 s
|
82
|
+
Rszr | 2.8 s
|
data/lib/rszr.rb
CHANGED
data/lib/rszr/base.rb
CHANGED
data/lib/rszr/image.rb
CHANGED
@@ -8,7 +8,7 @@ module Rszr
|
|
8
8
|
protected :instantiate
|
9
9
|
|
10
10
|
def new(width, height)
|
11
|
-
ptr = imlib_create_image(width, height)
|
11
|
+
ptr = with_lock { imlib_create_image(width, height) }
|
12
12
|
raise Error, 'Could not instantiate image' if ptr.null?
|
13
13
|
instantiate(ptr)
|
14
14
|
end
|
@@ -17,8 +17,10 @@ module Rszr
|
|
17
17
|
path = path.to_s
|
18
18
|
raise FileNotFound unless File.exist?(path)
|
19
19
|
load_error = LoadError.new
|
20
|
-
|
21
|
-
|
20
|
+
ptr = with_lock do
|
21
|
+
imlib_set_cache_size(0)
|
22
|
+
imlib_load_image_with_error_return(path, load_error.ptr)
|
23
|
+
end
|
22
24
|
raise load_error, load_error.message if ptr.null?
|
23
25
|
return instantiate(ptr)
|
24
26
|
end
|
@@ -27,8 +29,10 @@ module Rszr
|
|
27
29
|
protected
|
28
30
|
|
29
31
|
def finalize(ptr)
|
30
|
-
|
31
|
-
|
32
|
+
with_lock do
|
33
|
+
imlib_context_set_image(ptr)
|
34
|
+
imlib_free_image
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
end
|
@@ -38,13 +42,11 @@ module Rszr
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def width
|
41
|
-
|
42
|
-
imlib_image_get_width
|
45
|
+
with_image { imlib_image_get_width }
|
43
46
|
end
|
44
47
|
|
45
48
|
def height
|
46
|
-
|
47
|
-
imlib_image_get_height
|
49
|
+
with_image { imlib_image_get_height }
|
48
50
|
end
|
49
51
|
|
50
52
|
def dimensions
|
@@ -52,8 +54,7 @@ module Rszr
|
|
52
54
|
end
|
53
55
|
|
54
56
|
def format
|
55
|
-
|
56
|
-
str_ptr = imlib_image_format
|
57
|
+
str_ptr = with_image { imlib_image_format }
|
57
58
|
return if str_ptr.null?
|
58
59
|
str_ptr.to_s
|
59
60
|
end
|
@@ -77,13 +78,14 @@ module Rszr
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def save(path, format = nil)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
81
|
+
with_image do
|
82
|
+
format ||= format_from_filename(path) || 'jpg'
|
83
|
+
imlib_image_set_format(format)
|
84
|
+
save_error = SaveError.new
|
85
|
+
imlib_save_image_with_error_return(path, save_error.ptr)
|
86
|
+
raise save_error, save_error.message if save_error.error?
|
87
|
+
true
|
88
|
+
end
|
87
89
|
end
|
88
90
|
|
89
91
|
def inspect
|
@@ -103,35 +105,35 @@ module Rszr
|
|
103
105
|
def create_resized_image(*args)
|
104
106
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
105
107
|
assert_valid_keys options, :crop, :background, :skew #:extend, :width, :height, :max_width, :max_height, :box
|
106
|
-
|
108
|
+
original_width, original_height = width, height
|
107
109
|
x, y, = 0, 0
|
108
110
|
if args.size == 1
|
109
111
|
scale = args.first
|
110
112
|
raise ArgumentError, "scale #{scale.inspect} out of range" unless scale > 0 && scale < 1
|
111
|
-
new_width =
|
112
|
-
new_height =
|
113
|
+
new_width = original_width.to_f * scale
|
114
|
+
new_height = original_height.to_f * scale
|
113
115
|
elsif args.size == 2
|
114
116
|
box_width, box_height = args
|
115
117
|
if :auto == box_width && box_height.is_a?(Numeric)
|
116
118
|
new_height = box_height
|
117
|
-
new_width = box_height.to_f /
|
119
|
+
new_width = box_height.to_f / original_height.to_f * original_width.to_f
|
118
120
|
elsif box_width.is_a?(Numeric) && :auto == box_height
|
119
121
|
new_width = box_width
|
120
|
-
new_height = box_width.to_f /
|
122
|
+
new_height = box_width.to_f / original_width.to_f * original_height.to_f
|
121
123
|
elsif box_width.is_a?(Numeric) && box_height.is_a?(Numeric)
|
122
124
|
if options[:skew]
|
123
125
|
new_width, new_height = box_width, box_height
|
124
126
|
elsif options[:crop]
|
125
127
|
# TODO: calculate x, y offset if crop
|
126
128
|
else
|
127
|
-
scale =
|
129
|
+
scale = original_width.to_f / original_height.to_f
|
128
130
|
box_scale = box_width.to_f / box_height.to_f
|
129
131
|
if scale >= box_scale # wider
|
130
132
|
new_width = box_width
|
131
|
-
new_height =
|
133
|
+
new_height = original_height.to_f * box_width.to_f / original_width.to_f
|
132
134
|
else # narrower
|
133
135
|
new_height = box_height
|
134
|
-
new_width =
|
136
|
+
new_width = original_width.to_f * box_height.to_f / original_height.to_f
|
135
137
|
end
|
136
138
|
end
|
137
139
|
else
|
@@ -140,29 +142,16 @@ module Rszr
|
|
140
142
|
else
|
141
143
|
raise ArgumentError, "wrong number of arguments (#{args.size} for 1..2)"
|
142
144
|
end
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
# scale = max_width.to_f / new_width.to_f
|
148
|
-
# width = max_width
|
149
|
-
# new_height = (scale * new_height).to_i
|
150
|
-
#end
|
151
|
-
#if max_height = options[:max_height] and new_height > max_height
|
152
|
-
# scale = max_height.to_f / new_height.to_f
|
153
|
-
# new_height = max_height
|
154
|
-
# new_width = (scale * new_width).to_i
|
155
|
-
#end
|
156
|
-
|
157
|
-
imlib_context_set_anti_alias(1)
|
158
|
-
resized_ptr = imlib_create_cropped_scaled_image(x, y, imlib_image_get_width, imlib_image_get_height, new_width.round, new_height.round)
|
145
|
+
resized_ptr = with_image do
|
146
|
+
imlib_context_set_anti_alias(1)
|
147
|
+
imlib_create_cropped_scaled_image(x, y, imlib_image_get_width, imlib_image_get_height, new_width.round, new_height.round)
|
148
|
+
end
|
159
149
|
raise TransformationError, "error resizing image" if resized_ptr.null?
|
160
150
|
resized_ptr
|
161
151
|
end
|
162
152
|
|
163
153
|
def create_cropped_image(x, y, width, height)
|
164
|
-
|
165
|
-
cropped_ptr = imlib_create_cropped_image(x, y, width, height)
|
154
|
+
cropped_ptr = with_image { imlib_create_cropped_image(x, y, width, height) }
|
166
155
|
raise TransformationError, 'error cropping image' if cropped_ptr.null?
|
167
156
|
cropped_ptr
|
168
157
|
end
|
@@ -175,6 +164,13 @@ module Rszr
|
|
175
164
|
imlib_context_set_image(ptr)
|
176
165
|
end
|
177
166
|
|
167
|
+
def with_image
|
168
|
+
with_lock do
|
169
|
+
context_set_image
|
170
|
+
yield
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
178
174
|
def instantiate(ptr)
|
179
175
|
self.class.send(:instantiate, ptr)
|
180
176
|
end
|
data/lib/rszr/lock.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Rszr
|
2
|
+
@mutex = Mutex.new
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def with_lock(&block) # :nodoc:
|
7
|
+
mutex.synchronize(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def mutex
|
13
|
+
@mutex
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Lock # :nodoc:
|
18
|
+
def with_lock(&block)
|
19
|
+
Rszr.with_lock(&block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
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: 0.
|
4
|
+
version: 0.4.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:
|
11
|
+
date: 2019-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- lib/rszr/handle.rb
|
125
125
|
- lib/rszr/image.rb
|
126
126
|
- lib/rszr/lib.rb
|
127
|
+
- lib/rszr/lock.rb
|
127
128
|
- lib/rszr/version.rb
|
128
129
|
homepage: https://github.com/mtgrosser/rszr
|
129
130
|
licenses:
|
@@ -145,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
146
|
version: '0'
|
146
147
|
requirements: []
|
147
148
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.5.2.3
|
149
150
|
signing_key:
|
150
151
|
specification_version: 4
|
151
152
|
summary: Fast image resizer
|