imforger 0.1.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/.autotest CHANGED
@@ -1,23 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'autotest/restart'
4
-
5
- # Autotest.add_hook :initialize do |at|
6
- # at.extra_files << "../some/external/dependency.rb"
7
- #
8
- # at.libs << ":../some/external"
9
- #
10
- # at.add_exception 'vendor'
11
- #
12
- # at.add_mapping(/dependency.rb/) do |f, _|
13
- # at.files_matching(/test_.*rb$/)
14
- # end
15
- #
16
- # %w(TestA TestB).each do |klass|
17
- # at.extra_class_map[klass] = "test/test_misc.rb"
18
- # end
19
- # end
20
-
21
- # Autotest.add_hook :run_command do |at|
22
- # system "rake build"
23
- # end
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "bundler"
10
+ gem "hoe"
11
+ gem "hoe-git"
12
+ gem "hoe-doofus"
13
+ gem "hoe-gemcutter"
14
+ gem "rake-compiler"
15
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ gemcutter (0.7.0)
5
+ hoe (2.9.1)
6
+ rake (>= 0.8.7)
7
+ hoe-doofus (1.0.0)
8
+ hoe-gemcutter (1.0.0)
9
+ gemcutter (>= 0.1.3)
10
+ hoe (>= 2.3.3)
11
+ hoe-git (1.3.0)
12
+ hoe (>= 2.2.0)
13
+ rake (0.8.7)
14
+ rake-compiler (0.7.6)
15
+ rake
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ bundler
22
+ hoe
23
+ hoe-doofus
24
+ hoe-gemcutter
25
+ hoe-git
26
+ rake-compiler
data/History.txt CHANGED
@@ -1,6 +1,18 @@
1
- === 1.0.0 / 2011-03-25
1
+ === 0.2.2 / 2011-03-31
2
2
 
3
- * 1 major enhancement
3
+ * Supports explicit format declaration:
4
4
 
5
- * Birthday!
5
+ Imforger.new(input_file_path).to_file(output_file_path, :format => 'tif')
6
+
7
+ === 0.2.1 / 2011-03-31
8
+
9
+ * Deghettofied the options to use symbols instead of string:
10
+
11
+ Imforger.new(input_file_path).to_file(output_file_path, :width => 100,
12
+ :height => 100)
13
+
14
+ === 0.2.0 / 2011-03-31
15
+
16
+ * Library now supports :maxwidth, :maxheight
17
+ * Includes benchmark/benchmark.rb
6
18
 
data/Manifest.txt CHANGED
@@ -1,10 +1,15 @@
1
1
  .autotest
2
+ Gemfile
3
+ Gemfile.lock
2
4
  History.txt
3
5
  Manifest.txt
4
6
  README.txt
5
7
  Rakefile
8
+ benchmark/benchmark.rb
6
9
  ext/imforger/extconf.rb
7
10
  ext/imforger/imforger.c
8
11
  lib/imforger.rb
12
+ lib/imforger.so
13
+ test/fixtures/large.original.jpg
9
14
  test/helper.rb
10
15
  test/test_imforger.rb
data/README.txt CHANGED
@@ -2,11 +2,15 @@
2
2
 
3
3
  == DESCRIPTION:
4
4
 
5
- Imforger relies on the Imlib2 library to quickly convert between different file types, scaling and compressing on the way.
5
+ Imforger
6
+ [short for Image Forger, because we are making copies of images]
7
+
8
+ This class relies on the Imlib2 library to quickly convert between different file types, scaling and compressing on the way.
6
9
 
7
10
  == FEATURES/PROBLEMS:
8
11
 
9
- As far as I know, this gem only works on Linux and Ruby 1.9+
12
+ As far as I know, this gem only works on Linux and Ruby 1.9+ Anyone
13
+ know how to install the dev files for Imlib2, please let me know.
10
14
 
11
15
  Imlib2 drops the ICC profile and XMP tags when it creates the new image. I have been using exiftool to copy the ICC profile and XMP tags over. This is still much faster than ImageMagick et al.
12
16
 
@@ -15,6 +19,18 @@ Imlib2 drops the ICC profile and XMP tags when it creates the new image. I have
15
19
  require 'imforger'
16
20
  Imforger.new(input_file_path).to_file(output_file_path)
17
21
 
22
+ or:
23
+
24
+ Imforger.new(input_file_path).to_file(output_file_path, :width => 100,
25
+ :height => 100)
26
+
27
+ or:
28
+
29
+ Imforger.new(input_file_path).to_file(output_file_path, :maxwidth => 1000,
30
+ :maxheight => 1000, :format => 'tif')
31
+
32
+ See the test file for other examples.
33
+
18
34
  == REQUIREMENTS:
19
35
 
20
36
  Imlib2
@@ -25,7 +41,21 @@ gem install imforger
25
41
 
26
42
  == SPEED:
27
43
 
28
- ImageMagick was too slow and used too much memory. [I didn't even bother frobnicating with RMagick.] I also compared to the NetPBM library for good measure.
44
+ The purpose of this gem is to scale images and save them out quickly. ImageMagick was too slow and used too much memory. [I didn't even bother frobnicating with RMagick.] I include a benchmark that I used in the benchmark dir. Results belew. I also compared to the NetPBM library for good measure.
45
+
46
+ $ ruby benchmark/benchmark.rb
47
+
48
+ user system total real
49
+ ImageMagick 0.000000 0.010000 1.710000 ( 0.729113)
50
+ NetPBM 0.000000 0.000000 0.700000 ( 0.391043)
51
+ Imforger 0.310000 0.010000 0.320000 ( 0.321695)
52
+
53
+ Changing the input file size and format showed similar results: Imforger
54
+ is roughly twice as fast as calling out ImageMagick in realtime on a
55
+ dual-core laptop, and also
56
+ noticeably faster than NetPBM. I don't include memory usage numbers
57
+ here, but anecdotally I did notice significantly less RAM usage with Imforger vs
58
+ ImageMagick.
29
59
 
30
60
  == LICENSE:
31
61
 
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ require 'psych'
2
3
  require 'hoe'
3
4
 
4
5
  class Hoe
@@ -0,0 +1,45 @@
1
+ require 'imforger'
2
+ require 'benchmark'
3
+ require 'fileutils'
4
+ require 'open3'
5
+
6
+ Benchmark.bm(12) do |x|
7
+ #test these image scaling methods
8
+ benchmark = [
9
+ :imagemagick,
10
+ :netpbm,
11
+ :imlib
12
+ ]
13
+
14
+ @original_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'test', 'fixtures', 'large.original.jpg'))
15
+ @input_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'input.jpg'))
16
+ @output_file = lambda{|type| File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', "output.#{type}.jpg"))}
17
+
18
+ #prep the files
19
+ raise "Cannot find original file #{@original_file}." unless File.exist?(@original_file)
20
+ FileUtils.cp(@original_file, @input_file)
21
+
22
+ #silence stupid pnmtojpeg
23
+ $stderr.reopen(File.open('/dev/null','w+'))
24
+
25
+ x.report("ImageMagick") do
26
+ `convert #{@input_file} -resize 100x100\! #{@output_file.call('ImageMagick')}`
27
+ end if benchmark.include?(:imagemagick)
28
+
29
+ x.report("NetPBM") do
30
+ `/usr/bin/anytopnm #{@input_file} | /usr/bin/pamscale -width 100 -height 100 | /usr/bin/pnmtojpeg > #{@output_file.call('NetPBM')}`
31
+ end if benchmark.include?(:netpbm)
32
+
33
+ x.report("Imlib") do
34
+ fr = Imforger.new @input_file
35
+ fr.to_file "#{@output_file.call('Imlib')}", :width => 100, :height => 100
36
+ end if benchmark.include?(:imlib)
37
+
38
+ #cleanup files
39
+ if true && false
40
+ FileUtils.rm @input_file
41
+ [ 'ImageMagick', 'NetPBM', 'Imforger'].each do |type|
42
+ FileUtils.rm @output_file.call(type)
43
+ end
44
+ end
45
+ end
@@ -10,21 +10,35 @@
10
10
  /* ruby */
11
11
  #include <ruby.h>
12
12
 
13
- static VALUE imforger_save_file(VALUE self, VALUE anObject)
13
+ static VALUE imforger_save_file(VALUE self, VALUE outputString)
14
14
  {
15
- VALUE input_image;
16
- VALUE output_image;
15
+ VALUE r_input_image;
16
+ VALUE r_output_image;
17
+ VALUE r_options;
18
+ VALUE r_width;
19
+ VALUE r_height;
20
+ VALUE r_maxwidth;
21
+ VALUE r_maxheight;
22
+ VALUE r_format;
23
+
17
24
  char *imagePath1;
18
25
  char *imagePath2;
26
+ char *format;
27
+
28
+ int width;
29
+ int height;
30
+ float scale;
31
+
19
32
  /* image handles */
20
33
  Imlib_Image image1;
21
34
  Imlib_Image image2;
22
35
 
23
- input_image = rb_iv_get(self, "@input_image");
24
- output_image = rb_iv_set(self, "@output_image", anObject);
36
+ r_input_image = rb_iv_get(self, "@input_image");
37
+ r_output_image = rb_iv_set(self, "@output_image", outputString);
38
+ r_options = rb_iv_get(self, "@options");
25
39
 
26
- imagePath1 = StringValuePtr(input_image);
27
- imagePath2 = StringValuePtr(output_image);
40
+ imagePath1 = StringValuePtr(r_input_image);
41
+ imagePath2 = StringValuePtr(r_output_image);
28
42
 
29
43
  /* check that the file exists and can be read */
30
44
  /* TODO: raise a real error */
@@ -40,17 +54,57 @@ static VALUE imforger_save_file(VALUE self, VALUE anObject)
40
54
  char *tmp;
41
55
  /* set the image1 we loaded as the current context image1 to work on */
42
56
  imlib_context_set_image(image1);
43
- /* set the image1 format to be the format of the extension of our last */
57
+
58
+ /* if the width and height were set, use that; otherwise use the
59
+ * current dimensions */
60
+ r_width = rb_hash_aref(r_options, ID2SYM(rb_intern("width")));
61
+ r_height = rb_hash_aref(r_options, ID2SYM(rb_intern("height")));
62
+ if(r_width == Qnil){
63
+ width = imlib_image_get_width();
64
+ } else {
65
+ width = NUM2INT(r_width);
66
+ }
67
+ if(r_height == Qnil){
68
+ height = imlib_image_get_height();
69
+ } else {
70
+ height = NUM2INT(r_height);
71
+ }
72
+
73
+ /* going for maximum height */
74
+ r_maxwidth = rb_hash_aref(r_options, ID2SYM(rb_intern("maxwidth")));
75
+ r_maxheight = rb_hash_aref(r_options, ID2SYM(rb_intern("maxheight")));
76
+ if(r_maxwidth != Qnil){
77
+ if(width > NUM2INT(r_maxwidth)){
78
+ scale = NUM2INT(r_maxwidth) / (float)width;
79
+ width = NUM2INT(r_maxwidth);
80
+ height = (int)(scale * height);
81
+ }
82
+ }
83
+ if(r_maxheight != Qnil){
84
+ if(height > NUM2INT(r_maxheight)){
85
+ scale = NUM2INT(r_maxheight) / (float)height;
86
+ height = NUM2INT(r_maxheight);
87
+ width = (int)(scale * width);
88
+ }
89
+ }
90
+
91
+ /* set the image1 format
92
+ * to be the format of the extension of our last */
44
93
  /* argument - i.e. .png = png, .tif = tiff etc. */
45
- tmp = strrchr(imagePath2, '.');
46
- if(tmp)
47
- imlib_context_set_anti_alias(1);
48
- image2 = imlib_create_cropped_scaled_image(0,0,imlib_image_get_width(),imlib_image_get_height(),100,100);
49
- imlib_context_set_image(image2);
50
- imlib_image_set_format(tmp + 1);
51
- /* save the image1 */
52
- imlib_save_image(imagePath2);
94
+ r_format = rb_hash_aref(r_options, ID2SYM(rb_intern("format")));
95
+ if(r_format != Qnil){
96
+ format = StringValuePtr(r_format);
97
+ } else {
98
+ tmp = strrchr(imagePath2, '.');
99
+ format = (tmp + 1);
53
100
  }
101
+ imlib_context_set_anti_alias(1);
102
+ image2 = imlib_create_cropped_scaled_image(0,0,imlib_image_get_width(),imlib_image_get_height(),width,height);
103
+ imlib_context_set_image(image2);
104
+ imlib_image_set_format(format);
105
+ /* save the image1 */
106
+ imlib_save_image(imagePath2);
107
+ }
54
108
  return Qtrue;
55
109
  }
56
110
 
data/lib/imforger.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'imforger.so'
2
2
 
3
3
  class Imforger
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.2'
5
5
 
6
- attr_accessor :input_image, :output_image
6
+ attr_accessor :input_image, :output_image, :options
7
7
 
8
8
  class Exception < RuntimeError; end
9
9
 
@@ -12,9 +12,20 @@ class Imforger
12
12
 
13
13
  raise(Imforger::Exception, "Input file not found!") unless File.exists?(path)
14
14
  @input_image = path
15
+ @options = {}
15
16
  end
16
17
 
17
- def to_file(output_path)
18
+ def to_file(output_path, opts = {})
19
+ @options.merge!(opts)
20
+ check_format
21
+
18
22
  save_file(File.expand_path(output_path))
19
23
  end
24
+
25
+ private
26
+ def check_format
27
+ if @options[:format]
28
+ raise(Imforger::Exception, "I don't know if that file format is supported!") unless %w(tif png jpg).include?(@options[:format])
29
+ end
30
+ end
20
31
  end
data/lib/imforger.so ADDED
Binary file
Binary file
@@ -1,9 +1,60 @@
1
1
  require 'helper'
2
+ require 'fileutils'
2
3
 
3
4
  class TestImforger < MiniTest::Unit::TestCase
