carlosnz-image_science 1.1.3

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.
data/History.txt ADDED
@@ -0,0 +1,41 @@
1
+ == 1.1.3 / 2007-05-30
2
+
3
+ * 2 minor enhancements:
4
+ * Added quick_thumb as an example to look at.
5
+ * Error handler doesn't raise by default. Raises if $DEBUG==true.
6
+
7
+ == 1.1.2 / 2007-04-18
8
+
9
+ * 2 bug fixes:
10
+ * reports bad height/width values for resize
11
+ * explicitly removes ICC color profiles from PNGs (bug in freeimage).
12
+
13
+ == 1.1.1 / 2007-03-08
14
+
15
+ * 5 minor enhancements:
16
+ * Added error handler that raises with information about what went wrong.
17
+ * thumbnail is now pure ruby, everything now uses resize.
18
+ * Produces cleaner JPEG files, with a small cost to file size/speed.
19
+ * resize now uses Catmull-Rom spline filter for better quality.
20
+ * resize copies existing ICC Profile to thumbnail, producing better color.
21
+ * ICC Profile NOT copied for PNG as it seems to be buggy.
22
+ * 1 bug fix:
23
+ * Fixed rdoc
24
+
25
+ == 1.1.0 / 2007-01-05
26
+
27
+ * 3 major enhancements:
28
+ * Added resize(width, height)
29
+ * Added save(path)
30
+ * All thumbnail and resize methods yield instead of saving directly.
31
+ * 1 minor enhancement:
32
+ * Will now try to use FreeImage from ports if /opt/local exists.
33
+ * 2 bug fixes:
34
+ * Fixed the linker issue on PPC.
35
+ * Rakefile will now clean the image files created by bench.rb
36
+
37
+ == 1.0.0 / 2006-12-01
38
+
39
+ * 1 major enhancement
40
+ * Birthday!
41
+
data/Manifest.txt ADDED
@@ -0,0 +1,9 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bench.rb
6
+ lib/image_science.rb
7
+ quick_thumb
8
+ test/pix.png
9
+ test/test_image_science.rb
data/README.txt ADDED
@@ -0,0 +1,66 @@
1
+ ImageScience
2
+ http://seattlerb.rubyforge.org/ImageScience.html
3
+ http://rubyforge.org/projects/seattlerb
4
+ by Ryan Davis
5
+
6
+ == DESCRIPTION:
7
+
8
+ ImageScience is a clean and happy Ruby library that generates
9
+ thumbnails -- and kicks the living crap out of RMagick. Oh, and it
10
+ doesn't leak memory like a sieve. :)
11
+
12
+ For more information including build steps, see http://seattlerb.rubyforge.org/
13
+
14
+ == FEATURES/PROBLEMS:
15
+
16
+ * Glorious graphics manipulation magi... errr, SCIENCE! in less than 200 LoC!
17
+ * Supports square and proportional thumbnails, as well as arbitrary resizes.
18
+ * Pretty much any graphics format you could want. No really.
19
+
20
+ == SYNOPSYS:
21
+
22
+ ImageScience.with_image(file) do |img|
23
+ img.cropped_thumbnail(100) do |thumb|
24
+ thumb.save "#{file}_cropped.png"
25
+ end
26
+
27
+ img.thumbnail(100) do |thumb|
28
+ thumb.save "#{file}_thumb.png"
29
+ end
30
+ end
31
+
32
+ == REQUIREMENTS:
33
+
34
+ * FreeImage
35
+ * ImageScience
36
+
37
+ == INSTALL:
38
+
39
+ * Download and install FreeImage. See notes at url above.
40
+ * sudo gem install -y image_science
41
+ * see http://seattlerb.rubyforge.org/ImageScience.html for more info.
42
+
43
+ == LICENSE:
44
+
45
+ (The MIT License)
46
+
47
+ Copyright (c) 2006-2007 Ryan Davis, Seattle.rb
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of this software and associated documentation files (the
51
+ 'Software'), to deal in the Software without restriction, including
52
+ without limitation the rights to use, copy, modify, merge, publish,
53
+ distribute, sublicense, and/or sell copies of the Software, and to
54
+ permit persons to whom the Software is furnished to do so, subject to
55
+ the following conditions:
56
+
57
+ The above copyright notice and this permission notice shall be
58
+ included in all copies or substantial portions of the Software.
59
+
60
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
61
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
62
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
63
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
64
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
65
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
66
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/image_science.rb'
6
+
7
+ Hoe.new('image_science', ImageScience::VERSION) do |p|
8
+ p.rubyforge_name = 'seattlerb'
9
+ p.description = p.paragraphs_of('README.txt', 2..3).join(" ")
10
+ p.summary = p.description[/^[^.]+\./]
11
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1].first.strip
12
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
13
+ p.extra_deps << 'RubyInline'
14
+ p.clean_globs << 'blah*png'
15
+ end
16
+
17
+ # vim: syntax=Ruby
data/bench.rb ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'benchmark'
4
+ require 'rubygems'
5
+ require 'image_science'
6
+
7
+ max = (ARGV.shift || 100).to_i
8
+ ext = ARGV.shift || "png"
9
+
10
+ file = "blah_big.#{ext}"
11
+
12
+ if RUBY_PLATFORM =~ /darwin/ then
13
+ # how fucking cool is this???
14
+ puts "taking screenshot for thumbnailing benchmarks"
15
+ system "screencapture -SC #{file}"
16
+ else
17
+ abort "You need to plonk down #{file} or buy a mac"
18
+ end unless test ?f, "#{file}"
19
+
20
+ ImageScience.with_image(file.sub(/#{ext}$/, 'png')) do |img|
21
+ img.save(file)
22
+ end if ext != "png"
23
+
24
+ puts "# of iterations = #{max}"
25
+ Benchmark::bm(20) do |x|
26
+ x.report("null_time") {
27
+ for i in 0..max do
28
+ # do nothing
29
+ end
30
+ }
31
+
32
+ x.report("cropped") {
33
+ for i in 0..max do
34
+ ImageScience.with_image(file) do |img|
35
+ img.cropped_thumbnail(100) do |thumb|
36
+ thumb.save("blah_cropped.#{ext}")
37
+ end
38
+ end
39
+ end
40
+ }
41
+
42
+ x.report("proportional") {
43
+ for i in 0..max do
44
+ ImageScience.with_image(file) do |img|
45
+ img.thumbnail(100) do |thumb|
46
+ thumb.save("blah_thumb.#{ext}")
47
+ end
48
+ end
49
+ end
50
+ }
51
+
52
+ x.report("resize") {
53
+ for i in 0..max do
54
+ ImageScience.with_image(file) do |img|
55
+ img.resize(200, 200) do |resize|
56
+ resize.save("blah_resize.#{ext}")
57
+ end
58
+ end
59
+ end
60
+ }
61
+ end
62
+
63
+ # File.unlink(*Dir["blah*#{ext}"])
@@ -0,0 +1,339 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'rubygems'
4
+ require 'inline'
5
+
6
+ ##
7
+ # Provides a clean and simple API to generate thumbnails using
8
+ # FreeImage as the underlying mechanism.
9
+ #
10
+ # For more information or if you have build issues with FreeImage, see
11
+ # http://seattlerb.rubyforge.org/ImageScience.html
12
+
13
+ class ImageScience
14
+ VERSION = '1.1.3'
15
+
16
+ ##
17
+ # The top-level image loader opens +path+ and then yields the image.
18
+
19
+ def self.with_image(path) # :yields: image
20
+ end
21
+
22
+ ##
23
+ # Crops an image to +left+, +top+, +right+, and +bottom+ and then
24
+ # yields the new image.
25
+
26
+ def with_crop(left, top, right, bottom) # :yields: image
27
+ end
28
+
29
+ ##
30
+ # Returns the width of the image, in pixels.
31
+
32
+ def width; end
33
+
34
+ ##
35
+ # Returns the height of the image, in pixels.
36
+
37
+ def height; end
38
+
39
+ ##
40
+ # Saves the image out to +path+. Changing the file extension will
41
+ # convert the file type to the appropriate format.
42
+
43
+ def save(path); end
44
+
45
+ ##
46
+ # Resizes the image to +width+ and +height+ using a cubic-bspline
47
+ # filter and yields the new image.
48
+
49
+ def resize(width, height) # :yields: image
50
+ end
51
+
52
+ ##
53
+ # converts the image to 8 bits , note DOES NOT YIELD
54
+ #
55
+ def convert_8_bits;
56
+ end
57
+
58
+ ##
59
+ # converts the image to 24 bits note DOES NOT YIELD
60
+ #
61
+ def convert_24_bits;
62
+ end
63
+
64
+ ##
65
+ # converts the image to 32 bits ( including alpha chanel for compisiting) note DOES NOT YIELD
66
+ #
67
+ def convert_32_bits;
68
+ end
69
+
70
+ ##
71
+ #
72
+ #
73
+ def paste;
74
+ end
75
+
76
+ #
77
+ # make sure your foreground image is 32 bit and your background image is 24 bit, and both images are the same size note DOES NOT YIELD
78
+ #
79
+ def composite;
80
+ end
81
+
82
+ ##
83
+ # Creates a proportional thumbnail of the image scaled so its longest
84
+ # edge is resized to +size+ and yields the new image.
85
+
86
+ def thumbnail(size) # :yields: image
87
+ w, h = width, height
88
+ scale = size.to_f / (w > h ? w : h)
89
+
90
+ self.resize((w * scale).to_i, (h * scale).to_i) do |image|
91
+ yield image
92
+ end
93
+ end
94
+
95
+ ##
96
+ # Creates a square thumbnail of the image cropping the longest edge
97
+ # to match the shortest edge, resizes to +size+, and yields the new
98
+ # image.
99
+
100
+ def cropped_thumbnail(size) # :yields: image
101
+ w, h = width, height
102
+ l, t, r, b, half = 0, 0, w, h, (w - h).abs / 2
103
+
104
+ l, r = half, half + h if w > h
105
+ t, b = half, half + w if h > w
106
+
107
+ with_crop(l, t, r, b) do |img|
108
+ img.thumbnail(size) do |thumb|
109
+ yield thumb
110
+ end
111
+ end
112
+ end
113
+
114
+ inline do |builder|
115
+ if test ?d, "/opt/local" then
116
+ builder.add_compile_flags "-I/opt/local/include"
117
+ builder.add_link_flags "-L/opt/local/lib"
118
+ end
119
+
120
+ builder.add_link_flags "-lfreeimage"
121
+ builder.add_link_flags "-lstdc++" # only needed on PPC for some reason. lame
122
+ builder.include '"FreeImage.h"'
123
+
124
+ builder.prefix <<-"END"
125
+ #define GET_BITMAP(name) FIBITMAP *(name); Data_Get_Struct(self, FIBITMAP, (name)); if (!(name)) rb_raise(rb_eTypeError, "Bitmap has already been freed")
126
+ END
127
+
128
+ builder.prefix <<-"END"
129
+ VALUE unload(VALUE self) {
130
+ GET_BITMAP(bitmap);
131
+
132
+ FreeImage_Unload(bitmap);
133
+ DATA_PTR(self) = NULL;
134
+ return Qnil;
135
+ }
136
+ END
137
+
138
+ builder.prefix <<-"END"
139
+ VALUE wrap(FIBITMAP *image, VALUE self, FREE_IMAGE_FORMAT fif) {
140
+ VALUE klass = fif ? self : CLASS_OF(self);
141
+ VALUE type = fif ? INT2FIX(fif) : rb_iv_get(self, "@file_type");
142
+ VALUE obj = Data_Wrap_Struct(klass, NULL, NULL, image);
143
+ rb_iv_set(obj, "@file_type", type);
144
+ return obj;
145
+ }
146
+
147
+ VALUE wrap_and_yield(FIBITMAP *image, VALUE self, FREE_IMAGE_FORMAT fif) {
148
+ VALUE obj = wrap(image, self, fif);
149
+ return rb_ensure(rb_yield, obj, unload, obj);
150
+ }
151
+ END
152
+
153
+ builder.prefix <<-"END"
154
+ void copy_icc_profile(VALUE self, FIBITMAP *from, FIBITMAP *to) {
155
+ FREE_IMAGE_FORMAT fif = FIX2INT(rb_iv_get(self, "@file_type"));
156
+ if (fif != FIF_PNG && FreeImage_FIFSupportsICCProfiles(fif)) {
157
+ FIICCPROFILE *profile = FreeImage_GetICCProfile(from);
158
+ if (profile && profile->data) {
159
+ FreeImage_CreateICCProfile(to, profile->data, profile->size);
160
+ }
161
+ }
162
+ }
163
+ END
164
+
165
+ builder.prefix <<-"END"
166
+ void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif, const char *message) {
167
+ if (! RTEST(ruby_debug)) return;
168
+ rb_raise(rb_eRuntimeError,
169
+ "FreeImage exception for type %s: %s",
170
+ (fif == FIF_UNKNOWN) ? "???" : FreeImage_GetFormatFromFIF(fif),
171
+ message);
172
+ }
173
+ END
174
+
175
+ builder.add_to_init "FreeImage_SetOutputMessage(FreeImageErrorHandler);"
176
+
177
+ builder.c_singleton <<-"END"
178
+ VALUE with_image(char * input) {
179
+ FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
180
+
181
+ fif = FreeImage_GetFileType(input, 0);
182
+ if (fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(input);
183
+ if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)) {
184
+ FIBITMAP *bitmap;
185
+ VALUE result = Qnil;
186
+ int flags = fif == FIF_JPEG ? JPEG_ACCURATE : 0;
187
+ if (bitmap = FreeImage_Load(fif, input, flags)) {
188
+ result = wrap_and_yield(bitmap, self, fif);
189
+ }
190
+ return result;
191
+ }
192
+ rb_raise(rb_eTypeError, "Unknown file format");
193
+ }
194
+ END
195
+
196
+ builder.c <<-"END"
197
+ VALUE with_crop(int l, int t, int r, int b) {
198
+ FIBITMAP *copy;
199
+ VALUE result = Qnil;
200
+ GET_BITMAP(bitmap);
201
+
202
+ if (copy = FreeImage_Copy(bitmap, l, t, r, b)) {
203
+ copy_icc_profile(self, bitmap, copy);
204
+ result = wrap_and_yield(copy, self, 0);
205
+ }
206
+ return result;
207
+ }
208
+ END
209
+
210
+ builder.c <<-"END"
211
+ VALUE convert_to_8_bits()) {
212
+ FIBITMAP *copy;
213
+ VALUE result = Qnil;
214
+ GET_BITMAP(bitmap);
215
+
216
+ if (copy = FreeImage_ConvertTo8Bits(bitmap)) {
217
+ copy_icc_profile(self, bitmap, copy);
218
+ result = wrap(copy, self, 0);
219
+ }
220
+ return result;
221
+ }
222
+ END
223
+
224
+ builder.c <<-"END"
225
+ VALUE convert_to_24_bits()) {
226
+ FIBITMAP *copy;
227
+ VALUE result = Qnil;
228
+ GET_BITMAP(bitmap);
229
+
230
+ if (copy = FreeImage_ConvertTo24Bits(bitmap)) {
231
+ copy_icc_profile(self, bitmap, copy);
232
+ result = wrap(copy, self, 0);
233
+ }
234
+ return result;
235
+ }
236
+ END
237
+
238
+ builder.c <<-"END"
239
+ VALUE convert_to_32_bits()) {
240
+ FIBITMAP *copy;
241
+ VALUE result = Qnil;
242
+ GET_BITMAP(bitmap);
243
+
244
+ if (copy = FreeImage_ConvertTo32Bits(bitmap)) {
245
+ copy_icc_profile(self, bitmap, copy);
246
+ result = wrap(copy, self, 0);
247
+ }
248
+ return result;
249
+ }
250
+ END
251
+
252
+ builder.c <<-"END"
253
+ VALUE paste(VALUE src, int l, int t, int a) {
254
+ FIBITMAP *src_bitmap;
255
+ GET_BITMAP(bitmap);
256
+ Data_Get_Struct(src, FIBITMAP, src_bitmap);
257
+
258
+ if (FreeImage_Paste(bitmap, src_bitmap, l, t, a))
259
+ {
260
+ return Qtrue;
261
+ }
262
+ else
263
+ {
264
+ return Qfalse;
265
+ }
266
+ }
267
+ END
268
+
269
+ builder.c <<-"END"
270
+ VALUE composite(VALUE use_file_background, VALUE background_color, VALUE background_image) {
271
+ VALUE result = Qnil;
272
+ BOOL useFileBackground;
273
+ RGBQUAD *backgroundColor = NULL;
274
+ FIBITMAP *backgroundImage = NULL;
275
+ FIBITMAP *compositeImage = NULL;
276
+ GET_BITMAP(bitmap);
277
+
278
+ useFileBackground = (use_file_background == Qtrue) ? TRUE: FALSE;
279
+
280
+ if (background_color != Qnil)
281
+ Data_Get_Struct(background_color, RGBQUAD, backgroundColor);
282
+
283
+ if (background_image != Qnil)
284
+ Data_Get_Struct(background_image, FIBITMAP, backgroundImage);
285
+
286
+ if (compositeImage = FreeImage_Composite(bitmap, useFileBackground, backgroundColor, backgroundImage)) {
287
+ copy_icc_profile(self, bitmap, compositeImage);
288
+ result = wrap(compositeImage, self, 0);
289
+ }
290
+ return result;
291
+ }
292
+ END
293
+
294
+ builder.c <<-"END"
295
+ int height() {
296
+ GET_BITMAP(bitmap);
297
+
298
+ return FreeImage_GetHeight(bitmap);
299
+ }
300
+ END
301
+
302
+ builder.c <<-"END"
303
+ int width() {
304
+ GET_BITMAP(bitmap);
305
+
306
+ return FreeImage_GetWidth(bitmap);
307
+ }
308
+ END
309
+
310
+ builder.c <<-"END"
311
+ VALUE resize(long w, long h) {
312
+ FIBITMAP *image;
313
+ if (w <= 0) rb_raise(rb_eArgError, "Width <= 0");
314
+ if (h <= 0) rb_raise(rb_eArgError, "Height <= 0");
315
+ GET_BITMAP(bitmap);
316
+ image = FreeImage_Rescale(bitmap, w, h, FILTER_CATMULLROM);
317
+ if (image) {
318
+ copy_icc_profile(self, bitmap, image);
319
+ return wrap_and_yield(image, self, 0);
320
+ }
321
+ return Qnil;
322
+ }
323
+ END
324
+
325
+ builder.c <<-"END"
326
+ VALUE save(char * output) {
327
+ FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(output);
328
+ if (fif == FIF_UNKNOWN) fif = FIX2INT(rb_iv_get(self, "@file_type"));
329
+ if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsWriting(fif)) {
330
+ int flags = fif == FIF_JPEG ? JPEG_QUALITYSUPERB : 0;
331
+ GET_BITMAP(bitmap);
332
+ if (fif == FIF_PNG) FreeImage_DestroyICCProfile(bitmap);
333
+ return FreeImage_Save(fif, bitmap, output, flags) ? Qtrue : Qfalse;
334
+ }
335
+ rb_raise(rb_eTypeError, "Unknown file format");
336
+ }
337
+ END
338
+ end
339
+ end
data/quick_thumb ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ abort "#{File.basename $0} max_length files..." unless ARGV.size > 1
4
+
5
+ require 'rubygems'
6
+ require 'image_science'
7
+
8
+ max_length = ARGV.shift.to_i
9
+
10
+ ARGV.each do |file|
11
+ begin
12
+ result = ImageScience.with_image file do |img|
13
+ begin
14
+ img.thumbnail(max_length) do |thumb|
15
+ # add _thumb and switch from gif to png. Really. gif just sucks.
16
+ out = file.sub(/(\.[^\.]+)$/, '_thumb\1').sub(/gif$/, 'png')
17
+ thumb.save(out)
18
+ end
19
+ rescue => e
20
+ warn "Exception thumbnailing #{file}: #{e}"
21
+ end
22
+ end
23
+ p file => result
24
+ rescue => e
25
+ warn "Exception opening #{file}: #{e}"
26
+ end
27
+ end
data/test/pix.png ADDED
Binary file
@@ -0,0 +1,124 @@
1
+ require 'test/unit/testcase'
2
+ require 'test/unit' if $0 == __FILE__
3
+ require 'image_science'
4
+
5
+ class TestImageScience < Test::Unit::TestCase
6
+ def deny x; assert ! x; end
7
+
8
+ def setup
9
+ @path = 'test/pix.png'
10
+ @tmppath = 'test/pix-tmp.png'
11
+ @h = @w = 50
12
+ end
13
+
14
+ def teardown
15
+ File.unlink @tmppath if File.exist? @tmppath
16
+ end
17
+
18
+ def test_class_with_image
19
+ ImageScience.with_image @path do |img|
20
+ assert_kind_of ImageScience, img
21
+ assert_equal @h, img.height
22
+ assert_equal @w, img.width
23
+ assert img.save(@tmppath)
24
+ end
25
+
26
+ assert File.exists?(@tmppath)
27
+
28
+ ImageScience.with_image @tmppath do |img|
29
+ assert_kind_of ImageScience, img
30
+ assert_equal @h, img.height
31
+ assert_equal @w, img.width
32
+ end
33
+ end
34
+
35
+ def test_class_with_image_missing
36
+ assert_raises TypeError do
37
+ ImageScience.with_image @path + "nope" do |img|
38
+ flunk
39
+ end
40
+ end
41
+ end
42
+
43
+ def test_class_with_image_missing_with_img_extension
44
+ assert_nil ImageScience.with_image("nope#{@path}") do |img|
45
+ flunk
46
+ end
47
+ end
48
+
49
+ def test_resize
50
+ ImageScience.with_image @path do |img|
51
+ img.resize(25, 25) do |thumb|
52
+ assert thumb.save(@tmppath)
53
+ end
54
+ end
55
+
56
+ assert File.exists?(@tmppath)
57
+
58
+ ImageScience.with_image @tmppath do |img|
59
+ assert_kind_of ImageScience, img
60
+ assert_equal 25, img.height
61
+ assert_equal 25, img.width
62
+ end
63
+ end
64
+
65
+ def test_resize_floats
66
+ ImageScience.with_image @path do |img|
67
+ img.resize(25.2, 25.7) do |thumb|
68
+ assert thumb.save(@tmppath)
69
+ end
70
+ end
71
+
72
+ assert File.exists?(@tmppath)
73
+
74
+ ImageScience.with_image @tmppath do |img|
75
+ assert_kind_of ImageScience, img
76
+ assert_equal 25, img.height
77
+ assert_equal 25, img.width
78
+ end
79
+ end
80
+
81
+ def test_resize_zero
82
+ assert_raises ArgumentError do
83
+ ImageScience.with_image @path do |img|
84
+ img.resize(0, 25) do |thumb|
85
+ assert thumb.save(@tmppath)
86
+ end
87
+ end
88
+ end
89
+
90
+ deny File.exists?(@tmppath)
91
+
92
+ assert_raises ArgumentError do
93
+ ImageScience.with_image @path do |img|
94
+ img.resize(25, 0) do |thumb|
95
+ assert thumb.save(@tmppath)
96
+ end
97
+ end
98
+ end
99
+
100
+ deny File.exists?(@tmppath)
101
+ end
102
+
103
+ def test_resize_negative
104
+ assert_raises ArgumentError do
105
+ ImageScience.with_image @path do |img|
106
+ img.resize(-25, 25) do |thumb|
107
+ assert thumb.save(@tmppath)
108
+ end
109
+ end
110
+ end
111
+
112
+ deny File.exists?(@tmppath)
113
+
114
+ assert_raises ArgumentError do
115
+ ImageScience.with_image @path do |img|
116
+ img.resize(25, -25) do |thumb|
117
+ assert thumb.save(@tmppath)
118
+ end
119
+ end
120
+ end
121
+
122
+ deny File.exists?(@tmppath)
123
+ end
124
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: carlosnz-image_science
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Davis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ date: 2007-05-30 00:00:00 -07:00
12
+ default_executable:
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: RubyInline
16
+ version_requirement:
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">"
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.0
22
+ version:
23
+ - !ruby/object:Gem::Dependency
24
+ name: hoe
25
+ version_requirement:
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: 1.2.1
31
+ version:
32
+ description: ImageScience is a clean and happy Ruby library that generates thumbnails -- and kicks the living crap out of RMagick. Oh, and it doesn't leak memory like a sieve. :) For more information including build steps, see http://seattlerb.rubyforge.org/
33
+ email: ryand-ruby@zenspider.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files:
39
+ - History.txt
40
+ - Manifest.txt
41
+ - README.txt
42
+ files:
43
+ - History.txt
44
+ - Manifest.txt
45
+ - README.txt
46
+ - Rakefile
47
+ - bench.rb
48
+ - lib/image_science.rb
49
+ - quick_thumb
50
+ - test/pix.png
51
+ - test/test_image_science.rb
52
+ has_rdoc: true
53
+ homepage: http://seattlerb.rubyforge.org/ImageScience.html
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --main
57
+ - README.txt
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">"
63
+ - !ruby/object:Gem::Version
64
+ version: 0.0.0
65
+ version:
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ requirements: []
73
+
74
+ rubyforge_project: seattlerb
75
+ rubygems_version: 1.2.0
76
+ signing_key:
77
+ specification_version: 1
78
+ summary: ImageScience is a clean and happy Ruby library that generates thumbnails -- and kicks the living crap out of RMagick.
79
+ test_files:
80
+ - test/test_image_science.rb