image_voodoo 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +1 -1
- data/bin/image_voodoo +4 -0
- data/lib/image_voodoo.rb +38 -25
- data/lib/image_voodoo/awt.rb +22 -13
- data/lib/image_voodoo/awt/shapes.rb +2 -2
- data/lib/image_voodoo/gae.rb +4 -3
- data/lib/image_voodoo/version.rb +1 -1
- data/test/test_image_science.rb +19 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9c58e8e0f8b9c9388e30b313dc18e6cc3b9bea0
|
4
|
+
data.tar.gz: bcf41a5a7f38c576b3c95323ca0e486e3288223a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e6ea0d28e142e9092454ea8e40ab5d87c8a099924611423660e8c496802854df38c5c7b403512d20a9039a6addd14178f0076819af09b1e59cdfafd6dbabe77
|
7
|
+
data.tar.gz: dee71d6424b06ae4fd2f19557ad4374eb8edc6763c7425a47c9b347d742c8c16dd6b421309310942c40d6def9c6ab208c5099e03cd1759ce467ccec314a8e01c
|
data/History.txt
CHANGED
data/bin/image_voodoo
CHANGED
@@ -103,6 +103,10 @@ opts = OptionParser.new do |opts|
|
|
103
103
|
actions << lambda {|img| img.resize(width,height) }
|
104
104
|
end
|
105
105
|
|
106
|
+
opts.on("-f", "--format", "Print the image format") do
|
107
|
+
actions << lambda {|img| puts img.format; img }
|
108
|
+
end
|
109
|
+
|
106
110
|
opts.on_tail("-h", "--help", "Show this message") do
|
107
111
|
puts opts
|
108
112
|
exit 0
|
data/lib/image_voodoo.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
# = ImageVoodoo
|
4
4
|
# == Description
|
5
5
|
#
|
6
|
-
# ImageVoodoo is an ImageScience-API-compatible image manipulation library for
|
7
|
-
# JRuby.
|
6
|
+
# ImageVoodoo is an ImageScience-API-compatible image manipulation library for
|
7
|
+
# JRuby.
|
8
8
|
#
|
9
9
|
# == Examples
|
10
10
|
#
|
@@ -27,7 +27,7 @@
|
|
27
27
|
#
|
28
28
|
class ImageVoodoo
|
29
29
|
attr_accessor :quality
|
30
|
-
|
30
|
+
|
31
31
|
include Java
|
32
32
|
|
33
33
|
JFile = java.io.File
|
@@ -44,8 +44,9 @@ class ImageVoodoo
|
|
44
44
|
require 'image_voodoo/awt'
|
45
45
|
end
|
46
46
|
|
47
|
-
def initialize(src)
|
47
|
+
def initialize(src, format=nil)
|
48
48
|
@src = src
|
49
|
+
@format = format
|
49
50
|
@quality = nil # nil means no specific quality ever specified
|
50
51
|
end
|
51
52
|
|
@@ -58,10 +59,10 @@ class ImageVoodoo
|
|
58
59
|
image = guard { adjust_brightness_impl(scale, offset) }
|
59
60
|
block_given? ? yield(image) : image
|
60
61
|
end
|
61
|
-
|
62
|
+
|
62
63
|
##
|
63
64
|
#
|
64
|
-
# Converts rgb hex color value to an alpha value an yields/returns the new
|
65
|
+
# Converts rgb hex color value to an alpha value an yields/returns the new
|
65
66
|
# image.
|
66
67
|
#
|
67
68
|
def alpha(rgb)
|
@@ -70,12 +71,12 @@ class ImageVoodoo
|
|
70
71
|
end
|
71
72
|
|
72
73
|
##
|
73
|
-
#
|
74
|
+
#
|
74
75
|
# Get current image bytes as a String using provided format. Format parameter
|
75
76
|
# is the informal name of an image type - for instance,
|
76
77
|
# "bmp" or "jpg". If the backend is AWT the types available are listed in
|
77
78
|
# javax.imageio.ImageIO.getWriterFormatNames()
|
78
|
-
#
|
79
|
+
#
|
79
80
|
def bytes(format)
|
80
81
|
java_bytes = guard { bytes_impl(format) }
|
81
82
|
String.from_java_bytes java_bytes
|
@@ -83,8 +84,8 @@ class ImageVoodoo
|
|
83
84
|
|
84
85
|
##
|
85
86
|
#
|
86
|
-
# Creates a square thumbnail of the image cropping the longest edge to
|
87
|
-
# match the shortest edge, resizes to size, and yields/returns the new image.
|
87
|
+
# Creates a square thumbnail of the image cropping the longest edge to
|
88
|
+
# match the shortest edge, resizes to size, and yields/returns the new image.
|
88
89
|
#
|
89
90
|
def cropped_thumbnail(size)
|
90
91
|
l, t, r, b, half = 0, 0, width, height, (width - height).abs / 2
|
@@ -114,7 +115,7 @@ class ImageVoodoo
|
|
114
115
|
end
|
115
116
|
|
116
117
|
##
|
117
|
-
#
|
118
|
+
#
|
118
119
|
# Creates a grayscale version of image and yields/returns the new image.
|
119
120
|
#
|
120
121
|
def greyscale
|
@@ -124,7 +125,7 @@ class ImageVoodoo
|
|
124
125
|
alias_method :grayscale, :greyscale
|
125
126
|
|
126
127
|
##
|
127
|
-
#
|
128
|
+
#
|
128
129
|
# Creates a negative and yields/returns the new image.
|
129
130
|
#
|
130
131
|
def negative
|
@@ -149,7 +150,7 @@ class ImageVoodoo
|
|
149
150
|
|
150
151
|
##
|
151
152
|
#
|
152
|
-
# Resizes the image to width and height and yields/returns the new image.
|
153
|
+
# Resizes the image to width and height and yields/returns the new image.
|
153
154
|
#
|
154
155
|
def resize(width, height)
|
155
156
|
target = guard { resize_impl(width, height) }
|
@@ -159,9 +160,9 @@ class ImageVoodoo
|
|
159
160
|
end
|
160
161
|
|
161
162
|
##
|
162
|
-
#
|
163
|
-
# Saves the image out to path. Changing the file extension will convert
|
164
|
-
# the file type to the appropriate format.
|
163
|
+
#
|
164
|
+
# Saves the image out to path. Changing the file extension will convert
|
165
|
+
# the file type to the appropriate format.
|
165
166
|
#
|
166
167
|
def save(file)
|
167
168
|
format = File.extname(file)
|
@@ -184,8 +185,8 @@ class ImageVoodoo
|
|
184
185
|
|
185
186
|
##
|
186
187
|
#
|
187
|
-
# Creates a proportional thumbnail of the image scaled so its longest
|
188
|
-
# edge is resized to size and yields/returns the new image.
|
188
|
+
# Creates a proportional thumbnail of the image scaled so its longest
|
189
|
+
# edge is resized to size and yields/returns the new image.
|
189
190
|
#
|
190
191
|
def thumbnail(size)
|
191
192
|
target = scale(size.to_f / (width > height ? width : height))
|
@@ -194,8 +195,8 @@ class ImageVoodoo
|
|
194
195
|
|
195
196
|
##
|
196
197
|
#
|
197
|
-
# Crops an image to left, top, right, and bottom and then yields/returns the
|
198
|
-
# new image.
|
198
|
+
# Crops an image to left, top, right, and bottom and then yields/returns the
|
199
|
+
# new image.
|
199
200
|
#
|
200
201
|
def with_crop(left, top, right, bottom)
|
201
202
|
image = guard { with_crop_impl(left, top, right, bottom) }
|
@@ -203,7 +204,7 @@ class ImageVoodoo
|
|
203
204
|
end
|
204
205
|
|
205
206
|
##
|
206
|
-
#
|
207
|
+
#
|
207
208
|
# A top-level image loader opens path and then yields/returns the image.
|
208
209
|
#
|
209
210
|
def self.with_image(path)
|
@@ -213,7 +214,7 @@ class ImageVoodoo
|
|
213
214
|
end
|
214
215
|
|
215
216
|
##
|
216
|
-
#
|
217
|
+
#
|
217
218
|
# A top-level image loader reads bytes and then yields/returns the image.
|
218
219
|
#
|
219
220
|
def self.with_bytes(bytes)
|
@@ -229,7 +230,7 @@ class ImageVoodoo
|
|
229
230
|
##
|
230
231
|
#
|
231
232
|
# *_impl providers only need provide the implementation if it can
|
232
|
-
# support it. Otherwise, this method will detect that the method is
|
233
|
+
# support it. Otherwise, this method will detect that the method is
|
233
234
|
# missing.
|
234
235
|
#
|
235
236
|
def self.guard(&block)
|
@@ -245,7 +246,7 @@ class ImageVoodoo
|
|
245
246
|
|
246
247
|
##
|
247
248
|
#
|
248
|
-
# Returns the height of the image, in pixels.
|
249
|
+
# Returns the height of the image, in pixels.
|
249
250
|
#
|
250
251
|
def height
|
251
252
|
@src.height
|
@@ -253,7 +254,7 @@ class ImageVoodoo
|
|
253
254
|
|
254
255
|
##
|
255
256
|
#
|
256
|
-
# Returns the width of the image, in pixels.
|
257
|
+
# Returns the width of the image, in pixels.
|
257
258
|
#
|
258
259
|
def width
|
259
260
|
@src.width
|
@@ -268,4 +269,16 @@ class ImageVoodoo
|
|
268
269
|
def to_java
|
269
270
|
@src
|
270
271
|
end
|
272
|
+
|
273
|
+
##
|
274
|
+
#
|
275
|
+
# Returns detected image format from binary representation of input data
|
276
|
+
# as upper case string. Eg. JPEG, BMP, PNG. For GWT image representation
|
277
|
+
# compatibility method name is :format. It also accepts block and returns
|
278
|
+
# format as first block argument. When format not detected or not set it
|
279
|
+
# returns nil
|
280
|
+
#
|
281
|
+
def format
|
282
|
+
@format && block_given? ? yield(@format) : @format
|
283
|
+
end
|
271
284
|
end
|
data/lib/image_voodoo/awt.rb
CHANGED
@@ -16,16 +16,16 @@ class ImageVoodoo
|
|
16
16
|
java_import javax.imageio.ImageIO
|
17
17
|
java_import javax.imageio.IIOImage
|
18
18
|
java_import javax.imageio.ImageWriteParam
|
19
|
-
java_import javax.imageio.stream.FileImageOutputStream
|
19
|
+
java_import javax.imageio.stream.FileImageOutputStream
|
20
20
|
java_import javax.swing.JFrame
|
21
21
|
|
22
22
|
# FIXME: Move and rewrite in terms of new shape
|
23
23
|
##
|
24
24
|
#
|
25
|
-
# *AWT* (experimental) Add a border to the image and yield/return a new
|
25
|
+
# *AWT* (experimental) Add a border to the image and yield/return a new
|
26
26
|
# image. The following options are supported:
|
27
27
|
# - width: How thick is the border (default: 3)
|
28
|
-
# - color: Which color is the border (in rrggbb hex value)
|
28
|
+
# - color: Which color is the border (in rrggbb hex value)
|
29
29
|
# - style: etched, raised, plain (default: plain)
|
30
30
|
#
|
31
31
|
def add_border(options = {})
|
@@ -48,7 +48,7 @@ class ImageVoodoo
|
|
48
48
|
end
|
49
49
|
|
50
50
|
##
|
51
|
-
#
|
51
|
+
#
|
52
52
|
# A simple swing wrapper around an image voodoo object.
|
53
53
|
#
|
54
54
|
class JImagePanel < javax.swing.JPanel
|
@@ -71,7 +71,7 @@ class ImageVoodoo
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
ImageVoodoo::JImagePanel.__persistent__ = true
|
74
|
+
ImageVoodoo::JImagePanel.__persistent__ = true
|
75
75
|
|
76
76
|
# Internal class for closing preview window
|
77
77
|
class WindowClosed
|
@@ -96,11 +96,11 @@ class ImageVoodoo
|
|
96
96
|
|
97
97
|
##
|
98
98
|
# *AWT* paint/render to the source
|
99
|
-
#
|
99
|
+
#
|
100
100
|
def paint(src=dup_src)
|
101
101
|
yield src.graphics
|
102
102
|
src.graphics.dispose
|
103
|
-
ImageVoodoo.new
|
103
|
+
ImageVoodoo.new(src, @format)
|
104
104
|
end
|
105
105
|
|
106
106
|
##
|
@@ -115,7 +115,7 @@ class ImageVoodoo
|
|
115
115
|
tracker = java.awt.MediaTracker.new(java.awt.Label.new(""))
|
116
116
|
tracker.addImage(image, 0);
|
117
117
|
tracker.waitForID(0)
|
118
|
-
target = paint(BufferedImage.new(image.width, image.height, RGB)) do |g|
|
118
|
+
target = paint(BufferedImage.new(image.width, image.height, RGB)) do |g|
|
119
119
|
g.draw_image image, 0, 0, nil
|
120
120
|
end
|
121
121
|
block_given? ? yield(target) : target
|
@@ -140,12 +140,21 @@ class ImageVoodoo
|
|
140
140
|
SCALE_SMOOTH = java.awt.Image::SCALE_SMOOTH
|
141
141
|
|
142
142
|
def self.with_image_impl(file)
|
143
|
+
format = detect_format_from_input(file)
|
143
144
|
buffered_image = ImageIO.read(file)
|
144
|
-
buffered_image ? ImageVoodoo.new(buffered_image) : nil
|
145
|
+
buffered_image ? ImageVoodoo.new(buffered_image, format) : nil
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.detect_format_from_input(input)
|
149
|
+
stream = ImageIO.createImageInputStream(input)
|
150
|
+
readers = ImageIO.getImageReaders(stream)
|
151
|
+
readers.has_next ? readers.next.format_name.upcase : nil
|
145
152
|
end
|
146
153
|
|
147
154
|
def self.with_bytes_impl(bytes)
|
148
|
-
|
155
|
+
input_stream = ByteArrayInputStream.new(bytes)
|
156
|
+
format = detect_format_from_input(input_stream)
|
157
|
+
ImageVoodoo.new(ImageIO.read(input_stream), format)
|
149
158
|
end
|
150
159
|
|
151
160
|
#
|
@@ -158,7 +167,7 @@ class ImageVoodoo
|
|
158
167
|
java.awt.Color.new(rgb[0,2].to_i(16), rgb[2,2].to_i(16), rgb[4,2].to_i(16))
|
159
168
|
end
|
160
169
|
|
161
|
-
#
|
170
|
+
#
|
162
171
|
# Determines the best colorspace for a new image based on whether the
|
163
172
|
# existing image contains an alpha channel or not.
|
164
173
|
#
|
@@ -166,7 +175,7 @@ class ImageVoodoo
|
|
166
175
|
@src.color_model.has_alpha ? ARGB : RGB
|
167
176
|
end
|
168
177
|
|
169
|
-
#
|
178
|
+
#
|
170
179
|
# Make a duplicate of the underlying Java src image
|
171
180
|
#
|
172
181
|
def dup_src
|
@@ -238,7 +247,7 @@ class ImageVoodoo
|
|
238
247
|
end
|
239
248
|
|
240
249
|
def with_crop_impl(left, top, right, bottom)
|
241
|
-
ImageVoodoo.new
|
250
|
+
ImageVoodoo.new(@src.get_subimage(left, top, right-left, bottom-top), @format)
|
242
251
|
end
|
243
252
|
|
244
253
|
def write_new_image(format, stream)
|
@@ -6,7 +6,7 @@ class ImageVoodoo
|
|
6
6
|
def square(x, y, dim, rgb, fill=true)
|
7
7
|
square_rounded(x, y, dim, rgb, 0, fill)
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
##
|
11
11
|
# *AWT* Draw a rectangle
|
12
12
|
#
|
@@ -35,7 +35,7 @@ class ImageVoodoo
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def as_color(color)
|
38
|
-
paint do |g|
|
38
|
+
paint do |g|
|
39
39
|
old_color = g.color
|
40
40
|
g.color = color
|
41
41
|
yield g
|
data/lib/image_voodoo/gae.rb
CHANGED
@@ -21,7 +21,7 @@ class ImageVoodoo
|
|
21
21
|
#++
|
22
22
|
|
23
23
|
private
|
24
|
-
|
24
|
+
|
25
25
|
def flip_horizontally_impl
|
26
26
|
transform(ImagesServiceFactory.make_horizontal_flip)
|
27
27
|
end
|
@@ -40,14 +40,15 @@ class ImageVoodoo
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.with_bytes_impl(bytes)
|
43
|
-
|
43
|
+
image = ImageServicesFactory.make_image(bytes)
|
44
|
+
ImageVoodoo.new image, image.format.to_s.upcase
|
44
45
|
end
|
45
46
|
|
46
47
|
def from_java_bytes
|
47
48
|
String.from_java_bytes @src.image_data
|
48
49
|
end
|
49
50
|
|
50
|
-
#
|
51
|
+
#
|
51
52
|
# Make a duplicate of the underlying src image
|
52
53
|
#
|
53
54
|
def dup_src
|
data/lib/image_voodoo/version.rb
CHANGED
data/test/test_image_science.rb
CHANGED
@@ -130,4 +130,23 @@ class TestImageScience < Test::Unit::TestCase
|
|
130
130
|
|
131
131
|
deny File.exists?(@tmppath)
|
132
132
|
end
|
133
|
+
|
134
|
+
def test_image_format_retrieval
|
135
|
+
ImageScience.with_image @path do |img|
|
136
|
+
assert_equal 'PNG', img.format
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_image_format_retrieval_from_bytes
|
141
|
+
ImageScience.with_image @path do |img|
|
142
|
+
bytes_string = img.bytes('JPEG')
|
143
|
+
image = ImageScience.with_bytes(bytes_string)
|
144
|
+
assert_equal 'JPEG', image.format
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_image_format_retrieval_fail_when_invalid_bytes
|
149
|
+
image = ImageScience.with_bytes("some invalid image bytes")
|
150
|
+
assert_equal nil, image.format
|
151
|
+
end
|
133
152
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_voodoo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas E. Enebo, Charles Nutter, Nick Sieger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Image manipulation in JRuby with ImageScience compatible API
|
14
14
|
email: tom.enebo@gmail.com
|