image_science 1.0.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.
data/History.txt ADDED
@@ -0,0 +1,5 @@
1
+ == 1.0.0 / 2006-12-01
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
5
+
data/Manifest.txt ADDED
@@ -0,0 +1,6 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bench.rb
6
+ lib/image_science.rb
data/README.txt ADDED
@@ -0,0 +1,63 @@
1
+ ImageScience
2
+ http://rubyforge.org/projects/seattlerb
3
+ http://seattlerb.rubyforge.org/
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
+ * 93 glorious lines of graphics manipulation magi... errr, SCIENCE!
17
+ * Supports both square and proportional thumbnails.
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("#{file}_cropped.png", 100)
24
+ end
25
+
26
+ ImageScience.with_image(file) do |img|
27
+ img.thumbnail("#{file}_thumb.png", 100)
28
+ end
29
+
30
+ == REQUIREMENTS:
31
+
32
+ * FreeImage
33
+ * ImageScience
34
+
35
+ == INSTALL:
36
+
37
+ * Download and install FreeImage. See notes at url above.
38
+ * sudo gem install -y ImageScience
39
+
40
+ == LICENSE:
41
+
42
+ (The MIT License)
43
+
44
+ Copyright (c) 2006 Ryan Davis, Seattle.rb
45
+
46
+ Permission is hereby granted, free of charge, to any person obtaining
47
+ a copy of this software and associated documentation files (the
48
+ 'Software'), to deal in the Software without restriction, including
49
+ without limitation the rights to use, copy, modify, merge, publish,
50
+ distribute, sublicense, and/or sell copies of the Software, and to
51
+ permit persons to whom the Software is furnished to do so, subject to
52
+ the following conditions:
53
+
54
+ The above copyright notice and this permission notice shall be
55
+ included in all copies or substantial portions of the Software.
56
+
57
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
58
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
59
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
60
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
61
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
62
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
63
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,15 @@
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
+ end
14
+
15
+ # vim: syntax=Ruby
data/bench.rb ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'benchmark'
4
+ require 'rubygems'
5
+ require 'image_science'
6
+
7
+ file = "blah_big.png"
8
+
9
+ if RUBY_PLATFORM =~ /darwin/ then
10
+ # how fucking cool is this???
11
+ puts "taking screenshot for thumbnailing benchmarks"
12
+ system "screencapture -SC #{file}"
13
+ else
14
+ abort "You need to plonk down #{file} or buy a mac"
15
+ end unless test ?f, "#{file}"
16
+
17
+ max = (ARGV.shift || 100).to_i
18
+
19
+ puts "# of iterations = #{max}"
20
+ Benchmark::bm(20) do |x|
21
+ x.report("null_time") {
22
+ for i in 0..max do
23
+ # do nothing
24
+ end
25
+ }
26
+
27
+ x.report("cropped") {
28
+ for i in 0..max do
29
+ ImageScience.with_image(file) do |img|
30
+ img.cropped_thumbnail("blah_cropped.png", 100)
31
+ end
32
+ end
33
+ }
34
+
35
+ x.report("proportional") {
36
+ for i in 0..max do
37
+ ImageScience.with_image(file) do |img|
38
+ img.thumbnail("blah_thumb.png", 100)
39
+ end
40
+ end
41
+ }
42
+ end
@@ -0,0 +1,135 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ require 'rubygems'
4
+ require 'inline'
5
+
6
+ ##
7
+ # Provides a simple and clean 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.0.0'
15
+
16
+ ##
17
+ # The top-level image loader opens +path+ and then passes the image
18
+ # instance to the given block.
19
+
20
+ def self.with_image(path); end # :yields: image
21
+
22
+ ##
23
+ # Crops an image to +left+, +top+, +right+, and +bottom+ and then
24
+ # passes the new image to the given block.
25
+
26
+ def with_crop(left, top, right, bottom); end # :yields: image
27
+
28
+ ##
29
+ # Returns the width of the image, in pixels.
30
+
31
+ def width; end
32
+
33
+ ##
34
+ # Returns the height of the image, in pixels.
35
+
36
+ def height; end
37
+
38
+ ##
39
+ # Creates a proportional thumbnail of the image scaled so its widest
40
+ # edge is resized to +size+ and writes the new image to +path+.
41
+
42
+ def thumbnail(path, size); end
43
+
44
+ ##
45
+ # Creates a square thumbnail of the image cropping the longest edge
46
+ # to match the shortest edge, resizes to +size+, and writes the new
47
+ # image to +path+.
48
+
49
+ def cropped_thumbnail(path, size)
50
+ w, h = width, height
51
+ l, t, r, b, half = 0, 0, w, h, (w > h ? (w - h) : (h - w)) / 2
52
+
53
+ l, r = half, half + h if w > h
54
+ t, b = half, half + w if h > w
55
+
56
+ with_crop(l, t, r, b) do |img|
57
+ img.thumbnail(path, size)
58
+ end
59
+ end
60
+
61
+ inline do |builder|
62
+ builder.add_link_flags "-lfreeimage"
63
+ builder.include '"FreeImage.h"'
64
+
65
+ builder.c_singleton <<-"END"
66
+ VALUE with_image(char * input) {
67
+ FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
68
+
69
+ fif = FreeImage_GetFileType(input, 0);
70
+ if (fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(input);
71
+ if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)) {
72
+ FIBITMAP *bitmap;
73
+ VALUE result = Qnil;
74
+ if (bitmap = FreeImage_Load(fif, input, 0)) {
75
+ VALUE obj = Data_Wrap_Struct(self, NULL, NULL, bitmap);
76
+ rb_iv_set(obj, "@file_type", INT2FIX(fif));
77
+ result = rb_yield(obj);
78
+ FreeImage_Unload(bitmap);
79
+ }
80
+ return result;
81
+ }
82
+ rb_raise(rb_eTypeError, "Unknown file format");
83
+ }
84
+ END
85
+
86
+ builder.c <<-"END"
87
+ VALUE with_crop(int l, int t, int r, int b) {
88
+ FIBITMAP *bitmap, *copy;
89
+ VALUE result = Qnil;
90
+ Data_Get_Struct(self, FIBITMAP, bitmap);
91
+
92
+ if (copy = FreeImage_Copy(bitmap, l, t, r, b)) {
93
+ VALUE obj = Data_Wrap_Struct(CLASS_OF(self), NULL, NULL, copy);
94
+ result = rb_yield(obj);
95
+ FreeImage_Unload(copy);
96
+ }
97
+ return result;
98
+ }
99
+ END
100
+
101
+ builder.c <<-"END"
102
+ int height() {
103
+ FIBITMAP *bitmap;
104
+ Data_Get_Struct(self, FIBITMAP, bitmap);
105
+ return FreeImage_GetHeight(bitmap);
106
+ }
107
+ END
108
+
109
+ builder.c <<-"END"
110
+ int width() {
111
+ FIBITMAP *bitmap;
112
+ Data_Get_Struct(self, FIBITMAP, bitmap);
113
+ return FreeImage_GetWidth(bitmap);
114
+ }
115
+ END
116
+
117
+ builder.c <<-"END"
118
+ VALUE thumbnail(char * output, int size) {
119
+ FIBITMAP *bitmap;
120
+ FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(output);
121
+ if (fif == FIF_UNKNOWN) fif = FIX2INT(rb_iv_get(self, "@file_type"));
122
+ if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsWriting(fif)) {
123
+ Data_Get_Struct(self, FIBITMAP, bitmap);
124
+ FIBITMAP *thumbnail = FreeImage_MakeThumbnail(bitmap, size, TRUE);
125
+ if (FreeImage_Save(fif, thumbnail, output, 0)) {
126
+ FreeImage_Unload(thumbnail);
127
+ return Qtrue;
128
+ }
129
+ return Qfalse;
130
+ }
131
+ rb_raise(rb_eTypeError, "Unknown file format");
132
+ }
133
+ END
134
+ end
135
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: image_science
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.0.0
7
+ date: 2006-12-13 00:00:00 -05:00
8
+ summary: ImageScience is a clean and happy Ruby library that generates thumbnails -- and kicks the living crap out of RMagick.
9
+ require_paths:
10
+ - lib
11
+ email: ryand-ruby@zenspider.com
12
+ homepage: http://rubyforge.org/projects/seattlerb
13
+ rubyforge_project: seattlerb
14
+ 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/
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Ryan Davis
31
+ files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ - Rakefile
36
+ - bench.rb
37
+ - lib/image_science.rb
38
+ test_files: []
39
+
40
+ rdoc_options: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ requirements: []
49
+
50
+ dependencies:
51
+ - !ruby/object:Gem::Dependency
52
+ name: hoe
53
+ version_requirement:
54
+ version_requirements: !ruby/object:Gem::Version::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: 1.1.4
59
+ version: