quick_magick 0.1.0 → 0.2.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.
Potentially problematic release.
This version of quick_magick might be problematic. Click here for more details.
- data/README +23 -1
- data/Rakefile +1 -1
- data/lib/quick_magick/image.rb +182 -14
- data/quick_magick.gemspec +2 -2
- data/test/image_test.rb +20 -0
- metadata +2 -2
data/README
CHANGED
@@ -33,7 +33,7 @@ Resize and image
|
|
33
33
|
i.save "resized_image.jpg"
|
34
34
|
|
35
35
|
or
|
36
|
-
i.
|
36
|
+
i.append_to_operators 'resize', "300x300!"
|
37
37
|
|
38
38
|
or
|
39
39
|
i.resize 300, 300, nil, nil, QuickMagick::AspectGeometry
|
@@ -60,5 +60,27 @@ You can also display an image to Xserver
|
|
60
60
|
i = QuickMagick::Image.read('test.jpg')
|
61
61
|
i.display
|
62
62
|
|
63
|
+
QuickMagick supports also ImageLists
|
64
|
+
il = QuickMagick::ImageList.new('test.jpg', 'test2.jpg')
|
65
|
+
il << QuickMagick::Image.read('test3.jpg')
|
66
|
+
il.format = 'gif'
|
67
|
+
il.resize "300x300>"
|
68
|
+
il.save!
|
69
|
+
|
70
|
+
You can also create images from scratch
|
71
|
+
# Create a 300x300 gradient image from yellow to red
|
72
|
+
i1 = QuickMagick::Image::gradient(300, 300, QuickMagick::RadialGradient, :yellow, :red)
|
73
|
+
i1.save 'gradient.png'
|
74
|
+
|
75
|
+
# Create a 100x200 CheckerBoard image
|
76
|
+
i1 = QuickMagick::Image::pattern(100, 200, :checkerboard)
|
77
|
+
i1.display
|
78
|
+
|
79
|
+
... and draw primitives on them
|
80
|
+
i = QuickMagick::Image::solid(100, 100, :white)
|
81
|
+
i.draw_line(0,0,50,50)
|
82
|
+
i.draw_text(30, 30, "Hello world!", :rotate=>45)
|
83
|
+
i.save 'hello.jpg'
|
84
|
+
|
63
85
|
Check all command line options of ImageMagick at
|
64
86
|
http://www.imagemagick.org/script/convert.php
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('quick_magick', '0.
|
5
|
+
Echoe.new('quick_magick', '0.2.0') do |p|
|
6
6
|
p.description = "QuickMagick allows you to access ImageMagick command line functions using Ruby interface."
|
7
7
|
p.url = "http://quickmagick.rubyforge.org/"
|
8
8
|
p.author = "Ahmed ElDawy"
|
data/lib/quick_magick/image.rb
CHANGED
@@ -16,7 +16,7 @@ module QuickMagick
|
|
16
16
|
# create an array of images from the given file
|
17
17
|
def read(filename, &proc)
|
18
18
|
info = identify(%Q<"#{filename}">)
|
19
|
-
|
19
|
+
unless $?.success?
|
20
20
|
raise QuickMagick::QuickMagickError, "Illegal file \"#{filename}\""
|
21
21
|
end
|
22
22
|
info_lines = info.split(/[\r\n]/)
|
@@ -34,6 +34,8 @@ module QuickMagick
|
|
34
34
|
|
35
35
|
alias open read
|
36
36
|
|
37
|
+
# Creates a new image initially set to gradient
|
38
|
+
# Default gradient is linear gradient from black to white
|
37
39
|
def gradient(width, height, type=QuickMagick::LinearGradient, color1=nil, color2=nil)
|
38
40
|
template_name = type + ":"
|
39
41
|
template_name << color1.to_s if color1
|
@@ -63,9 +65,10 @@ module QuickMagick
|
|
63
65
|
|
64
66
|
# returns info for an image using <code>identify</code> command
|
65
67
|
def identify(filename)
|
66
|
-
`identify #{filename}`
|
68
|
+
`identify #{filename} 2>&1`
|
67
69
|
end
|
68
70
|
|
71
|
+
# Encodes a geometry string with the given options
|
69
72
|
def retrieve_geometry(width, height=nil, x=nil, y=nil, flag=nil)
|
70
73
|
geometry_string = ""
|
71
74
|
geometry_string << width.to_s if width
|
@@ -79,14 +82,15 @@ module QuickMagick
|
|
79
82
|
|
80
83
|
# append the given option, value pair to the args for the current image
|
81
84
|
def append_to_operators(arg, value="")
|
82
|
-
@operators << %Q<-#{arg} #{value}>
|
85
|
+
@operators << %Q<-#{arg} "#{value}">
|
83
86
|
end
|
84
87
|
|
85
88
|
# append the given option, value pair to the settings of the current image
|
86
89
|
def append_to_settings(arg, value="")
|
87
|
-
@settings << %Q<-#{arg} #{value}>
|
90
|
+
@settings << %Q<-#{arg} "#{value}">
|
88
91
|
end
|
89
92
|
|
93
|
+
# Image settings supported by ImageMagick
|
90
94
|
IMAGE_SETTINGS_METHODS = %w{
|
91
95
|
adjoin affine alpha antialias authenticate attenuate background bias black-point-compensation
|
92
96
|
blue-primary bordercolor caption channel colors colorspace comment compose compress define
|
@@ -99,6 +103,7 @@ module QuickMagick
|
|
99
103
|
density page sampling-factor size tile-offset
|
100
104
|
}
|
101
105
|
|
106
|
+
# Image operators supported by ImageMagick
|
102
107
|
IMAGE_OPERATORS_METHODS = %w{
|
103
108
|
alpha auto-orient bench black-threshold bordercolor charcoal clip clip-mask clip-path colorize
|
104
109
|
contrast convolve cycle decipher deskew despeckle distort draw edge encipher emboss enhance equalize
|
@@ -117,16 +122,19 @@ module QuickMagick
|
|
117
122
|
crop
|
118
123
|
}
|
119
124
|
|
125
|
+
# fills a rectangle with a solid color
|
120
126
|
def floodfill(width, height=nil, x=nil, y=nil, flag=nil, color=nil)
|
121
127
|
# TODO do a special method for floodfill
|
122
128
|
end
|
123
129
|
|
130
|
+
# methods that are called with (=)
|
124
131
|
WITH_EQUAL_METHODS =
|
125
132
|
%w{alpha antialias background bias black-point-compensation blue-primary border bordercolor caption
|
126
133
|
cahnnel colors colorspace comment compose compress depth density encoding endian family fill filter
|
127
134
|
font format frame fuzz geometry gravity label mattecolor page pointsize quality undercolor units weight
|
128
135
|
brodercolor transparent type size}
|
129
136
|
|
137
|
+
# methods that takes geometry options
|
130
138
|
WITH_GEOMETRY_METHODS =
|
131
139
|
%w{density page sampling-factor size tile-offset adaptive-blur adaptive-resize adaptive-sharpen
|
132
140
|
annotate blur border chop contrast-stretch extent extract floodfill frame gaussian-blur
|
@@ -137,15 +145,15 @@ module QuickMagick
|
|
137
145
|
IMAGE_SETTINGS_METHODS.each do |method|
|
138
146
|
if WITH_EQUAL_METHODS.include?(method)
|
139
147
|
define_method((method+'=').to_sym) do |arg|
|
140
|
-
append_to_settings(method,
|
148
|
+
append_to_settings(method, arg)
|
141
149
|
end
|
142
150
|
elsif WITH_GEOMETRY_METHODS.include?(method)
|
143
151
|
define_method((method).to_sym) do |*args|
|
144
|
-
append_to_settings(method,
|
152
|
+
append_to_settings(method, QuickMagick::Image.retrieve_geometry(*args) )
|
145
153
|
end
|
146
154
|
else
|
147
155
|
define_method(method.to_sym) do |*args|
|
148
|
-
append_to_settings(method, args.
|
156
|
+
append_to_settings(method, args.join(" "))
|
149
157
|
end
|
150
158
|
end
|
151
159
|
end
|
@@ -153,15 +161,15 @@ module QuickMagick
|
|
153
161
|
IMAGE_OPERATORS_METHODS.each do |method|
|
154
162
|
if WITH_EQUAL_METHODS.include?(method)
|
155
163
|
define_method((method+'=').to_sym) do |arg|
|
156
|
-
append_to_operators(method,
|
164
|
+
append_to_operators(method, arg )
|
157
165
|
end
|
158
166
|
elsif WITH_GEOMETRY_METHODS.include?(method)
|
159
167
|
define_method((method).to_sym) do |*args|
|
160
|
-
append_to_operators(method,
|
168
|
+
append_to_operators(method, QuickMagick::Image.retrieve_geometry(*args) )
|
161
169
|
end
|
162
170
|
else
|
163
171
|
define_method(method.to_sym) do |*args|
|
164
|
-
append_to_operators(method, args.
|
172
|
+
append_to_operators(method, args.join(" "))
|
165
173
|
end
|
166
174
|
end
|
167
175
|
end
|
@@ -176,27 +184,172 @@ module QuickMagick
|
|
176
184
|
@pseudo_image = pseudo_image
|
177
185
|
if info_line
|
178
186
|
@image_infoline = info_line.split
|
179
|
-
@image_infoline[0..1] = @image_infoline[0..1].join(' ') while !@image_infoline[0].start_with?(image_filename)
|
187
|
+
@image_infoline[0..1] = @image_infoline[0..1].join(' ') while @image_infoline.size > 1 && !@image_infoline[0].start_with?(image_filename)
|
180
188
|
end
|
181
189
|
@operators = ""
|
182
190
|
@settings = ""
|
183
191
|
end
|
184
192
|
|
193
|
+
# The command line so far that will be used to convert or save the image
|
185
194
|
def command_line
|
186
195
|
%Q<#{@settings} "#{image_filename}" #{@operators}>
|
187
196
|
end
|
188
197
|
|
198
|
+
# An information line about the image obtained using 'identify' command line
|
189
199
|
def image_infoline
|
190
200
|
unless @image_infoline
|
191
201
|
@image_infoline = QuickMagick::Image::identify(command_line).split
|
192
|
-
@image_infoline[0..1] = @image_infoline[0..1].join(' ') while !@image_infoline[0].start_with?(image_filename)
|
202
|
+
@image_infoline[0..1] = @image_infoline[0..1].join(' ') while @image_infoline.size > 1 && !@image_infoline[0].start_with?(image_filename)
|
193
203
|
end
|
194
204
|
@image_infoline
|
195
205
|
end
|
196
206
|
|
207
|
+
# converts options passed to any primitive to a string that can be passed to ImageMagick
|
208
|
+
# options allowed are:
|
209
|
+
# * rotate degrees
|
210
|
+
# * translate dx,dy
|
211
|
+
# * scale sx,sy
|
212
|
+
# * skewX degrees
|
213
|
+
# * skewY degrees
|
214
|
+
# * gravity NorthWest, North, NorthEast, West, Center, East, SouthWest, South, or SouthEast
|
215
|
+
# The rotate primitive rotates subsequent shape primitives and text primitives about the origin of the main image.
|
216
|
+
# If you set the region before the draw command, the origin for transformations is the upper left corner of the region.
|
217
|
+
# The translate primitive translates subsequent shape and text primitives.
|
218
|
+
# The scale primitive scales them.
|
219
|
+
# The skewX and skewY primitives skew them with respect to the origin of the main image or the region.
|
220
|
+
# The text gravity primitive only affects the placement of text and does not interact with the other primitives.
|
221
|
+
# It is equivalent to using the gravity method, except that it is limited in scope to the draw_text option in which it appears.
|
222
|
+
def options_to_str(options)
|
223
|
+
options.to_a.flatten.join " "
|
224
|
+
end
|
225
|
+
|
226
|
+
# Converts an array of coordinates to a string that can be passed to polygon, polyline and bezier
|
227
|
+
def points_to_str(points)
|
228
|
+
raise QuickMagick::QuickMagickError, "Points must be an even number of coordinates" if points.size.odd?
|
229
|
+
points_str = ""
|
230
|
+
points.each_slice(2) do |point|
|
231
|
+
points_str << point.join(",") << " "
|
232
|
+
end
|
233
|
+
points_str
|
234
|
+
end
|
235
|
+
|
236
|
+
# The shape primitives are drawn in the color specified by the preceding -fill setting.
|
237
|
+
# For unfilled shapes, use -fill none.
|
238
|
+
# You can optionally control the stroke (the "outline" of a shape) with the -stroke and -strokewidth settings.
|
239
|
+
|
240
|
+
# draws a point at the given location in pixels
|
241
|
+
# A point primitive is specified by a single point in the pixel plane, that is, by an ordered pair
|
242
|
+
# of integer coordinates, x,y.
|
243
|
+
# (As it involves only a single pixel, a point primitive is not affected by -stroke or -strokewidth.)
|
244
|
+
def draw_point(x, y, options={})
|
245
|
+
append_to_operators("draw", "#{options_to_str(options)} point #{x},#{y}")
|
246
|
+
end
|
247
|
+
|
248
|
+
# draws a line between the given two points
|
249
|
+
# A line primitive requires a start point and end point.
|
250
|
+
def draw_line(x0, y0, x1, y1, options={})
|
251
|
+
append_to_operators("draw", "#{options_to_str(options)} line #{x0},#{y0} #{x1},#{y1}")
|
252
|
+
end
|
253
|
+
|
254
|
+
# draw a rectangle with the given two corners
|
255
|
+
# A rectangle primitive is specified by the pair of points at the upper left and lower right corners.
|
256
|
+
def draw_rectangle(x0, y0, x1, y1, options={})
|
257
|
+
append_to_operators("draw", "#{options_to_str(options)} rectangle #{x0},#{y0} #{x1},#{y1}")
|
258
|
+
end
|
259
|
+
|
260
|
+
# draw a rounded rectangle with the given two corners
|
261
|
+
# wc and hc are the width and height of the arc
|
262
|
+
# A roundRectangle primitive takes the same corner points as a rectangle
|
263
|
+
# followed by the width and height of the rounded corners to be removed.
|
264
|
+
def draw_round_rectangle(x0, y0, x1, y1, wc, hc, options={})
|
265
|
+
append_to_operators("draw", "#{options_to_str(options)} roundRectangle #{x0},#{y0} #{x1},#{y1} #{wc},#{hc}")
|
266
|
+
end
|
267
|
+
|
268
|
+
# The arc primitive is used to inscribe an elliptical segment in to a given rectangle.
|
269
|
+
# An arc requires the two corners used for rectangle (see above) followed by
|
270
|
+
# the start and end angles of the arc of the segment segment (e.g. 130,30 200,100 45,90).
|
271
|
+
# The start and end points produced are then joined with a line segment and the resulting segment of an ellipse is filled.
|
272
|
+
def draw_arc(x0, y0, x1, y1, a0, a1, options={})
|
273
|
+
append_to_operators("draw", "#{options_to_str(options)} arc #{x0},#{y0} #{x1},#{y1} #{a0},#{a1}")
|
274
|
+
end
|
275
|
+
|
276
|
+
# Use ellipse to draw a partial (or whole) ellipse.
|
277
|
+
# Give the center point, the horizontal and vertical "radii"
|
278
|
+
# (the semi-axes of the ellipse) and start and end angles in degrees (e.g. 100,100 100,150 0,360).
|
279
|
+
def draw_ellipse(x0, y0, rx, ry, a0, a1, options={})
|
280
|
+
append_to_operators("draw", "#{options_to_str(options)} ellipse #{x0},#{y0} #{rx},#{ry} #{a0},#{a1}")
|
281
|
+
end
|
282
|
+
|
283
|
+
# The circle primitive makes a disk (filled) or circle (unfilled). Give the center and any point on the perimeter (boundary).
|
284
|
+
def draw_circle(x0, y0, x1, y1, options={})
|
285
|
+
append_to_operators("draw", "#{options_to_str(options)} circle #{x0},#{y0} #{x1},#{y1}")
|
286
|
+
end
|
287
|
+
|
288
|
+
# The polyline primitive requires three or more points to define their perimeters.
|
289
|
+
# A polyline is simply a polygon in which the final point is not stroked to the start point.
|
290
|
+
# When unfilled, this is a polygonal line. If the -stroke setting is none (the default), then a polyline is identical to a polygon.
|
291
|
+
def draw_polyline(points, options={})
|
292
|
+
append_to_operators("draw", "#{options_to_str(options)} polyline #{points_to_str(points)}")
|
293
|
+
end
|
294
|
+
|
295
|
+
# The polygon primitive requires three or more points to define their perimeters.
|
296
|
+
# A polyline is simply a polygon in which the final point is not stroked to the start point.
|
297
|
+
# When unfilled, this is a polygonal line. If the -stroke setting is none (the default), then a polyline is identical to a polygon.
|
298
|
+
def draw_polygon(points, options={})
|
299
|
+
append_to_operators("draw", "#{options_to_str(options)} polygon #{points_to_str(points)}")
|
300
|
+
end
|
301
|
+
|
302
|
+
# The Bezier primitive creates a spline curve and requires three or points to define its shape.
|
303
|
+
# The first and last points are the knots and these points are attained by the curve,
|
304
|
+
# while any intermediate coordinates are control points.
|
305
|
+
# If two control points are specified, the line between each end knot and its sequentially
|
306
|
+
# respective control point determines the tangent direction of the curve at that end.
|
307
|
+
# If one control point is specified, the lines from the end knots to the one control point
|
308
|
+
# determines the tangent directions of the curve at each end.
|
309
|
+
# If more than two control points are specified, then the additional control points
|
310
|
+
# act in combination to determine the intermediate shape of the curve.
|
311
|
+
# In order to draw complex curves, it is highly recommended either to use the path primitive
|
312
|
+
# or to draw multiple four-point bezier segments with the start and end knots of each successive segment repeated.
|
313
|
+
def draw_bezier(points, options={})
|
314
|
+
append_to_operators("draw", "#{options_to_str(options)} bezier #{points_to_str(points)}")
|
315
|
+
end
|
316
|
+
|
317
|
+
# A path represents an outline of an object, defined in terms of moveto
|
318
|
+
# (set a new current point), lineto (draw a straight line), curveto (draw a Bezier curve),
|
319
|
+
# arc (elliptical or circular arc) and closepath (close the current shape by drawing a
|
320
|
+
# line to the last moveto) elements.
|
321
|
+
# Compound paths (i.e., a path with subpaths, each consisting of a single moveto followed by
|
322
|
+
# one or more line or curve operations) are possible to allow effects such as donut holes in objects.
|
323
|
+
# (See http://www.w3.org/TR/SVG/paths.html)
|
324
|
+
def draw_path(path_spec, options={})
|
325
|
+
append_to_operators("draw", "#{options_to_str(options)} path #{path_spec}")
|
326
|
+
end
|
327
|
+
|
328
|
+
# Use image to composite an image with another image. Follow the image keyword
|
329
|
+
# with the composite operator, image location, image size, and filename
|
330
|
+
# You can use 0,0 for the image size, which means to use the actual dimensions found in the image header.
|
331
|
+
# Otherwise, it is scaled to the given dimensions. See -compose for a description of the composite operators.
|
332
|
+
def draw_image(operator, x0, y0, w, h, image_filename, options={})
|
333
|
+
append_to_operators("draw", "#{options_to_str(options)} image #{operator} #{x0},#{y0} #{w},#{h} \"#{image_filename}\"")
|
334
|
+
end
|
335
|
+
|
336
|
+
# Use text to annotate an image with text. Follow the text coordinates with a string.
|
337
|
+
def draw_text(x0, y0, text, options={})
|
338
|
+
append_to_operators("draw", "#{options_to_str(options)} text #{x0},#{y0} '#{text}'")
|
339
|
+
end
|
340
|
+
|
197
341
|
# saves the current image to the given filename
|
198
342
|
def save(output_filename)
|
199
|
-
`convert #{command_line} "#{output_filename}"`
|
343
|
+
result = `convert #{command_line} "#{output_filename}" 2>&1`
|
344
|
+
if $?.success?
|
345
|
+
return result
|
346
|
+
else
|
347
|
+
error_message = <<-ERROR
|
348
|
+
Error executing command: convert #{command_line} "#{output_filename}"
|
349
|
+
Result is: #{result}
|
350
|
+
ERROR
|
351
|
+
raise QuickMagick::QuickMagickError, error_message
|
352
|
+
end
|
200
353
|
end
|
201
354
|
|
202
355
|
alias write save
|
@@ -205,36 +358,51 @@ module QuickMagick
|
|
205
358
|
# saves the current image overwriting the original image file
|
206
359
|
def save!
|
207
360
|
raise QuickMagick::QuickMagickError, "Cannot mogrify a pseudo image" if @pseudo_image
|
208
|
-
`mogrify #{command_line}`
|
361
|
+
result = `mogrify #{command_line}`
|
362
|
+
if $?.success?
|
363
|
+
return result
|
364
|
+
else
|
365
|
+
error_message = <<-ERROR
|
366
|
+
Error executing command: mogrify #{command_line}
|
367
|
+
Result is: #{result}
|
368
|
+
ERROR
|
369
|
+
raise QuickMagick::QuickMagickError, error_message
|
370
|
+
end
|
209
371
|
end
|
210
372
|
|
211
373
|
alias write! save!
|
212
374
|
alias mogrify! save!
|
213
375
|
|
376
|
+
# image file format
|
214
377
|
def format
|
215
378
|
image_infoline[1]
|
216
379
|
end
|
217
380
|
|
381
|
+
# columns of image in pixels
|
218
382
|
def columns
|
219
383
|
image_infoline[2].split('x').first.to_i
|
220
384
|
end
|
221
385
|
|
222
386
|
alias width columns
|
223
387
|
|
388
|
+
# rows of image in pixels
|
224
389
|
def rows
|
225
390
|
image_infoline[2].split('x').last.to_i
|
226
391
|
end
|
227
392
|
|
228
393
|
alias height rows
|
229
394
|
|
395
|
+
# Bit depth
|
230
396
|
def bit_depth
|
231
397
|
image_infoline[4].to_i
|
232
398
|
end
|
233
399
|
|
400
|
+
# Number of different colors used in this image
|
234
401
|
def colors
|
235
402
|
image_infoline[6].to_i
|
236
403
|
end
|
237
404
|
|
405
|
+
# returns size of image in bytes
|
238
406
|
def size
|
239
407
|
File.size?(image_filename)
|
240
408
|
end
|
data/quick_magick.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{quick_magick}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Ahmed ElDawy"]
|
9
|
-
s.date = %q{2009-07-
|
9
|
+
s.date = %q{2009-07-30}
|
10
10
|
s.description = %q{QuickMagick allows you to access ImageMagick command line functions using Ruby interface.}
|
11
11
|
s.email = %q{ahmed.eldawy@badrit.com}
|
12
12
|
s.extra_rdoc_files = ["README", "lib/quick_magick/image.rb", "lib/quick_magick/image_list.rb", "lib/quick_magick.rb"]
|
data/test/image_test.rb
CHANGED
@@ -122,4 +122,24 @@ class ImageTest < Test::Unit::TestCase
|
|
122
122
|
i = QuickMagick::Image.gradient(100, 100, QuickMagick::RadialGradient, :yellow, :blue)
|
123
123
|
assert_equal 100, i.width
|
124
124
|
end
|
125
|
+
|
126
|
+
def test_line_primitive
|
127
|
+
i = QuickMagick::Image.solid(100, 100, :white)
|
128
|
+
i.draw_line(0, 0, 50, 50)
|
129
|
+
out_filename = File.join($base_dir, "line_test.gif")
|
130
|
+
i.save out_filename
|
131
|
+
ensure
|
132
|
+
# clean up
|
133
|
+
File.delete(out_filename) if out_filename && File.exists?(out_filename)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_text_primitive
|
137
|
+
i = QuickMagick::Image.solid(100, 100, :white)
|
138
|
+
i.draw_text(0, 50, "Ahmed Eldawy")
|
139
|
+
out_filename = File.join($base_dir, "text_test.gif")
|
140
|
+
i.save out_filename
|
141
|
+
ensure
|
142
|
+
# clean up
|
143
|
+
File.delete(out_filename) if out_filename && File.exists?(out_filename)
|
144
|
+
end
|
125
145
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quick_magick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ahmed ElDawy
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-30 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|