image_proc 0.1.0 → 0.1.1
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/.gemtest +0 -0
- data/History.txt +6 -0
- data/Manifest.txt +0 -0
- data/README.txt +1 -1
- data/Rakefile +1 -4
- data/init.rb +0 -0
- data/lib/image_proc.rb +71 -53
- data/test/input/horizontal.gif +0 -0
- data/test/input/horizontal.jpg +0 -0
- data/test/input/horizontal.png +0 -0
- data/test/input/vertical.gif +0 -0
- data/test/input/vertical.jpg +0 -0
- data/test/input/vertical.png +0 -0
- data/test/resize_test_helper.rb +0 -0
- data/test/test_geom.rb +0 -0
- data/test/test_image_proc.rb +0 -0
- metadata +18 -15
data/.gemtest
ADDED
|
File without changes
|
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
|
File without changes
|
data/README.txt
CHANGED
|
@@ -14,7 +14,7 @@ A no-frills image resizer, with pluggable backends. No extra software required o
|
|
|
14
14
|
|
|
15
15
|
(The MIT License)
|
|
16
16
|
|
|
17
|
-
Copyright (c) 2009 Julik Tarkhanov <me@julik.nl>
|
|
17
|
+
Copyright (c) 2009-2011 Julik Tarkhanov <me@julik.nl>
|
|
18
18
|
|
|
19
19
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
20
20
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
|
@@ -2,9 +2,6 @@ require 'rubygems'
|
|
|
2
2
|
require 'hoe'
|
|
3
3
|
require './lib/image_proc.rb'
|
|
4
4
|
|
|
5
|
-
Hoe.
|
|
6
|
-
p.description = 'A no-frills image metadata and resizing'
|
|
5
|
+
Hoe.spec('image_proc') do |p|
|
|
7
6
|
p.developer('Julik', 'me@julik.nl')
|
|
8
|
-
p.rubyforge_name = 'wiretap'
|
|
9
|
-
p.remote_rdoc_dir = 'image_proc'
|
|
10
7
|
end
|
data/init.rb
CHANGED
|
File without changes
|
data/lib/image_proc.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
|
|
1
3
|
# A simplistic interface to shell-based image processing. Pluggable, compact and WIN32-incompatible by
|
|
2
4
|
# design. Sort of like the Processors in attachment_fu but less. Less.
|
|
3
5
|
#
|
|
@@ -6,10 +8,8 @@
|
|
|
6
8
|
#
|
|
7
9
|
# The whole idea is: a backend does not have to support cropping (we don't do it), it has only to be able to resize,
|
|
8
10
|
# and a backend should have 2 public methods. That's the game.
|
|
9
|
-
require 'open3'
|
|
10
|
-
|
|
11
11
|
class ImageProc
|
|
12
|
-
VERSION = '0.1.
|
|
12
|
+
VERSION = '0.1.1'
|
|
13
13
|
|
|
14
14
|
class Error < RuntimeError; end
|
|
15
15
|
class MissingInput < Error; end
|
|
@@ -21,6 +21,18 @@ class ImageProc
|
|
|
21
21
|
|
|
22
22
|
HARMLESS = []
|
|
23
23
|
class << self
|
|
24
|
+
|
|
25
|
+
# Run a block without warnings
|
|
26
|
+
def keep_quiet
|
|
27
|
+
o = $VERBOSE
|
|
28
|
+
begin
|
|
29
|
+
$VERBOSE = nil
|
|
30
|
+
yield
|
|
31
|
+
ensure
|
|
32
|
+
$VERBOSE = o
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
24
36
|
# Assign a specific processor class
|
|
25
37
|
def engine=(kls); @@engine = kls; end
|
|
26
38
|
|
|
@@ -220,7 +232,7 @@ class ImageProc
|
|
|
220
232
|
error = err.read.to_s.strip
|
|
221
233
|
result = outp.read.strip
|
|
222
234
|
unless self.class::HARMLESS.select{|warning| error =~ warning }.any?
|
|
223
|
-
raise Error, "Problem
|
|
235
|
+
raise Error, "Problem: #{error}" unless error.nil? || error.empty?
|
|
224
236
|
end
|
|
225
237
|
[inp, outp, err].map{|socket| begin; socket.close; rescue IOError; end }
|
|
226
238
|
result
|
|
@@ -228,66 +240,72 @@ class ImageProc
|
|
|
228
240
|
|
|
229
241
|
end
|
|
230
242
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
243
|
+
ImageProc.keep_quiet do
|
|
244
|
+
class ImageProcConvert < ImageProc
|
|
245
|
+
HARMLESS = [/unknown field with tag/]
|
|
246
|
+
def process_exact
|
|
247
|
+
wrap_stderr("convert -resize #{@target_w}x#{@target_h}! #{@source} #{@dest}")
|
|
248
|
+
end
|
|
236
249
|
|
|
237
|
-
|
|
238
|
-
|
|
250
|
+
def get_bounds(of)
|
|
251
|
+
wrap_stderr("identify #{of}").scan(/(\d+)x(\d+)/)[0].map{|e| e.to_i }
|
|
252
|
+
end
|
|
239
253
|
end
|
|
240
254
|
end
|
|
241
255
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
256
|
+
ImageProc.keep_quiet do
|
|
257
|
+
class ImageProcRmagick < ImageProc
|
|
258
|
+
def get_bounds(of)
|
|
259
|
+
run_require
|
|
260
|
+
comp = wrap_err { Magick::Image.ping(of)[0] }
|
|
261
|
+
res = comp.columns, comp.rows
|
|
262
|
+
comp = nil; return res
|
|
263
|
+
end
|
|
249
264
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
end
|
|
256
|
-
private
|
|
257
|
-
def run_require
|
|
258
|
-
require 'RMagick' unless defined?(Magick)
|
|
265
|
+
def process_exact
|
|
266
|
+
run_require
|
|
267
|
+
img = wrap_err { Magick::Image.read(@source).first }
|
|
268
|
+
img.scale(@target_w, @target_h).write(@dest)
|
|
269
|
+
img = nil # deallocate the ref
|
|
259
270
|
end
|
|
271
|
+
private
|
|
272
|
+
def run_require
|
|
273
|
+
require 'RMagick' unless defined?(Magick)
|
|
274
|
+
end
|
|
260
275
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
276
|
+
def wrap_err
|
|
277
|
+
begin
|
|
278
|
+
yield
|
|
279
|
+
rescue Magick::ImageMagickError => e
|
|
280
|
+
raise Error, e.to_s
|
|
281
|
+
end
|
|
266
282
|
end
|
|
267
|
-
|
|
283
|
+
end
|
|
268
284
|
end
|
|
269
285
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
286
|
+
ImageProc.keep_quiet do
|
|
287
|
+
class ImageProcSips < ImageProc
|
|
288
|
+
# -Z pixelsWH --resampleHeightWidthMax pixelsWH
|
|
289
|
+
FORMAT_MAP = { ".tif" => "tiff", ".png" => "png", ".tif" => "tiff", ".gif" => "gif" }
|
|
290
|
+
HARMLESS = [/XRefStm encountered but/, /CGColor/]
|
|
291
|
+
def process_exact
|
|
292
|
+
fmt = detect_source_format
|
|
293
|
+
wrap_stderr("sips -s format #{fmt} --resampleHeightWidth #{@target_h} #{@target_w} #{@source} --out '#{@dest}'")
|
|
294
|
+
end
|
|
278
295
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
296
|
+
def get_bounds(of)
|
|
297
|
+
wrap_stderr("sips #{of} -g pixelWidth -g pixelHeight").scan(/(pixelWidth|pixelHeight): (\d+)/).to_a.map{|e| e[1].to_i}
|
|
298
|
+
end
|
|
282
299
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
300
|
+
private
|
|
301
|
+
def detect_source_format
|
|
302
|
+
suspected = FORMAT_MAP[File.extname(@source)]
|
|
303
|
+
suspected = (suspected.nil? || suspected.empty?) ? 'jpeg' : suspected
|
|
304
|
+
case suspected
|
|
305
|
+
when "png", "gif"
|
|
306
|
+
raise FormatUnsupported, "SIPS cannot resize indexed color GIF or PNG images, call Apple if you want to know why"
|
|
307
|
+
end
|
|
308
|
+
return suspected
|
|
290
309
|
end
|
|
291
|
-
|
|
292
|
-
end
|
|
310
|
+
end
|
|
293
311
|
end
|
data/test/input/horizontal.gif
CHANGED
|
File without changes
|
data/test/input/horizontal.jpg
CHANGED
|
File without changes
|
data/test/input/horizontal.png
CHANGED
|
File without changes
|
data/test/input/vertical.gif
CHANGED
|
File without changes
|
data/test/input/vertical.jpg
CHANGED
|
File without changes
|
data/test/input/vertical.png
CHANGED
|
File without changes
|
data/test/resize_test_helper.rb
CHANGED
|
File without changes
|
data/test/test_geom.rb
CHANGED
|
File without changes
|
data/test/test_image_proc.rb
CHANGED
|
File without changes
|
metadata
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: image_proc
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
4
|
+
prerelease:
|
|
5
|
+
version: 0.1.1
|
|
5
6
|
platform: ruby
|
|
6
7
|
authors:
|
|
7
8
|
- Julik
|
|
@@ -9,20 +10,20 @@ autorequire:
|
|
|
9
10
|
bindir: bin
|
|
10
11
|
cert_chain: []
|
|
11
12
|
|
|
12
|
-
date:
|
|
13
|
-
default_executable:
|
|
13
|
+
date: 2011-06-28 00:00:00 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: hoe
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
prerelease: false
|
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
19
|
+
none: false
|
|
20
20
|
requirements:
|
|
21
21
|
- - ">="
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version:
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
version: 2.9.4
|
|
24
|
+
type: :development
|
|
25
|
+
version_requirements: *id001
|
|
26
|
+
description: A no-frills image resizer, with pluggable backends. No extra software required on OS X
|
|
26
27
|
email:
|
|
27
28
|
- me@julik.nl
|
|
28
29
|
executables: []
|
|
@@ -49,8 +50,10 @@ files:
|
|
|
49
50
|
- test/resize_test_helper.rb
|
|
50
51
|
- test/test_geom.rb
|
|
51
52
|
- test/test_image_proc.rb
|
|
52
|
-
|
|
53
|
+
- .gemtest
|
|
53
54
|
homepage: http://wiretap.rubyforge.org/image_proc
|
|
55
|
+
licenses: []
|
|
56
|
+
|
|
54
57
|
post_install_message:
|
|
55
58
|
rdoc_options:
|
|
56
59
|
- --main
|
|
@@ -58,23 +61,23 @@ rdoc_options:
|
|
|
58
61
|
require_paths:
|
|
59
62
|
- lib
|
|
60
63
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
|
+
none: false
|
|
61
65
|
requirements:
|
|
62
66
|
- - ">="
|
|
63
67
|
- !ruby/object:Gem::Version
|
|
64
68
|
version: "0"
|
|
65
|
-
version:
|
|
66
69
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
|
+
none: false
|
|
67
71
|
requirements:
|
|
68
72
|
- - ">="
|
|
69
73
|
- !ruby/object:Gem::Version
|
|
70
74
|
version: "0"
|
|
71
|
-
version:
|
|
72
75
|
requirements: []
|
|
73
76
|
|
|
74
|
-
rubyforge_project:
|
|
75
|
-
rubygems_version: 1.
|
|
77
|
+
rubyforge_project: image_proc
|
|
78
|
+
rubygems_version: 1.8.5
|
|
76
79
|
signing_key:
|
|
77
|
-
specification_version:
|
|
80
|
+
specification_version: 3
|
|
78
81
|
summary: A no-frills image resizer, with pluggable backends
|
|
79
82
|
test_files:
|
|
80
83
|
- test/test_geom.rb
|