5
+ def setup
6
+ @original_file = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'large.original.jpg'))
7
+ @input_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'input.jpg'))
8
+ @output_file = lambda{|type| File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', "output.#{type}.jpg"))}
9
+
10
+ #prep the files
11
+ raise "Cannot find original file #{@original_file}." unless File.exist?(@original_file)
12
+ FileUtils.cp(@original_file, @input_file)
13
+ end
14
+
4
15
  def test_raise_an_error_if_no_path_to_file
5
16
  assert_raises Imforger::Exception do
6
17
  Imforger.new('./this_file_doesnt_exist')
7
18
  end
8
19
  end
20
+
21
+ def test_creates_new_image
22
+ path = @output_file.call('copy')
23
+
24
+ fr = Imforger.new @input_file
25
+ fr.to_file path
26
+ assert File.exists?(path)
27
+ assert File.size(path) > 1500000
28
+ end
29
+
30
+ def test_creates_new_image_smaller_size
31
+ path = @output_file.call('smaller')
32
+
33
+ fr = Imforger.new @input_file
34
+ fr.to_file path, :width => 100, :height => 100
35
+ assert File.size(path) > 3000
36
+ end
37
+
38
+ def test_creates_new_bounded_size
39
+ path = @output_file.call('bounded')
40
+
41
+ fr = Imforger.new @input_file
42
+ fr.to_file path, :maxwidth => 117, :maxheight => 120
43
+ assert File.size(path) > 3900
44
+ end
45
+
46
+ def test_creates_new_image_different_format
47
+ %w(tif png jpg).each do |extension|
48
+ path = "#{@output_file.call('format')}.#{extension}"
49
+ fr = Imforger.new(@input_file).to_file(path, :format => extension)
50
+ assert((File.size(path) > 1500000), "Could not create file of type #{extension}.")
51
+ end
52
+ end
53
+
54
+ def test_raises_an_error_if_unknown_format
55
+ fr = Imforger.new @input_file
56
+ assert_raises Imforger::Exception do
57
+ fr.to_file '/dev/null', :format => 'pizza'
58
+ end
59
+ end
9
60
  end
metadata CHANGED
@@ -1,111 +1,139 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: imforger
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
4
5
  prerelease:
5
- version: 0.1.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Casey Rosenthal
9
9
  autorequire:
10
10
  bindir: bin
11
- cert_chain:
12
- - |
13
- -----BEGIN CERTIFICATE-----
11
+ cert_chain:
12
+ - ! '-----BEGIN CERTIFICATE-----
13
+
14
14
  MIIDKjCCAhKgAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQwwCgYDVQQDDANjbHIx
15
+
15
16
  FjAUBgoJkiaJk/IsZAEZFgZwb3J0NDkxEzARBgoJkiaJk/IsZAEZFgNjb20wHhcN
17
+
16
18
  MTEwMzI1MjIyNTA2WhcNMTIwMzI0MjIyNTA2WjA7MQwwCgYDVQQDDANjbHIxFjAU
19
+
17
20
  BgoJkiaJk/IsZAEZFgZwb3J0NDkxEzARBgoJkiaJk/IsZAEZFgNjb20wggEiMA0G
21
+
18
22
  CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFO65jA8Vm6mrySAEh0p9zMJ/c8pif
23
+
19
24
  AwrL8K/fQzBOD8WjaHbt3WlDut4tBtzBpspaObbszg0QhH8ixvdIteaNaqWt5ivB
25
+
20
26
  85BPy2NV/yBBhKZ3JshlivgcKr6RRwP/NfwVVWXMBCmX6d1/9hicHES7gLP61RLY
27
+
21
28
  a13gfyuVSm1FipnzIWrgj1ArEQvLc5Qzp08ekolU3xvTQaItDPCh2ImaCixhlFaV
29
+
22
30
  SZxGk2HEv5sdK2HiZfdN4P8dVBhWEK+HXh4WuyqivGI0mHioQNrAU2VSka0NN/dZ
31
+
23
32
  NysVmj3E+P3EQaSJ1Apey6WVgozw/Jd2tRrcPp4bvNTcMcstXxDDdajLAgMBAAGj
33
+
24
34
  OTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFJGwO8OOOSuETTTIgEHrFaPYZY50MAsG
35
+
25
36
  A1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAFZq0kRxt5VII27uV/lReyzAz
37
+
26
38
  q5MWDtOv8hgUcF6DqsR8vMwYUtbl8CpKerY7CCdq8SBgI73gTSg0FlKhu/TWJyVS
39
+
27
40
  vbD8qTsLMSJ1eagrRzY0W/hbl07CdFAunPKYw9vIOsQXBDLPoJoPogpSkbTGaUnD
41
+
28
42
  NqVRcPwXgmwCdlJYOOBXh6QxArisZ/dFNtVZY2zUJCfdxpUwlXEtNvh9z+502nWp
43
+
29
44
  B5PckRdTFq05psR5w5RInK0QZstX464GDSUs+CL7JvwXJKtnDGLb4/+xY3j5a/f6
45
+
30
46
  ZZgY9wEKsxYB1Clu7uMdVBMb1hI4Kr/k6wDqXfpoZW9ltiyjmmgWvWAfPEsgSg==
47
+
31
48
  -----END CERTIFICATE-----
32
49
 
33
- date: 2011-03-25 00:00:00 -07:00
50
+ '
51
+ date: 2011-03-31 00:00:00.000000000 -07:00
34
52
  default_executable:
35
- dependencies:
36
- - !ruby/object:Gem::Dependency
53
+ dependencies:
54
+ - !ruby/object:Gem::Dependency
37
55
  name: rake-compiler
38
- prerelease: false
39
- requirement: &id001 !ruby/object:Gem::Requirement
56
+ requirement: &16507700 !ruby/object:Gem::Requirement
40
57
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
44
61
  version: 0.4.1
45
62
  type: :development
46
- version_requirements: *id001
47
- - !ruby/object:Gem::Dependency
48
- name: hoe
49
63
  prerelease: false
50
- requirement: &id002 !ruby/object:Gem::Requirement
64
+ version_requirements: *16507700
65
+ - !ruby/object:Gem::Dependency
66
+ name: hoe
67
+ requirement: &16475160 !ruby/object:Gem::Requirement
51
68
  none: false
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
55
72
  version: 2.9.1
56
73
  type: :development
57
- version_requirements: *id002
58
- description: Imforger relies on the Imlib2 library to quickly convert between different file types, scaling and compressing on the way.
59
- email:
74
+ prerelease: false
75
+ version_requirements: *16475160
76
+ description: ! 'Imforger
77
+
78
+ [short for Image Forger, because we are making copies of images]
79
+
80
+
81
+ This class relies on the Imlib2 library to quickly convert between different file
82
+ types, scaling and compressing on the way.'
83
+ email:
60
84
  - clr@port49.com
61
85
  executables: []
62
-
63
- extensions:
86
+ extensions:
64
87
  - ext/imforger/extconf.rb
65
- extra_rdoc_files:
88
+ extra_rdoc_files:
66
89
  - History.txt
67
90
  - Manifest.txt
68
91
  - README.txt
69
- files:
92
+ files:
70
93
  - .autotest
94
+ - Gemfile
95
+ - Gemfile.lock
71
96
  - History.txt
72
97
  - Manifest.txt
73
98
  - README.txt
74
99
  - Rakefile
100
+ - benchmark/benchmark.rb
75
101
  - ext/imforger/extconf.rb
76
102
  - ext/imforger/imforger.c
77
103
  - lib/imforger.rb
104
+ - lib/imforger.so
105
+ - test/fixtures/large.original.jpg
78
106
  - test/helper.rb
79
107
  - test/test_imforger.rb
80
108
  - .gemtest
81
109
  has_rdoc: true
82
110
  homepage:
83
111
  licenses: []
84
-
85
112
  post_install_message:
86
- rdoc_options:
113
+ rdoc_options:
87
114
  - --main
88
115
  - README.txt
89
- require_paths:
116
+ require_paths:
90
117
  - lib
91
- required_ruby_version: !ruby/object:Gem::Requirement
118
+ required_ruby_version: !ruby/object:Gem::Requirement
92
119
  none: false
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: "0"
97
- required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
125
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: "0"
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
103
130
  requirements: []
104
-
105
131
  rubyforge_project: imforger
106
132
  rubygems_version: 1.6.2
107
133
  signing_key:
108
134
  specification_version: 3
109
- summary: Imforger relies on the Imlib2 library to quickly convert between different file types, scaling and compressing on the way.
110
- test_files:
135
+ summary: Imforger [short for Image Forger, because we are making copies of images] This
136
+ class relies on the Imlib2 library to quickly convert between different file types,
137
+ scaling and compressing on the way.
138
+ test_files:
111
139
  - test/test_imforger.rb
metadata.gz.sig CHANGED
Binary file