bmo-mini_magick 1.2.5

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,19 @@
1
+ == 1.2.2 / 2007-06-01
2
+
3
+ # 1.) all image commands return the image object (The output of the last command is saved in @output)
4
+ # 2.) identify doesn't trip over strangley named files
5
+ # 3.) TempFile uses file extention now (Thanks http://marsorange.com/archives/of-mogrify-ruby-tempfile-dynamic-class-definitions)
6
+ # 4.) identify commands escape output path correctly
7
+
8
+ == 1.2.3 / 2007-06-15
9
+
10
+ # 1.) Image::from_file doesn't drop the file extension anymore, it and use the image_temp_file correctly
11
+ # 4.) TempFiles are stored as an instance variable in Image instances so they don't get cleaned up prematurely via garbage collection
12
+
13
+ == 1.2.3 / 2009-04-28
14
+
15
+ # 1.) Since processing some files takes a long time with identify, get as much information as we'll likely need the FIRST time we
16
+ identify a file; cache this. When we ask for info, do a relatively lightweight check (cksum) on the file, and if it's the same
17
+ as it was, return the cached information. If it's not the same, re-read the file information again.
18
+ # 2.) Use cksum and the existence of cached information as confirmation the file is something that can be handled by write.
19
+
data/Manifest.txt ADDED
@@ -0,0 +1,14 @@
1
+ MIT-LICENSE
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ init.rb
7
+ lib/image_temp_file.rb
8
+ lib/mini_magick.rb
9
+ test/actually_a_gif.jpg
10
+ test/not_an_image.php
11
+ test/simple.gif
12
+ test/test_image_temp_file.rb
13
+ test/test_mini_magick_test.rb
14
+ test/trogdor.jpg
data/README.txt ADDED
@@ -0,0 +1,101 @@
1
+ mini_magick
2
+ by Coery Johnson
3
+ FIX (url)
4
+
5
+ == DESCRIPTION:
6
+
7
+ A ruby wrapper for ImageMagick command line.
8
+
9
+ - Why?
10
+
11
+ I was using RMagick and loving it, but it was eating up huge amounts of memory. A simple script like this...
12
+
13
+ Magick::read("image.jpg") do |f|
14
+ f.write("manipulated.jpg")
15
+ end
16
+
17
+ ...would use over 100 Megs of Ram. On my local machine this wasn't a problem, but on my hosting server the ruby apps would crash because of their 100 Meg memory limit.
18
+
19
+ - Solution!
20
+
21
+ Using MiniMagick the ruby processes memory remains small (it spawns ImageMagick's command line program mogrify which takes up some memory as well, but is much smaller compared to RMagick)
22
+
23
+
24
+ == FEATURES/PROBLEMS:
25
+
26
+ MiniMagick gives you access to all the commandline options ImageMagick has (Found here http://www.imagemagick.org/script/mogrify.php)
27
+
28
+ == SYNOPSIS:
29
+
30
+ Want to make a thumbnail from a file...
31
+
32
+ image = MiniMagick::Image.from_file("input.jpg")
33
+ image.resize "100x100"
34
+ image.write("output.jpg")
35
+
36
+ Want to make a thumbnail from a blob...
37
+
38
+ image = MiniMagick::Image.from_blob(blob)
39
+ image.resize "100x100"
40
+ image.write("output.jpg")
41
+
42
+ Need to combine several options?
43
+
44
+ image = MiniMagick::Image.from_file("input.jpg")
45
+ image.combine_options do |c|
46
+ c.sample "50%"
47
+ c.rotate "-90>"
48
+ end
49
+ image.write("output.jpg")
50
+
51
+ Want to manipulate an image at its source (You won't have to write it out because the transformations are done on that file)
52
+
53
+ image = MiniMagick::Image.new("input.jpg")
54
+ image.resize "100x100"
55
+
56
+ Want to get some meta-information out?
57
+
58
+ image = MiniMagick::Image.from_file("input.jpg")
59
+ image[:width] # will get the width (you can also use :height and :format)
60
+ image["EXIF:BitsPerSample"] # It also can get all the EXIF tags
61
+ image["%m:%f %wx%h"] # Or you can use one of the many options of the format command found here http://www.imagemagick.org/script/command-line-options.php#format
62
+
63
+
64
+ == REQUIREMENTS:
65
+
66
+ You must have ImageMagick installed.
67
+
68
+ == INSTALL:
69
+
70
+ If you downloaded the plugin version, just drop the plugin into RAILS_ROOT/plugins/
71
+
72
+ If you installed this as a gem, then to get it to work add <require "mini_magick"> to RAILS_ROOT/config/environment.rb
73
+
74
+ If you have just downloaded this files then copy the mini_magick.rb file into your RAILS_ROOT/lib directory and add <require "mini-magick"> to RAILS_ROOT/config/environment.rb
75
+
76
+ MiniMagick does NOT require rails though. All the code you need to use MiniMagick is located in the mini_magick/lib/mini_magick.rb file.
77
+
78
+ == LICENSE:
79
+
80
+ (The MIT License)
81
+
82
+ Copyright (c) 2007 FIX
83
+
84
+ Permission is hereby granted, free of charge, to any person obtaining
85
+ a copy of this software and associated documentation files (the
86
+ 'Software'), to deal in the Software without restriction, including
87
+ without limitation the rights to use, copy, modify, merge, publish,
88
+ distribute, sublicense, and/or sell copies of the Software, and to
89
+ permit persons to whom the Software is furnished to do so, subject to
90
+ the following conditions:
91
+
92
+ The above copyright notice and this permission notice shall be
93
+ included in all copies or substantial portions of the Software.
94
+
95
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
96
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
97
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
98
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
99
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
100
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
101
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/mini_magick.rb'
6
+ use_jeweler = 1
7
+ if use_jeweler
8
+ begin
9
+ require 'jeweler'
10
+ Jeweler::Tasks.new do |gemspec|
11
+ gemspec.version = '1.2.4'
12
+ gemspec.name = "mini_magick"
13
+ gemspec.summary = "A simple image manipulation library based on ImageMagick - improvments for caching"
14
+ gemspec.email = "bmoran@onehub.com"
15
+ gemspec.homepage = "http://github.com/bmo/mini_magick"
16
+ gemspec.description = "This is an enhanced version of the mini_magick gem which optimizes analysis of image files."
17
+ gemspec.authors = ["Brian Moran"]
18
+ end
19
+ rescue LoadError
20
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
21
+ end
22
+ else
23
+ Hoe.new('mini_magick', MiniMagick::VERSION) do |p|
24
+ p.rubyforge_name = 'mini_magick'
25
+ p.author = 'Corey Johnson'
26
+ p.email = 'probablycorey+ruby@gmail.com'
27
+ p.summary = 'A simple image manipulation library based on ImageMagick.'
28
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
29
+ #p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
30
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
31
+ end
32
+ end
33
+ # vim: syntax=Ruby
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 1
3
+ :minor: 2
4
+ :patch: 5
@@ -0,0 +1,13 @@
1
+ require "tempfile"
2
+
3
+ module MiniMagick
4
+ class ImageTempFile < Tempfile
5
+ def make_tmpname(basename, n)
6
+ # force tempfile to use basename's extension if provided
7
+ ext = File.extname(basename)
8
+
9
+ # force hyphens instead of periods in name
10
+ sprintf('%s%d-%d%s', File.basename(basename, ext), $$, n, ext)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,186 @@
1
+ require "open-uri"
2
+ require "stringio"
3
+ require "fileutils"
4
+
5
+ require File.join(File.dirname(__FILE__), '/image_temp_file')
6
+
7
+ module MiniMagick
8
+ class MiniMagickError < RuntimeError; end
9
+
10
+ VERSION = '1.2.4'
11
+
12
+ class Image
13
+ attr :path
14
+ attr :tempfile
15
+ attr :output
16
+
17
+ # Class Methods
18
+ # -------------
19
+ class <<self
20
+ def from_blob(blob, extension=nil)
21
+ begin
22
+ tempfile = ImageTempFile.new("minimagick#{extension}")
23
+ tempfile.binmode
24
+ tempfile.write(blob)
25
+ ensure
26
+ tempfile.close
27
+ end
28
+
29
+ return self.new(tempfile.path, tempfile)
30
+ end
31
+
32
+ # Use this if you don't want to overwrite the image file
33
+ def from_file(image_path)
34
+ File.open(image_path, "rb") do |f|
35
+ self.from_blob(f.read, File.extname(image_path))
36
+ end
37
+ end
38
+ end
39
+
40
+ # Instance Methods
41
+ # ----------------
42
+ def cksum(input_path)
43
+ run_command("cksum", @path).split(/\s/)[0]
44
+ end
45
+
46
+ def get_file_info(input_path)
47
+ @image_hash = cksum(@path)
48
+ @image_info_string = run_command("identify", "-format", "|s:%s|m:%m|h:%h|w:%w|%[EXIF:*]\n", @path)
49
+
50
+ # save the hash of the file, so we can validate it again.
51
+
52
+ mm=@image_info_string.match(/^\|s\:(\d+)\|m\:([^\|]*)\|h\:(\d+)\|w\:(\d+)\|(EXIF)?(.*)/)
53
+ if mm
54
+ @image_info = {}
55
+ @image_info[:format] = mm[2];
56
+ @image_info[:height] = mm[3];
57
+ @image_info[:width] = mm[4];
58
+ @image_info[:exif] = mm[5];
59
+ end
60
+
61
+ end
62
+
63
+
64
+ def initialize(input_path, tempfile=nil)
65
+ @path = input_path
66
+ @tempfile = tempfile # ensures that the tempfile will stick around until this image is garbage collected.
67
+
68
+ # Ensure that the file is an image
69
+ # might as well collect some information here.
70
+ #
71
+ get_file_info(input_path)
72
+
73
+ end
74
+
75
+ # For reference see http://www.imagemagick.org/script/command-line-options.php#format
76
+ def [](value)
77
+ # Why do I go to the trouble of putting in newlines? Because otherwise animated gifs screw everything up
78
+ case value.to_s
79
+ when "format"
80
+ if !(@image_info && @image_hash == cksum(@path))
81
+ get_file_info(@path)
82
+ end
83
+ @image_info[:format]
84
+
85
+ when "height"
86
+ if !(@image_info && @image_hash == cksum(@path))
87
+ get_file_info(@path)
88
+ end
89
+ @image_info[:height]
90
+
91
+ when "width"
92
+ if !(@image_info && @image_hash == cksum(@path))
93
+ get_file_info(@path)
94
+ end
95
+ @image_info[:width]
96
+
97
+ when "original_at"
98
+ # Get the EXIF original capture as a Time object
99
+ Time.local(*self["EXIF:DateTimeOriginal"].split(/:|\s+/)) rescue nil
100
+ when /^EXIF\:/i
101
+ run_command('identify', '-format', "\"%[#{value}]\"", @path).chop
102
+ else
103
+ run_command('identify', '-format', "\"#{value}\"", @path).split("\n")[0]
104
+ end
105
+ end
106
+
107
+ # This is a 'special' command because it needs to change @path to reflect the new extension
108
+ def format(format)
109
+ run_command("mogrify", "-format", format, @path)
110
+ @path = @path.sub(/(\.\w+)?$/, ".#{format}")
111
+
112
+ raise "Unable to format to #{format}" unless File.exists?(@path)
113
+ end
114
+
115
+ # Writes the temporary image that we are using for processing to the output path
116
+ def write(output_path)
117
+ FileUtils.copy_file @path, output_path
118
+ unless @image_info && @image_hash == cksum(@path) # skip if we have the same file and we've read it
119
+ run_command "identify", output_path # Verify that we have a good image
120
+ end
121
+ end
122
+
123
+ # Give you raw data back
124
+ def to_blob
125
+ File.read @path
126
+ end
127
+
128
+ # If an unknown method is called then it is sent through the morgrify program
129
+ # Look here to find all the commands (http://www.imagemagick.org/script/mogrify.php)
130
+ def method_missing(symbol, *args)
131
+ args.push(@path) # push the path onto the end
132
+ run_command("mogrify", "-#{symbol}", *args)
133
+ self
134
+ end
135
+
136
+ # You can use multiple commands together using this method
137
+ def combine_options(&block)
138
+ c = CommandBuilder.new
139
+ block.call c
140
+ run_command("mogrify", *c.args << @path)
141
+ end
142
+
143
+ # Check to see if we are running on win32 -- we need to escape things differently
144
+ def windows?
145
+ !(RUBY_PLATFORM =~ /win32/).nil?
146
+ end
147
+
148
+ # Outputs a carriage-return delimited format string for Unix and Windows
149
+ def format_option(format)
150
+ windows? ? "#{format}\\n" : "#{format}\\\\n"
151
+ end
152
+
153
+ def run_command(command, *args)
154
+ args.collect! do |arg|
155
+ arg = arg.to_s
156
+ arg = %|"#{arg}"| unless arg[0] == ?- # values quoted because they can contain characters like '>', but don't quote switches
157
+ arg
158
+ end
159
+
160
+ @output = `#{command} #{args.join(' ')}`
161
+
162
+ if $? != 0
163
+ raise MiniMagickError, "ImageMagick command (#{command} #{args.join(' ')}) failed: Error Given #{$?}"
164
+ else
165
+ @output
166
+ end
167
+ end
168
+ end
169
+
170
+ class CommandBuilder
171
+ attr :args
172
+
173
+ def initialize
174
+ @args = []
175
+ end
176
+
177
+ def method_missing(symbol, *args)
178
+ @args << "-#{symbol}"
179
+ @args += args
180
+ end
181
+
182
+ def +(value)
183
+ @args << "+#{value}"
184
+ end
185
+ end
186
+ end
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>
data/test/simple.gif ADDED
Binary file
@@ -0,0 +1,14 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), '../lib/image_temp_file')
3
+
4
+ class ImageTest < Test::Unit::TestCase
5
+ include MiniMagick
6
+
7
+ def test_image_temp_file
8
+ tmp = ImageTempFile.new('test')
9
+ assert_match %r{^test}, File::basename(tmp.path)
10
+ tmp = ImageTempFile.new('test.jpg')
11
+ assert_match %r{^test}, File::basename(tmp.path)
12
+ assert_match %r{\.jpg$}, File::basename(tmp.path)
13
+ end
14
+ end
@@ -0,0 +1,127 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), '../lib/mini_magick')
3
+
4
+ class ImageTest < Test::Unit::TestCase
5
+ include MiniMagick
6
+
7
+ CURRENT_DIR = File.dirname(File.expand_path(__FILE__)) + "/"
8
+
9
+ SIMPLE_IMAGE_PATH = CURRENT_DIR + "simple.gif"
10
+ TIFF_IMAGE_PATH = CURRENT_DIR + "burner.tiff"
11
+ NOT_AN_IMAGE_PATH = CURRENT_DIR + "not_an_image.php"
12
+ GIF_WITH_JPG_EXT = CURRENT_DIR + "actually_a_gif.jpg"
13
+ EXIF_IMAGE_PATH = CURRENT_DIR + "trogdor.jpg"
14
+
15
+ def test_image_from_blob
16
+ File.open(SIMPLE_IMAGE_PATH, "rb") do |f|
17
+ image = Image.from_blob(f.read)
18
+ end
19
+ end
20
+
21
+ def test_image_from_file
22
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
23
+ end
24
+
25
+ def test_image_new
26
+ image = Image.new(SIMPLE_IMAGE_PATH)
27
+ end
28
+
29
+ def test_image_write
30
+ output_path = "output.gif"
31
+ begin
32
+ image = Image.new(SIMPLE_IMAGE_PATH)
33
+ image.write output_path
34
+
35
+ assert File.exists?(output_path)
36
+ ensure
37
+ File.delete output_path
38
+ end
39
+ end
40
+
41
+ def test_not_an_image
42
+ assert_raise(MiniMagickError) do
43
+ image = Image.new(NOT_AN_IMAGE_PATH)
44
+ end
45
+ end
46
+
47
+ def test_image_meta_info
48
+ image = Image.new(SIMPLE_IMAGE_PATH)
49
+ assert_equal 150, image[:width]
50
+ assert_equal 55, image[:height]
51
+ assert_match(/^gif$/i, image[:format])
52
+ end
53
+
54
+ def test_tiff
55
+ image = Image.new(TIFF_IMAGE_PATH)
56
+ assert_equal "tiff", image[:format].downcase
57
+ assert_equal 317, image[:width]
58
+ assert_equal 275, image[:height]
59
+ end
60
+
61
+ def test_gif_with_jpg_format
62
+ image = Image.new(GIF_WITH_JPG_EXT)
63
+ assert_equal "gif", image[:format].downcase
64
+ end
65
+
66
+ def test_image_resize
67
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
68
+ image.resize "20x30!"
69
+
70
+ assert_equal 20, image[:width]
71
+ assert_equal 30, image[:height]
72
+ assert_match(/^gif$/i, image[:format])
73
+ end
74
+
75
+ def test_image_resize_with_minimum
76
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
77
+ original_width, original_height = image[:width], image[:height]
78
+ image.resize "#{original_width + 10}x#{original_height + 10}>"
79
+
80
+ assert_equal original_width, image[:width]
81
+ assert_equal original_height, image[:height]
82
+ end
83
+
84
+ def test_image_combine_options_resize_blur
85
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
86
+ image.combine_options do |c|
87
+ c.resize "20x30!"
88
+ c.blur 50
89
+ end
90
+
91
+ assert_equal 20, image[:width]
92
+ assert_equal 30, image[:height]
93
+ assert_match(/^gif$/i, image[:format])
94
+ end
95
+
96
+ def test_exif
97
+ image = Image.from_file(EXIF_IMAGE_PATH)
98
+ assert_equal('0220', image["exif:ExifVersion"])
99
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
100
+ assert_equal('', image["EXIF:ExifVersion"])
101
+ end
102
+
103
+ def test_original_at
104
+ image = Image.from_file(EXIF_IMAGE_PATH)
105
+ assert_equal(Time.local('2005', '2', '23', '23', '17', '24'), image[:original_at])
106
+ image = Image.from_file(SIMPLE_IMAGE_PATH)
107
+ assert_nil(image[:original_at])
108
+ end
109
+ end
110
+
111
+ class CommandBuilderTest < Test::Unit::TestCase
112
+ include MiniMagick
113
+
114
+ def test_basic
115
+ c = CommandBuilder.new
116
+ c.resize "30x40"
117
+ assert_equal "-resize 30x40", c.args.join(" ")
118
+ end
119
+
120
+ def test_complicated
121
+ c = CommandBuilder.new
122
+ c.resize "30x40"
123
+ c.input 1, 3, 4
124
+ c.lingo "mome fingo"
125
+ assert_equal "-resize 30x40 -input 1 3 4 -lingo mome fingo", c.args.join(" ")
126
+ end
127
+ end
Binary file
data/test/trogdor.jpg ADDED
Binary file
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bmo-mini_magick
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.5
5
+ platform: ruby
6
+ authors:
7
+ - Brian Moran
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-28 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: This is an enhanced version of the mini_magick gem which optimizes analysis of image files.
17
+ email: bmoran@onehub.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.txt
24
+ files:
25
+ - History.txt
26
+ - Manifest.txt
27
+ - README.txt
28
+ - Rakefile
29
+ - VERSION.yml
30
+ - lib/image_temp_file.rb
31
+ - lib/mini_magick.rb
32
+ - test/actually_a_gif.jpg
33
+ - test/not_an_image.php
34
+ - test/simple.gif
35
+ - test/test_image_temp_file.rb
36
+ - test/test_mini_magick_test.rb
37
+ - test/test_tiff_small.tif
38
+ - test/trogdor.jpg
39
+ has_rdoc: true
40
+ homepage: http://github.com/bmo/mini_magick
41
+ post_install_message:
42
+ rdoc_options:
43
+ - --charset=UTF-8
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.2.0
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: A simple image manipulation library based on ImageMagick - improvments for caching
65
+ test_files:
66
+ - test/test_image_temp_file.rb
67
+ - test/test_mini_magick_test.rb