hcatlin-mini_magick 1.3.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/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2005 Corey Johnson probablycorey@gmail.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ = MiniMagick
2
+
3
+ A ruby wrapper for ImageMagick or GraphicsMagick command line.
4
+
5
+
6
+ == Why?
7
+
8
+ I was using RMagick and loving it, but it was eating up huge amounts
9
+ of memory. A simple script like this...
10
+
11
+ Magick::read("image.jpg") do |f|
12
+ f.write("manipulated.jpg")
13
+ end
14
+
15
+ ...would use over 100 Megs of Ram. On my local machine this wasn't a
16
+ problem, but on my hosting server the ruby apps would crash because of
17
+ their 100 Meg memory limit.
18
+
19
+
20
+ == Solution!
21
+
22
+ Using MiniMagick the ruby processes memory remains small (it spawns
23
+ ImageMagick's command line program mogrify which takes up some memory
24
+ as well, but is much smaller compared to RMagick)
25
+
26
+ MiniMagick gives you access to all the commandline options ImageMagick
27
+ has (Found here http://www.imagemagick.org/script/mogrify.php)
28
+
29
+
30
+ == Examples
31
+
32
+ Want to make a thumbnail from a file...
33
+
34
+ image = MiniMagick::Image.from_file("input.jpg")
35
+ image.resize "100x100"
36
+ image.write("output.jpg")
37
+
38
+ Want to make a thumbnail from a blob...
39
+
40
+ image = MiniMagick::Image.from_blob(blob)
41
+ image.resize "100x100"
42
+ image.write("output.jpg")
43
+
44
+ Need to combine several options?
45
+
46
+ image = MiniMagick::Image.from_file("input.jpg")
47
+ image.combine_options do |c|
48
+ c.sample "50%"
49
+ c.rotate "-90>"
50
+ end
51
+ image.write("output.jpg")
52
+
53
+ Want to manipulate an image at its source (You won't have to write it
54
+ out because the transformations are done on that file)
55
+
56
+ image = MiniMagick::Image.new("input.jpg")
57
+ image.resize "100x100"
58
+
59
+ Want to get some meta-information out?
60
+
61
+ image = MiniMagick::Image.from_file("input.jpg")
62
+ image[:width] # will get the width (you can also use :height and :format)
63
+ image["EXIF:BitsPerSample"] # It also can get all the EXIF tags
64
+ image["%m:%f %wx%h"] # Or you can use one of the many options of the format command
65
+
66
+ For more on the format command see
67
+ http://www.imagemagick.org/script/command-line-options.php#format
68
+
69
+
70
+ == Requirements
71
+
72
+ You must have ImageMagick or GraphicsMagick installed.
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+
6
+ $:.unshift(File.dirname(__FILE__) + "/lib")
7
+ require 'mini_magick'
8
+
9
+ desc 'Default: run unit tests.'
10
+ task :default => :test
11
+
12
+ desc 'Test the mini_magick plugin.'
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'test'
15
+ t.pattern = 'test/**/*_test.rb'
16
+ t.verbose = true
17
+ end
18
+
19
+ desc 'Generate documentation for the mini_magick plugin.'
20
+ Rake::RDocTask.new(:rdoc) do |rdoc|
21
+ rdoc.rdoc_dir = 'rdoc'
22
+ rdoc.title = 'MiniMagick'
23
+ rdoc.options << '--line-numbers'
24
+ rdoc.options << '--inline-source'
25
+ rdoc.rdoc_files.include('README.rdoc')
26
+ rdoc.rdoc_files.include('lib/**/*.rb')
27
+ end
28
+
29
+ spec = eval(File.read('mini_magick.gemspec'))
30
+ Rake::GemPackageTask.new(spec) do |pkg|
31
+ pkg.gem_spec = spec
32
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.3.0
@@ -0,0 +1,2 @@
1
+ require 'mini_magick'
2
+ MiniMagick.processor = :gm
@@ -0,0 +1,202 @@
1
+ require 'tempfile'
2
+ require 'subexec'
3
+
4
+ module MiniMagick
5
+ class << self
6
+ attr_accessor :processor
7
+ attr_accessor :timeout
8
+ end
9
+
10
+ class Error < RuntimeError; end
11
+ class Invalid < StandardError; end
12
+
13
+ class Image
14
+ attr :path
15
+ attr :tempfile
16
+ attr :output
17
+
18
+ # Class Methods
19
+ # -------------
20
+ class << self
21
+ def from_blob(blob, ext = nil)
22
+ begin
23
+ tempfile = Tempfile.new(['mini_magick', ext.to_s])
24
+ tempfile.binmode
25
+ tempfile.write(blob)
26
+ ensure
27
+ tempfile.close if tempfile
28
+ end
29
+
30
+ return self.new(tempfile.path, tempfile)
31
+ end
32
+
33
+ # Use this if you don't want to overwrite the image file
34
+ def open(image_path)
35
+ File.open(image_path, "rb") do |f|
36
+ self.from_blob(f.read, File.extname(image_path))
37
+ end
38
+ end
39
+ alias_method :from_file, :open
40
+ end
41
+
42
+ # Instance Methods
43
+ # ----------------
44
+ def initialize(input_path, tempfile=nil)
45
+ @path = input_path
46
+ @tempfile = tempfile # ensures that the tempfile will stick around until this image is garbage collected.
47
+
48
+ # Ensure that the file is an image
49
+ run_command("identify", @path)
50
+ end
51
+
52
+ # For reference see http://www.imagemagick.org/script/command-line-options.php#format
53
+ def [](value)
54
+ # Why do I go to the trouble of putting in newlines? Because otherwise animated gifs screw everything up
55
+ case value.to_s
56
+ when "format"
57
+ run_command("identify", "-format", format_option("%m"), @path).split("\n")[0]
58
+ when "height"
59
+ run_command("identify", "-format", format_option("%h"), @path).split("\n")[0].to_i
60
+ when "width"
61
+ run_command("identify", "-format", format_option("%w"), @path).split("\n")[0].to_i
62
+ when "dimensions"
63
+ run_command("identify", "-format", format_option("%w %h"), @path).split("\n")[0].split.map{|v|v.to_i}
64
+ when "size"
65
+ File.size(@path) # Do this because calling identify -format "%b" on an animated gif fails!
66
+ when "original_at"
67
+ # Get the EXIF original capture as a Time object
68
+ Time.local(*self["EXIF:DateTimeOriginal"].split(/:|\s+/)) rescue nil
69
+ when /^EXIF\:/i
70
+ run_command('identify', '-format', "\"%[#{value}]\"", @path).chop
71
+ else
72
+ run_command('identify', '-format', "\"#{value}\"", @path).split("\n")[0]
73
+ end
74
+ end
75
+
76
+ # Sends raw commands to imagemagick's mogrify command. The image path is automatically appended to the command
77
+ def <<(*args)
78
+ run_command("mogrify", *args << @path)
79
+ end
80
+
81
+ # This is a 'special' command because it needs to change @path to reflect the new extension
82
+ # Formatting an animation into a non-animated type will result in ImageMagick creating multiple
83
+ # pages (starting with 0). You can choose which page you want to manipulate. We default to the
84
+ # first page.
85
+ def format(format, page=0)
86
+ run_command("mogrify", "-format", format, @path)
87
+
88
+ old_path = @path.dup
89
+ @path.sub!(/(\.\w*)?$/, ".#{format}")
90
+ File.delete(old_path) unless old_path == @path
91
+
92
+ unless File.exists?(@path)
93
+ begin
94
+ FileUtils.copy_file(@path.sub(".#{format}", "-#{page}.#{format}"), @path)
95
+ rescue => ex
96
+ raise MiniMagickError, "Unable to format to #{format}; #{ex}" unless File.exist?(@path)
97
+ end
98
+ end
99
+ ensure
100
+ Dir[@path.sub(/(\.\w+)?$/, "-[0-9]*.#{format}")].each do |fname|
101
+ File.unlink(fname)
102
+ end
103
+ end
104
+
105
+ # Collapse images with sequences to the first frame (ie. animated gifs) and
106
+ # preserve quality
107
+ def collapse!
108
+ run_command("mogrify", "-quality", "100", "#{path}[0]")
109
+ end
110
+
111
+ # Writes the temporary image that we are using for processing to the output path
112
+ def write(output_path)
113
+ FileUtils.copy_file @path, output_path
114
+ run_command "identify", output_path # Verify that we have a good image
115
+ end
116
+
117
+ # Give you raw data back
118
+ def to_blob
119
+ f = File.new @path
120
+ f.binmode
121
+ f.read
122
+ ensure
123
+ f.close if f
124
+ end
125
+
126
+ # If an unknown method is called then it is sent through the morgrify program
127
+ # Look here to find all the commands (http://www.imagemagick.org/script/mogrify.php)
128
+ def method_missing(symbol, *args)
129
+ args.push(@path) # push the path onto the end
130
+ run_command("mogrify", "-#{symbol}", *args)
131
+ self
132
+ end
133
+
134
+ # You can use multiple commands together using this method
135
+ def combine_options(&block)
136
+ c = CommandBuilder.new
137
+ block.call c
138
+ run_command("mogrify", *c.args << @path)
139
+ end
140
+
141
+ # Check to see if we are running on win32 -- we need to escape things differently
142
+ def windows?
143
+ !(RUBY_PLATFORM =~ /win32/).nil?
144
+ end
145
+
146
+ # Outputs a carriage-return delimited format string for Unix and Windows
147
+ def format_option(format)
148
+ windows? ? "#{format}\\n" : "#{format}\\\\n"
149
+ end
150
+
151
+ def run_command(command, *args)
152
+ args.collect! do |arg|
153
+ # args can contain characters like '>' so we must escape them, but don't quote switches
154
+ if arg !~ /^[\+\-]/
155
+ "\"#{arg}\""
156
+ else
157
+ arg.to_s
158
+ end
159
+ end
160
+
161
+ command = "#{MiniMagick.processor} #{command} #{args.join(' ')}".strip
162
+ sub = Subexec.run(command, :timeout => MiniMagick.timeout)
163
+
164
+ if sub.exitstatus != 0
165
+ # Clean up after ourselves in case of an error
166
+ destroy!
167
+
168
+ # Raise the appropriate error
169
+ if sub.output =~ /no decode delegate/i || sub.output =~ /did not return an image/i
170
+ raise Invalid, sub.output
171
+ else
172
+ raise Error, "Command (#{command.inspect}) failed: #{{:status_code => sub.exitstatus, :output => sub.output}.inspect}"
173
+ end
174
+ else
175
+ sub.output
176
+ end
177
+ end
178
+
179
+ def destroy!
180
+ return if tempfile.nil?
181
+ File.unlink(tempfile.path)
182
+ @tempfile = nil
183
+ end
184
+ end
185
+
186
+ class CommandBuilder
187
+ attr :args
188
+
189
+ def initialize
190
+ @args = []
191
+ end
192
+
193
+ def method_missing(symbol, *args)
194
+ @args << "-#{symbol}"
195
+ @args += args
196
+ end
197
+
198
+ def +(value)
199
+ @args << "+#{value}"
200
+ end
201
+ end
202
+ end
Binary file
Binary file
@@ -0,0 +1,20 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), '../lib/mini_magick')
3
+
4
+ class CommandBuilderTest < Test::Unit::TestCase
5
+ include MiniMagick
6
+
7
+ def test_basic
8
+ c = CommandBuilder.new
9
+ c.resize "30x40"
10
+ assert_equal "-resize 30x40", c.args.join(" ")
11
+ end
12
+
13
+ def test_complicated
14
+ c = CommandBuilder.new
15
+ c.resize "30x40"
16
+ c.input 1, 3, 4
17
+ c.lingo "mome fingo"
18
+ assert_equal "-resize 30x40 -input 1 3 4 -lingo mome fingo", c.args.join(" ")
19
+ end
20
+ end
@@ -0,0 +1,178 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), '../lib/mini_magick')
3
+
4
+ MiniMagick.processor = :gm
5
+
6
+ class ImageTest < Test::Unit::TestCase
7
+ include MiniMagick
8
+
9
+ CURRENT_DIR = File.dirname(File.expand_path(__FILE__)) + "/"
10
+
11
+ SIMPLE_IMAGE_PATH = CURRENT_DIR + "simple.gif"
12
+ MINUS_IMAGE_PATH = CURRENT_DIR + "simple-minus.gif"
13
+ TIFF_IMAGE_PATH = CURRENT_DIR + "leaves.tiff"
14
+ NOT_AN_IMAGE_PATH = CURRENT_DIR + "not_an_image.php"
15
+ GIF_WITH_JPG_EXT = CURRENT_DIR + "actually_a_gif.jpg"
16
+ EXIF_IMAGE_PATH = CURRENT_DIR + "trogdor.jpg"
17
+ ANIMATION_PATH = CURRENT_DIR + "animation.gif"
18
+
19
+ def test_image_from_blob
20
+ File.open(SIMPLE_IMAGE_PATH, "rb") do |f|
21
+ image = Image.from_blob(f.read)
22
+ image.destroy!
23
+ end
24
+ end
25
+
26
+ def test_image_from_file
27
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
28
+ image.destroy!
29
+ end
30
+
31
+ def test_image_new
32
+ image = Image.new(SIMPLE_IMAGE_PATH)
33
+ image.destroy!
34
+ end
35
+
36
+ def test_image_write
37
+ output_path = "output.gif"
38
+ begin
39
+ image = Image.new(SIMPLE_IMAGE_PATH)
40
+ image.write output_path
41
+
42
+ assert File.exists?(output_path)
43
+ ensure
44
+ File.delete output_path
45
+ end
46
+ image.destroy!
47
+ end
48
+
49
+ def test_not_an_image
50
+ assert_raise(MiniMagick::Invalid) do
51
+ image = Image.new(NOT_AN_IMAGE_PATH)
52
+ image.destroy!
53
+ end
54
+ end
55
+
56
+ def test_image_meta_info
57
+ image = Image.new(SIMPLE_IMAGE_PATH)
58
+ assert_equal 150, image[:width]
59
+ assert_equal 55, image[:height]
60
+ assert_equal [150, 55], image[:dimensions]
61
+ assert_match(/^gif$/i, image[:format])
62
+ image.destroy!
63
+ end
64
+
65
+ def test_tiff
66
+ image = Image.new(TIFF_IMAGE_PATH)
67
+ assert_equal "tiff", image[:format].downcase
68
+ assert_equal 295, image[:width]
69
+ assert_equal 242, image[:height]
70
+ image.destroy!
71
+ end
72
+
73
+ # def test_animation_pages
74
+ # image = Image.from_file(ANIMATION_PATH)
75
+ # image.format "png", 0
76
+ # assert_equal "png", image[:format].downcase
77
+ # image.destroy!
78
+ # end
79
+
80
+ # def test_animation_size
81
+ # image = Image.from_file(ANIMATION_PATH)
82
+ # assert_equal image[:size], 76631
83
+ # image.destroy!
84
+ # end
85
+
86
+ def test_gif_with_jpg_format
87
+ image = Image.new(GIF_WITH_JPG_EXT)
88
+ assert_equal "gif", image[:format].downcase
89
+ image.destroy!
90
+ end
91
+
92
+ def test_image_resize
93
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
94
+ image.resize "20x30!"
95
+
96
+ assert_equal 20, image[:width]
97
+ assert_equal 30, image[:height]
98
+ assert_match(/^gif$/i, image[:format])
99
+ image.destroy!
100
+ end
101
+
102
+ def test_image_resize_with_minimum
103
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
104
+ original_width, original_height = image[:width], image[:height]
105
+ image.resize "#{original_width + 10}x#{original_height + 10}>"
106
+
107
+ assert_equal original_width, image[:width]
108
+ assert_equal original_height, image[:height]
109
+ image.destroy!
110
+ end
111
+
112
+ def test_image_combine_options_resize_blur
113
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
114
+ image.combine_options do |c|
115
+ c.resize "20x30!"
116
+ c.blur 50
117
+ end
118
+
119
+ assert_equal 20, image[:width]
120
+ assert_equal 30, image[:height]
121
+ assert_match(/^gif$/i, image[:format])
122
+ image.destroy!
123
+ end
124
+
125
+ def test_image_combine_options_with_filename_with_minusses_in_it
126
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
127
+ assert_nothing_raised do
128
+ image.combine_options do |c|
129
+ c.draw "image Over 0,0 10,10 '#{MINUS_IMAGE_PATH}'"
130
+ end
131
+ end
132
+ image.destroy!
133
+ end
134
+
135
+ def test_exif
136
+ image = Image.from_file(EXIF_IMAGE_PATH)
137
+ assert_equal('0220', image["exif:ExifVersion"])
138
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
139
+ assert_equal('', image["EXIF:ExifVersion"])
140
+ image.destroy!
141
+ end
142
+
143
+ def test_original_at
144
+ image = Image.from_file(EXIF_IMAGE_PATH)
145
+ assert_equal(Time.local('2005', '2', '23', '23', '17', '24'), image[:original_at])
146
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
147
+ assert_nil(image[:original_at])
148
+ image.destroy!
149
+ end
150
+
151
+ def test_tempfile_at_path
152
+ image = Image.from_file(TIFF_IMAGE_PATH)
153
+ assert_equal image.path, image.tempfile.path
154
+ image.destroy!
155
+ end
156
+
157
+ def test_tempfile_at_path_after_format
158
+ image = Image.from_file(TIFF_IMAGE_PATH)
159
+ image.format('png')
160
+ assert_equal image.path, image.tempfile.path
161
+ image.destroy!
162
+ end
163
+
164
+ def test_previous_tempfile_deleted_after_format
165
+ image = Image.from_file(TIFF_IMAGE_PATH)
166
+ before = image.path.dup
167
+ image.format('png')
168
+ assert !File.exist?(before)
169
+ image.destroy!
170
+ end
171
+
172
+ # def test_mini_magick_error_when_referencing_not_existing_page
173
+ # image = Image.from_file(ANIMATION_PATH)
174
+ # image.format('png')
175
+ # assert_equal image[:format], 'PNG'
176
+ # image.destroy!
177
+ # end
178
+ end
data/test/leaves.tiff ADDED
Binary file
@@ -0,0 +1,604 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html dir="ltr"><head>
3
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>TextDrive Community Forum / Lighttpd says Insufficient memory (case 4)</title>
4
+
5
+ <link rel="stylesheet" type="text/css" href="not_an_image_files/Oxygen.css">
6
+ <script type="text/javascript">
7
+ <!--
8
+ function process_form(the_form)
9
+ {
10
+ var element_names = new Object()
11
+ element_names["req_message"] = "Message"
12
+
13
+ if (document.all || document.getElementById)
14
+ {
15
+ for (i = 0; i < the_form.length; ++i)
16
+ {
17
+ var elem = the_form.elements[i]
18
+ if (elem.name && elem.name.substring(0, 4) == "req_")
19
+ {
20
+ if (elem.type && (elem.type=="text" || elem.type=="textarea" || elem.type=="password" || elem.type=="file") && elem.value=='')
21
+ {
22
+ alert("\"" + element_names[elem.name] + "\" is a required field in this form.")
23
+ elem.focus()
24
+ return false
25
+ }
26
+ }
27
+ }
28
+ }
29
+
30
+ return true
31
+ }
32
+ // -->
33
+ </script>
34
+ <style type="text/css">
35
+
36
+ body
37
+ {
38
+ margin: 0px;
39
+ padding: 0px;
40
+ }
41
+
42
+ #header
43
+ {
44
+ margin: 0;
45
+ padding: 0;
46
+ height: 100px;
47
+ text-align: left;
48
+ background-color: #003;
49
+ }
50
+
51
+ #navlinks
52
+ {
53
+ font: 10px Verdana, Arial, Helvetica, sans-serif;
54
+ color: #333333;
55
+ padding: 10px;
56
+
57
+ }
58
+ </style></head>
59
+
60
+
61
+ <body>
62
+ <div id="header"><a href="http://textdrive.com/"><img src="not_an_image_files/textdrive_head.gif" style="border: 0pt none ;" alt="TextDrive" height="100" width="600"></a></div>
63
+ <div id="punwrap">
64
+ <div id="punviewtopic" class="pun">
65
+
66
+ <div id="brdheader" class="block">
67
+ <div class="box">
68
+ <div id="brdmenui" class="inbox">
69
+ <ul>
70
+ <li id="navindex"><a href="http://forum.textdrive.com/index.php">Index</a></li>
71
+ <li id="navuserlist"><a href="http://forum.textdrive.com/userlist.php">User list</a></li>
72
+ <li id="navsearch"><a href="http://forum.textdrive.com/search.php">Search</a></li>
73
+ <li id="navprofile"><a href="http://forum.textdrive.com/profile.php?id=1067">Profile</a></li>
74
+ <li id="navlogout"><a href="http://forum.textdrive.com/login.php?action=out&amp;id=1067">Logout</a></li>
75
+ </ul>
76
+ </div>
77
+ <div id="brdwelcome" class="inbox">
78
+ <ul class="conl">
79
+ <li>Logged in as <strong>geography</strong></li>
80
+ <li>Last visit: Today 21:29:23</li>
81
+ </ul>
82
+ <div class="clearer"></div>
83
+ </div>
84
+ </div>
85
+ </div>
86
+
87
+
88
+
89
+ <div class="linkst">
90
+ <div class="inbox">
91
+ <p class="pagelink conl">Pages: <strong>1</strong></p>
92
+ <p class="postlink conr"><a href="http://forum.textdrive.com/post.php?tid=7356">Post reply</a></p>
93
+ <ul><li><a href="http://forum.textdrive.com/index.php">Index</a></li><li>&nbsp;»&nbsp;<a href="http://forum.textdrive.com/viewforum.php?id=4">Troubleshooting</a></li><li>&nbsp;»&nbsp;Lighttpd says Insufficient memory (case 4)</li></ul>
94
+ <div class="clearer"></div>
95
+ </div>
96
+ </div>
97
+
98
+ <div id="p62698" class="blockpost rowodd firstpost">
99
+ <h2><span><span class="conr">#1&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62698#p62698">Yesterday 20:47:30</a></span></h2>
100
+ <div class="box">
101
+ <div class="inbox">
102
+ <div class="postleft">
103
+ <dl>
104
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1067">geography</a></strong></dt>
105
+ <dd class="usertitle"><strong>Member</strong></dd>
106
+ <dd class="postavatar"></dd>
107
+ <dd>From: NYC</dd>
108
+ <dd>Registered: 2005-03-17</dd>
109
+ <dd>Posts: 10</dd>
110
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1067">E-mail</a>&nbsp;&nbsp;<a href="http://journal.gleepglop.com/">Website</a></dd>
111
+ </dl>
112
+ </div>
113
+ <div class="postright">
114
+ <h3>Lighttpd says Insufficient memory (case 4)</h3>
115
+ <div class="postmsg">
116
+ <p>I
117
+ have a rails app that downloads images found on the web. I'm running it
118
+ through lighttpd and everything works fine unless it is a large image
119
+ (Like over 500k).</p>
120
+
121
+ <p>Then lighttpd throughs this error:</p>
122
+ Insufficient memory (case 4)
123
+
124
+ <p>Has anyone else encountered this? What exactly could be the root of this error?</p>
125
+
126
+
127
+
128
+ </div>
129
+ </div>
130
+ <div class="clearer"></div>
131
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
132
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62698">Report</a> | </li><li class="postedit"><a href="http://forum.textdrive.com/edit.php?id=62698">Edit</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62698">Quote</a></li></ul></div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ <div id="p62708" class="blockpost roweven">
138
+ <h2><span><span class="conr">#2&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62708#p62708">Yesterday 22:06:50</a></span></h2>
139
+ <div class="box">
140
+ <div class="inbox">
141
+ <div class="postleft">
142
+ <dl>
143
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=2707">jqshenker</a></strong></dt>
144
+ <dd class="usertitle"><strong>Member</strong></dd>
145
+ <dd class="postavatar"><img src="not_an_image_files/2707.jfif" alt="" height="60" width="60"></dd>
146
+ <dd>From: Palo Alto, CA</dd>
147
+ <dd>Registered: 2005-09-06</dd>
148
+ <dd>Posts: 422</dd>
149
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=2707">E-mail</a>&nbsp;&nbsp;<a href="http://nothingmuch.textdriven.com/">Website</a></dd>
150
+ </dl>
151
+ </div>
152
+ <div class="postright">
153
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
154
+ <div class="postmsg">
155
+ <p>Yeah,
156
+ it's the limits. Are you downloading it, or resizing it as well?
157
+ Downloading usually isn't the problem, it's the resizing that breaks.</p>
158
+
159
+
160
+
161
+ </div>
162
+ <div class="postsignature"><hr><a href="http://soggyslides.textdriven.com/">soggyslides - {abstractisms daily}</a></div>
163
+ </div>
164
+ <div class="clearer"></div>
165
+ <div class="postfootleft"><p>Offline</p></div>
166
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62708">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62708">Quote</a></li></ul></div>
167
+ </div>
168
+ </div>
169
+ </div>
170
+
171
+ <div id="p62709" class="blockpost rowodd">
172
+ <h2><span><span class="conr">#3&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62709#p62709">Yesterday 22:12:28</a></span></h2>
173
+ <div class="box">
174
+ <div class="inbox">
175
+ <div class="postleft">
176
+ <dl>
177
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1045">julik</a></strong></dt>
178
+ <dd class="usertitle"><strong>Member</strong></dd>
179
+ <dd class="postavatar"><img src="not_an_image_files/1045.png" alt="" height="60" width="57"></dd>
180
+ <dd>From: Utrecht, Netherlands</dd>
181
+ <dd>Registered: 2005-03-12</dd>
182
+ <dd>Posts: 137</dd>
183
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1045">E-mail</a>&nbsp;&nbsp;<a href="http://live.julik.nl/">Website</a></dd>
184
+ </dl>
185
+ </div>
186
+ <div class="postright">
187
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
188
+ <div class="postmsg">
189
+ <p>that doesn't feel well</p>
190
+
191
+
192
+
193
+ </div>
194
+ </div>
195
+ <div class="clearer"></div>
196
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
197
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62709">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62709">Quote</a></li></ul></div>
198
+ </div>
199
+ </div>
200
+ </div>
201
+
202
+ <div id="p62732" class="blockpost roweven">
203
+ <h2><span><span class="conr">#4&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62732#p62732">Today 03:46:42</a></span></h2>
204
+ <div class="box">
205
+ <div class="inbox">
206
+ <div class="postleft">
207
+ <dl>
208
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1067">geography</a></strong></dt>
209
+ <dd class="usertitle"><strong>Member</strong></dd>
210
+ <dd class="postavatar"></dd>
211
+ <dd>From: NYC</dd>
212
+ <dd>Registered: 2005-03-17</dd>
213
+ <dd>Posts: 10</dd>
214
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1067">E-mail</a>&nbsp;&nbsp;<a href="http://journal.gleepglop.com/">Website</a></dd>
215
+ </dl>
216
+ </div>
217
+ <div class="postright">
218
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
219
+ <div class="postmsg">
220
+ <p>I'm resizing it too. But that is not where it dies.<br>
221
+ It dies right before I write it to disk (With Magick::Image.write from RMagick)</p>
222
+
223
+
224
+
225
+ </div>
226
+ </div>
227
+ <div class="clearer"></div>
228
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
229
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62732">Report</a> | </li><li class="postdelete"><a href="http://forum.textdrive.com/delete.php?id=62732">Delete</a> | </li><li class="postedit"><a href="http://forum.textdrive.com/edit.php?id=62732">Edit</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62732">Quote</a></li></ul></div>
230
+ </div>
231
+ </div>
232
+ </div>
233
+
234
+ <div id="p62735" class="blockpost rowodd">
235
+ <h2><span><span class="conr">#5&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62735#p62735">Today 04:14:08</a></span></h2>
236
+ <div class="box">
237
+ <div class="inbox">
238
+ <div class="postleft">
239
+ <dl>
240
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=2707">jqshenker</a></strong></dt>
241
+ <dd class="usertitle"><strong>Member</strong></dd>
242
+ <dd class="postavatar"><img src="not_an_image_files/2707.jfif" alt="" height="60" width="60"></dd>
243
+ <dd>From: Palo Alto, CA</dd>
244
+ <dd>Registered: 2005-09-06</dd>
245
+ <dd>Posts: 422</dd>
246
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=2707">E-mail</a>&nbsp;&nbsp;<a href="http://nothingmuch.textdriven.com/">Website</a></dd>
247
+ </dl>
248
+ </div>
249
+ <div class="postright">
250
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
251
+ <div class="postmsg">
252
+ <p></p><blockquote><div class="incqbox"><h4>geography wrote:</h4><p>I'm resizing it too. But that is not where it dies.<br>
253
+ It dies right before I write it to disk (With Magick::Image.write from RMagick)</p></div></blockquote><p><br>
254
+ I meant "resizing" as anything to do with RMagick. There've been a
255
+ couple threads on this, search around. Resizing you image before upload
256
+ or not using RMagick and instead using ImageMagick via the commandline
257
+ might or might not work.... basically you can't do much, unfortunately.</p>
258
+
259
+
260
+
261
+ </div>
262
+ <div class="postsignature"><hr><a href="http://soggyslides.textdriven.com/">soggyslides - {abstractisms daily}</a></div>
263
+ </div>
264
+ <div class="clearer"></div>
265
+ <div class="postfootleft"><p>Offline</p></div>
266
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62735">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62735">Quote</a></li></ul></div>
267
+ </div>
268
+ </div>
269
+ </div>
270
+
271
+ <div id="p62737" class="blockpost roweven">
272
+ <h2><span><span class="conr">#6&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62737#p62737">Today 04:17:28</a></span></h2>
273
+ <div class="box">
274
+ <div class="inbox">
275
+ <div class="postleft">
276
+ <dl>
277
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1097">cch</a></strong></dt>
278
+ <dd class="usertitle"><strong>Member</strong></dd>
279
+ <dd class="postavatar"></dd>
280
+ <dd>Registered: 2005-03-21</dd>
281
+ <dd>Posts: 108</dd>
282
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1097">E-mail</a></dd>
283
+ </dl>
284
+ </div>
285
+ <div class="postright">
286
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
287
+ <div class="postmsg">
288
+ <p>what if you use open(fname, 'w'){|f|f.write img.to_blob} ?</p>
289
+
290
+
291
+
292
+ </div>
293
+ </div>
294
+ <div class="clearer"></div>
295
+ <div class="postfootleft"><p>Offline</p></div>
296
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62737">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62737">Quote</a></li></ul></div>
297
+ </div>
298
+ </div>
299
+ </div>
300
+
301
+ <div id="p62767" class="blockpost rowodd">
302
+ <h2><span><span class="conr">#7&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62767#p62767">Today 15:44:42</a></span></h2>
303
+ <div class="box">
304
+ <div class="inbox">
305
+ <div class="postleft">
306
+ <dl>
307
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1067">geography</a></strong></dt>
308
+ <dd class="usertitle"><strong>Member</strong></dd>
309
+ <dd class="postavatar"></dd>
310
+ <dd>From: NYC</dd>
311
+ <dd>Registered: 2005-03-17</dd>
312
+ <dd>Posts: 10</dd>
313
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1067">E-mail</a>&nbsp;&nbsp;<a href="http://journal.gleepglop.com/">Website</a></dd>
314
+ </dl>
315
+ </div>
316
+ <div class="postright">
317
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
318
+ <div class="postmsg">
319
+ <p>Using
320
+ open(fname, 'w'){|f|f.write img.to_blob} has the same problem... I
321
+ guess I'll try and run it from the command line but that seems like a
322
+ drastic step. Why is the memory so limited, shouldn't the server be
323
+ able to save 500k files, or does imageMagick have a very high overhead?</p>
324
+
325
+
326
+
327
+ </div>
328
+ </div>
329
+ <div class="clearer"></div>
330
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
331
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62767">Report</a> | </li><li class="postdelete"><a href="http://forum.textdrive.com/delete.php?id=62767">Delete</a> | </li><li class="postedit"><a href="http://forum.textdrive.com/edit.php?id=62767">Edit</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62767">Quote</a></li></ul></div>
332
+ </div>
333
+ </div>
334
+ </div>
335
+
336
+ <div id="p62774" class="blockpost roweven">
337
+ <h2><span><span class="conr">#8&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62774#p62774">Today 17:03:28</a></span></h2>
338
+ <div class="box">
339
+ <div class="inbox">
340
+ <div class="postleft">
341
+ <dl>
342
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=2707">jqshenker</a></strong></dt>
343
+ <dd class="usertitle"><strong>Member</strong></dd>
344
+ <dd class="postavatar"><img src="not_an_image_files/2707.jfif" alt="" height="60" width="60"></dd>
345
+ <dd>From: Palo Alto, CA</dd>
346
+ <dd>Registered: 2005-09-06</dd>
347
+ <dd>Posts: 422</dd>
348
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=2707">E-mail</a>&nbsp;&nbsp;<a href="http://nothingmuch.textdriven.com/">Website</a></dd>
349
+ </dl>
350
+ </div>
351
+ <div class="postright">
352
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
353
+ <div class="postmsg">
354
+ <p>RMagick
355
+ does leak memory in some versions (there's a patched version of
356
+ file_column which resizes via the commandline), but I'm not sure why
357
+ you can't resize larger images. It doesn't take <strong>that</strong> much memory.</p>
358
+
359
+
360
+
361
+ </div>
362
+ <div class="postsignature"><hr><a href="http://soggyslides.textdriven.com/">soggyslides - {abstractisms daily}</a></div>
363
+ </div>
364
+ <div class="clearer"></div>
365
+ <div class="postfootleft"><p>Offline</p></div>
366
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62774">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62774">Quote</a></li></ul></div>
367
+ </div>
368
+ </div>
369
+ </div>
370
+
371
+ <div id="p62782" class="blockpost rowodd">
372
+ <h2><span><span class="conr">#9&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62782#p62782">Today 19:04:21</a></span></h2>
373
+ <div class="box">
374
+ <div class="inbox">
375
+ <div class="postleft">
376
+ <dl>
377
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1067">geography</a></strong></dt>
378
+ <dd class="usertitle"><strong>Member</strong></dd>
379
+ <dd class="postavatar"></dd>
380
+ <dd>From: NYC</dd>
381
+ <dd>Registered: 2005-03-17</dd>
382
+ <dd>Posts: 10</dd>
383
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1067">E-mail</a>&nbsp;&nbsp;<a href="http://journal.gleepglop.com/">Website</a></dd>
384
+ </dl>
385
+ </div>
386
+ <div class="postright">
387
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
388
+ <div class="postmsg">
389
+ <p>So what i've learned so far...</p>
390
+
391
+ <p>TextDrive has a memory limit.<br>
392
+ -When using RMagick in a rails app running with fcgi and lighttpd this memory limit is exceeded.<br>
393
+ -When the memory limit is exceeded the fcgi process is killed (No expcetions caught or anything in Ruby... the process ends)<br>
394
+ -The problem occurs when writing images to disk (With either File.open or Image.write)<br>
395
+ -The problem still occurs if I call GC.starts after RMagick calls</p>
396
+
397
+ <p>Here is what I don't get...<br>
398
+ -Why is the memory limit so low (Or why does a simple RMagick call take
399
+ up so much memory? My dispatch procs take up around 50 megs, I can't
400
+ imagine that opening a 600k file would come close to using that much
401
+ memory)<br>
402
+ -Would putting my RMagick code in a different thread allow me to have more memory at my disposal?</p>
403
+
404
+
405
+
406
+ </div>
407
+ </div>
408
+ <div class="clearer"></div>
409
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
410
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62782">Report</a> | </li><li class="postdelete"><a href="http://forum.textdrive.com/delete.php?id=62782">Delete</a> | </li><li class="postedit"><a href="http://forum.textdrive.com/edit.php?id=62782">Edit</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62782">Quote</a></li></ul></div>
411
+ </div>
412
+ </div>
413
+ </div>
414
+
415
+ <div id="p62785" class="blockpost roweven">
416
+ <h2><span><span class="conr">#10&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62785#p62785">Today 19:29:11</a></span></h2>
417
+ <div class="box">
418
+ <div class="inbox">
419
+ <div class="postleft">
420
+ <dl>
421
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1097">cch</a></strong></dt>
422
+ <dd class="usertitle"><strong>Member</strong></dd>
423
+ <dd class="postavatar"></dd>
424
+ <dd>Registered: 2005-03-21</dd>
425
+ <dd>Posts: 108</dd>
426
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1097">E-mail</a></dd>
427
+ </dl>
428
+ </div>
429
+ <div class="postright">
430
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
431
+ <div class="postmsg">
432
+ <p>the memory limit is 100mb.</p>
433
+
434
+ <p>watch
435
+ your process as you make the upload to see how high it goes. also try
436
+ resizing an image using a standalone (no rails) ruby script and see how
437
+ much memory it uses this way.</p>
438
+
439
+
440
+
441
+ </div>
442
+ </div>
443
+ <div class="clearer"></div>
444
+ <div class="postfootleft"><p>Offline</p></div>
445
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62785">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62785">Quote</a></li></ul></div>
446
+ </div>
447
+ </div>
448
+ </div>
449
+
450
+ <div id="p62796" class="blockpost rowodd">
451
+ <h2><span><span class="conr">#11&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62796#p62796">Today 21:13:19</a></span></h2>
452
+ <div class="box">
453
+ <div class="inbox">
454
+ <div class="postleft">
455
+ <dl>
456
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1067">geography</a></strong></dt>
457
+ <dd class="usertitle"><strong>Member</strong></dd>
458
+ <dd class="postavatar"></dd>
459
+ <dd>From: NYC</dd>
460
+ <dd>Registered: 2005-03-17</dd>
461
+ <dd>Posts: 10</dd>
462
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1067">E-mail</a>&nbsp;&nbsp;<a href="http://journal.gleepglop.com/">Website</a></dd>
463
+ </dl>
464
+ </div>
465
+ <div class="postright">
466
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
467
+ <div class="postmsg">
468
+ <p>So after some investigation it seems like RMagick is a total memory hog.</p>
469
+
470
+ <p>I load a 750k image with this tiny standalone ruby program...</p>
471
+
472
+ <p>image = nil<br>
473
+ open(filepath) do |f|</p>
474
+ image = Magick::Image.from_blob(f.read).first<br>
475
+ end<br>
476
+ image.write("image.jpg")
477
+
478
+ <p>Monitoring the mem usage (using top) I get this 8th column is mem usuage</p>
479
+ <p>#File being downloaded<br>
480
+ 7198 ruby 7.6% 0:04.83 2 15 60 3.37M+ 2.65M 4.88M+ 44.5M+<br>
481
+ 7198 ruby 14.4% 0:05.01 2 15 68 18.1M+ 2.73M+ 20.0M+ 80.9M+<br>
482
+ 7198 ruby 35.0% 0:05.49 2 15 67 41.8M+ 2.73M 43.7M+ 80.8M-</p>
483
+ <p>#File being loading into Magick::Image<br>
484
+ 7198 ruby 0.1% 0:05.49 2 15 67 41.8M 2.73M 43.7M 80.8M-<br>
485
+ 7198 ruby 0.1% 0:05.49 2 15 67 41.8M 2.73M 43.7M 80.8M-</p>
486
+ <p>#File being written to disk<br>
487
+ 7198 ruby 3.4% 0:05.53 2 15 72 43.4M+ 2.73M 45.3M+ 122M+<br>
488
+ 7198 ruby 55.9% 0:06.29 2 15 72 61.1M+ 2.73M 63.0M+ 122M <br>
489
+ 7198 ruby 48.4% 0:06.93 2 15 72 76.1M+ 2.73M 78.1M+ 122M <br>
490
+ 7198 ruby 48.2% 0:07.55 2 15 67 42.5M- 2.73M 44.4M- 80.8M-</p>
491
+
492
+ <p>So
493
+ I guess the moral is RMagick eats up a ton of memory. I can't really
494
+ see anyway around this problem though, maybe using the command line
495
+ would eat up less memory (which is what I'll try next)</p>
496
+
497
+
498
+
499
+ <p class="postedit"><em>Last edited by geography (Today 21:29:17)</em></p>
500
+ </div>
501
+ </div>
502
+ <div class="clearer"></div>
503
+ <div class="postfootleft"><p><strong>Online</strong></p></div>
504
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62796">Report</a> | </li><li class="postdelete"><a href="http://forum.textdrive.com/delete.php?id=62796">Delete</a> | </li><li class="postedit"><a href="http://forum.textdrive.com/edit.php?id=62796">Edit</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62796">Quote</a></li></ul></div>
505
+ </div>
506
+ </div>
507
+ </div>
508
+
509
+ <div id="p62801" class="blockpost roweven">
510
+ <h2><span><span class="conr">#12&nbsp;</span><a href="http://forum.textdrive.com/viewtopic.php?pid=62801#p62801">Today 21:55:36</a></span></h2>
511
+ <div class="box">
512
+ <div class="inbox">
513
+ <div class="postleft">
514
+ <dl>
515
+ <dt><strong><a href="http://forum.textdrive.com/profile.php?id=1097">cch</a></strong></dt>
516
+ <dd class="usertitle"><strong>Member</strong></dd>
517
+ <dd class="postavatar"></dd>
518
+ <dd>Registered: 2005-03-21</dd>
519
+ <dd>Posts: 108</dd>
520
+ <dd class="usercontacts"><a href="http://forum.textdrive.com/misc.php?email=1097">E-mail</a></dd>
521
+ </dl>
522
+ </div>
523
+ <div class="postright">
524
+ <h3> Re: Lighttpd says Insufficient memory (case 4)</h3>
525
+ <div class="postmsg">
526
+ <p>Yea, now you have to know whether it's RMagick specifically, or ImageMagick itself that is a memory hog.</p>
527
+
528
+ <p>I
529
+ suppose it goes memory hungry because it expands a full uncompressed
530
+ 24bit bitmap to memory, and that's innevitably large. (entirely
531
+ uninformed hunch)</p>
532
+
533
+ <p>There's ruby-GD as an alternative, but it
534
+ doesn't look nearly as nice, and I've never used it, and I don't know
535
+ if it'd be more or less of a hog.</p>
536
+
537
+
538
+
539
+ <p class="postedit"><em>Last edited by cch (Today 21:56:17)</em></p>
540
+ </div>
541
+ </div>
542
+ <div class="clearer"></div>
543
+ <div class="postfootleft"><p>Offline</p></div>
544
+ <div class="postfootright"><ul><li class="postreport"><a href="http://forum.textdrive.com/misc.php?report=62801">Report</a> | </li><li class="postquote"><a href="http://forum.textdrive.com/post.php?tid=7356&amp;qid=62801">Quote</a></li></ul></div>
545
+ </div>
546
+ </div>
547
+ </div>
548
+
549
+ <div class="postlinksb">
550
+ <div class="inbox">
551
+ <p class="postlink conr"><a href="http://forum.textdrive.com/post.php?tid=7356">Post reply</a></p>
552
+ <p class="pagelink conl">Pages: <strong>1</strong></p>
553
+ <ul><li><a href="http://forum.textdrive.com/index.php">Index</a></li><li>&nbsp;»&nbsp;<a href="http://forum.textdrive.com/viewforum.php?id=4">Troubleshooting</a></li><li>&nbsp;»&nbsp;Lighttpd says Insufficient memory (case 4)</li></ul>
554
+ <p class="subscribelink clearb">You are currently subscribed to this topic - <a href="http://forum.textdrive.com/misc.php?unsubscribe=7356">Unsubscribe</a></p>
555
+ </div>
556
+ </div>
557
+
558
+ <div class="blockform">
559
+ <h2><span>Quick post</span></h2>
560
+ <div class="box">
561
+ <form method="post" action="post.php?tid=7356" onsubmit="this.submit.disabled=true;if(process_form(this)){return true;}else{this.submit.disabled=false;return false;}">
562
+ <div class="inform">
563
+ <fieldset>
564
+ <legend>Write your message and submit <span style="color: red; text-decoration: underline;">keeping in mind that this is not an official support forum.</span></legend>
565
+ <div class="infldset txtarea">
566
+ <input name="form_sent" value="1" type="hidden">
567
+ <input name="form_user" value="geography" type="hidden">
568
+ <label><textarea name="req_message" rows="7" cols="75" tabindex="1"></textarea></label>
569
+ <ul class="bblinks">
570
+ <li><a href="http://forum.textdrive.com/help.php#bbcode" onclick="window.open(this.href); return false;">BBCode</a>: on</li>
571
+ <li><a href="http://forum.textdrive.com/help.php#img" onclick="window.open(this.href); return false;">[img] tag</a>: on</li>
572
+ <li><a href="http://forum.textdrive.com/help.php#smilies" onclick="window.open(this.href); return false;">Smilies</a>: off</li>
573
+ </ul>
574
+ </div>
575
+ </fieldset>
576
+ </div>
577
+ <p><input name="submit" tabindex="2" value="Submit" accesskey="s" type="submit"></p>
578
+ </form>
579
+ </div>
580
+ </div>
581
+
582
+ <div id="brdfooter" class="block">
583
+ <h2><span>Board footer</span></h2>
584
+ <div class="box">
585
+ <div class="inbox">
586
+
587
+ <div class="conl">
588
+ <form id="qjump" method="get" action="viewforum.php">
589
+ <div><label>Jump to
590
+ <br><select name="id" onchange="window.location=('viewforum.php?id='+this.options[this.selectedIndex].value)"><optgroup label="TextDrive Hosting"><option value="2">Announcements</option><option value="33">Questions and Stuff</option><option value="11">Why Host With TXD?</option><option value="1">Getting Started</option><option value="3">How Do I...?</option><option value="4" selected="selected">Troubleshooting</option><option value="15">SPAM and Security</option><option value="5">Coding in General</option><option value="16">Localhostin'</option><option value="31">Look What I Did Dammit</option><option value="6">TextDrivel</option><option value="8">Archives</option><option value="32">Designing yourself into a corner</option></optgroup><optgroup label="TextDrive Internationale"><option value="23">TextDrive En Español</option><option value="24">TextDrive en Français</option></optgroup><optgroup label="Applications (and their developers) on TextDrive"><option value="7">Textpattern</option><option value="9">RubyOnRails</option><option value="10">Instiki</option><option value="12">Photostack</option><option value="13">PunBB</option><option value="14">WordPress</option><option value="17">Epilog</option><option value="20">sIFR</option><option value="22">Subversion</option><option value="26">Lightpress</option><option value="27">Loudblog</option><option value="25">Strongspace</option><option value="29">RailsAppHosting</option><option value="35">Anemone</option><option value="28">Django</option><option value="30">TurboGears</option><option value="34">Templation</option></optgroup></select>
591
+ <input value=" Go " accesskey="g" type="submit">
592
+ </label></div>
593
+ </form>
594
+ </div>
595
+ <p class="conr">Powered by <a href="http://www.punbb.org/">PunBB</a><br>© Copyright 2002–2005 Rickard Andersson</p>
596
+ <div class="clearer"></div>
597
+ </div>
598
+ </div>
599
+ </div>
600
+
601
+ </div>
602
+ </div>
603
+
604
+ </body></html>
Binary file
data/test/simple.gif ADDED
Binary file
data/test/trogdor.jpg ADDED
Binary file
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hcatlin-mini_magick
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 3
8
+ - 0
9
+ version: 1.3.0
10
+ platform: ruby
11
+ authors:
12
+ - Corey Johnson
13
+ - Peter Kieltyka
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-02 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: subexec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ segments:
30
+ - 0
31
+ - 0
32
+ - 2
33
+ version: 0.0.2
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick
37
+ email:
38
+ - probablycorey@gmail.com
39
+ - peter@nulayer.com
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - README.rdoc
48
+ - VERSION
49
+ - MIT-LICENSE
50
+ - Rakefile
51
+ - lib/mini_gmagick.rb
52
+ - lib/mini_magick.rb
53
+ - test/actually_a_gif.jpg
54
+ - test/animation.gif
55
+ - test/command_builder_test.rb
56
+ - test/image_test.rb
57
+ - test/leaves.tiff
58
+ - test/not_an_image.php
59
+ - test/simple-minus.gif
60
+ - test/simple.gif
61
+ - test/trogdor.jpg
62
+ has_rdoc: true
63
+ homepage: http://github.com/nulayer/mini_magick
64
+ licenses: []
65
+
66
+ post_install_message:
67
+ rdoc_options: []
68
+
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ requirements: []
88
+
89
+ rubyforge_project:
90
+ rubygems_version: 1.3.7
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick
94
+ test_files:
95
+ - test/actually_a_gif.jpg
96
+ - test/animation.gif
97
+ - test/command_builder_test.rb
98
+ - test/image_test.rb
99
+ - test/leaves.tiff
100
+ - test/not_an_image.php
101
+ - test/simple-minus.gif
102
+ - test/simple.gif
103
+ - test/trogdor.jpg