image_magick 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f1238d359da65f317337c1f46bb262a46310c0bd
4
+ data.tar.gz: bd1d2486006961063c5e3bd05f144b39dffc597f
5
+ SHA512:
6
+ metadata.gz: 07638049dc66a828b8d7d36c0ab72426ba5ec1b3405074f8d14d5a66cbc348573a79950634f4688ec3790d60ccdf04294e8f8a37959937def34f7f658942b529
7
+ data.tar.gz: 93c0f259910e4c350ec29526910c5aebc18588073b4bf9f93642ffb4e13655602201cec97805ad0e58d3b817cfb9623340b0f2c6667d205767062d961365af70
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ Prerequisites: before this gem will work, "Image Magick" must be installed
2
+ on your computer.
3
+
4
+ On a Mac:
5
+ Given that you are using brew, use this command:
6
+
7
+ 'brew install imagemagick'
8
+
9
+ I wrote this for my spouse, who needed to resize scanned artwork for various
10
+ art websites, such as 'etsy', 'artpal', and 'art.com'. Each of these sites has
11
+ specific requirements for file size, format (png, tif, and jpg), or pixel
12
+ dimensions. There are a few hard-coded parts of the script, that don't hamper
13
+ my use of it, but that I should bring to attention.
14
+
15
+ Execute the script like this
16
+ shrink ./path/to/image [--size 100] [--type tif]
17
+
18
+ You only need to provide image. Size and type are defaulted to 100 megabytes
19
+ and tif respectively.
20
+
21
+
22
+ The output files are hard-coded to be placed in an 'out' directory, at the same
23
+ level as the image. For example, if we're working with a file called
24
+ ~/images/myimage.tif
25
+ the output file will be in
26
+ ~/images/out/myimage.tif
27
+
28
+ The script is very primitive; it runs the 'identify' command to find out
29
+ the size of the image. the 'image' class will respond to things like 'size',
30
+ 'width', and 'length'.
31
+
32
+ the 'shrink' algorithm is also fairly primitive. It iteratively tries
33
+ different sizes, using a binary search algorithm to find the best fit that
34
+ is as close to the maximum size as possible, without exceeding that size.
35
+
36
+ Run ./bin/shrink.rb -h
37
+
38
+ Example usage:
39
+ ./bin/shrink.rb ./image.tif [--size=100] [--type=png]
40
+ to see command line arguments
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/shrink ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ require_relative '../lib/image_magick/image_magick'
6
+
7
+ type = '.tif'
8
+ new_size = 100
9
+ OptionParser.new do |opt|
10
+ opt.on('--size SIZE') { |o| new_size = o.to_f }
11
+ opt.on('--type TYPE') { |o| type = "." + o }
12
+ opt.on('-h') { |o| puts o ; exit }
13
+ opt.parse!
14
+ end
15
+
16
+ file = ARGV.shift
17
+
18
+ p @new_size
19
+
20
+ ImageMagick.shrink(file,new_size,type)
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'image_magick/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "image_magick"
8
+ spec.version = ImageMagick::VERSION
9
+ spec.authors = ["Timothy Nordloh"]
10
+ spec.email = ["tnordloh@gmail.com"]
11
+
12
+ spec.summary = %q{A simple interface on Image Magick, for shrinking images.}
13
+ spec.description = <<-EOS
14
+ This is a very trivial implementation of an interface for Image Magick. It
15
+ relies on the binaries for Image Magic (identify and convert) to be available
16
+ on the system, and to be in the $PATH. I wrote this for my spouse, who needed
17
+ to resize scanned artwork for various art websites, such as 'etsy', 'artpal',
18
+ and 'art.com'. Each of these sites has specific requirements for file size,
19
+ format (png, tif, and jpg), or pixel dimensions. There are a few hard-coded
20
+ parts of the script, that don't hamper my use of it, but that I should bring
21
+ to attention.
22
+ Execute the script like this
23
+ shrink ./path/to/image [--size 100] [--type tif]
24
+
25
+ You only need to provide image. Size and type are defaulted to 100 megabytes
26
+ and tif respectively.
27
+
28
+
29
+ The script is very primitive; it runs the 'identify' command to find out
30
+ the size of the image. the 'image' class will respond to things like 'size',
31
+ 'width', and 'length'.
32
+
33
+ the 'shrink' algorithm is also fairly primitive. It iteratively tries
34
+ different sizes, using a binary search algorithm to find the best fit that
35
+ is as close to the maximum size as possible, without exceeding that size.
36
+ EOS
37
+ spec.homepage = "https://github.com/tnordloh/image_magick"
38
+
39
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
40
+ # delete this section to allow pushing this gem to any host.
41
+ if spec.respond_to?(:metadata)
42
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
43
+ else
44
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
45
+ end
46
+
47
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
48
+ spec.bindir = "exe"
49
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
50
+ spec.require_paths = ["lib"]
51
+
52
+ spec.add_development_dependency "bundler", "~> 1.9"
53
+ spec.add_development_dependency "rake", "~> 10.0"
54
+ end
@@ -0,0 +1,47 @@
1
+ module ImageMagick
2
+ class Image
3
+
4
+ require 'pathname'
5
+ require_relative '../image_magick'
6
+
7
+ def initialize(file)
8
+ ImageMagick.exists?
9
+ @image = file
10
+ image_data
11
+ end
12
+
13
+ attr_accessor :width, :length, :size
14
+
15
+ def output_dir(out: "/out")
16
+ output_dir = File.dirname(@image) + out
17
+ Dir.mkdir(output_dir) unless File.exists?(output_dir)
18
+ p output_dir
19
+ end
20
+
21
+ def image_data
22
+ @fields = identify.split(/\s+/)
23
+ fields = identify.split(/\s+/)
24
+ @width,@length = fields[2].split('x').map {|x| x.to_i}
25
+ @size = fields[6][/^\d+\.*\d*/].to_f
26
+ end
27
+
28
+ def identify
29
+ @identify ||= `identify #{@image}`
30
+ end
31
+
32
+ def name
33
+ @name ||= Pathname.new(@fields[0].split('[')[0])
34
+ end
35
+
36
+ def shortname
37
+ name.basename(name.extname)
38
+ end
39
+
40
+ def compress(type: '.tif', test: false, newsize: 1.0 )
41
+ new_file = output_dir + "/" + shortname.to_s + type
42
+ p command = "convert #{name} -resize #{newsize} -compress lzw #{new_file}"
43
+ test == true ? "#{command}" : `#{command}`
44
+ self.class.new(new_file)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ module Shrink
2
+
3
+ require_relative 'image'
4
+
5
+ def self.shrink(file,size,type)
6
+
7
+ temp_file="./temp.#{type}"
8
+
9
+ p "file exists?"
10
+ p File.exist?(file)
11
+ original_image = Image.new(file)
12
+
13
+ p original_image
14
+ image = original_image.compress(newsize: original_image.width, type: type)
15
+ exit if image.size < @new_size
16
+
17
+ low = 0
18
+ high = original_image.width
19
+
20
+ while (high - low) > 1 do
21
+ @try_size = ( high + low ) / 2
22
+ p "low: #{low}, high #{high}, try #{@try_size}"
23
+ p "reducing to (#{@try_size})"
24
+ image = original_image.compress(newsize: @try_size, type: type)
25
+ p image.size
26
+ if image.size < @new_size
27
+ low = @try_size
28
+ else
29
+ high = @try_size
30
+ end
31
+ end
32
+
33
+ if image.size > @new_size
34
+ image = original_image.compress(newsize: high - 1, type: type)
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module ImageMagick
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,43 @@
1
+ require_relative 'image_magick/version'
2
+
3
+ module ImageMagick
4
+
5
+ require 'mkmf'
6
+
7
+ require_relative 'image_magick/image'
8
+
9
+ def self.exists?
10
+ raise RuntimeError,"convert binary doesn't exist" unless !!find_executable('convert')
11
+ raise RuntimeError,"identify binary doesn't exist" unless !!find_executable('identify')
12
+ end
13
+
14
+ def self.shrink(file,size,type)
15
+
16
+ temp_file="./temp.#{type}"
17
+ original_image = ImageMagick::Image.new(file)
18
+
19
+ p original_image
20
+ image = original_image.compress(newsize: original_image.width, type: type)
21
+ p image
22
+ exit if image.size < size
23
+
24
+ low = 0
25
+ high = original_image.width
26
+
27
+ while (high - low) > 1 do
28
+ @try_size = ( high + low ) / 2
29
+ image = original_image.compress(newsize: @try_size, type: type)
30
+ p image.size
31
+ if image.size < size
32
+ low = @try_size
33
+ else
34
+ high = @try_size
35
+ end
36
+ end
37
+
38
+ if image.size > size
39
+ image = original_image.compress(newsize: high - 1, type: type)
40
+ end
41
+
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: image_magick
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Timothy Nordloh
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: " This is a very trivial implementation of an interface for Image Magick.
42
+ \ It\n relies on the binaries for Image Magic (identify and convert) to be available\n
43
+ \ on the system, and to be in the $PATH. I wrote this for my spouse, who needed\n
44
+ \ to resize scanned artwork for various art websites, such as 'etsy', 'artpal',\n
45
+ \ and 'art.com'. Each of these sites has specific requirements for file size,\n
46
+ \ format (png, tif, and jpg), or pixel dimensions. There are a few hard-coded\n
47
+ \ parts of the script, that don't hamper my use of it, but that I should bring\n
48
+ \ to attention.\n Execute the script like this\n shrink ./path/to/image [--size
49
+ 100] [--type tif]\n \n You only need to provide image. Size and type are defaulted
50
+ to 100 megabytes\n and tif respectively.\n\n\n The script is very primitive; it
51
+ runs the 'identify' command to find out\n the size of the image. the 'image' class
52
+ will respond to things like 'size', \n 'width', and 'length'. \n\n the 'shrink'
53
+ algorithm is also fairly primitive. It iteratively tries \n different sizes, using
54
+ a binary search algorithm to find the best fit that\n is as close to the maximum
55
+ size as possible, without exceeding that size.\n"
56
+ email:
57
+ - tnordloh@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - README.md
64
+ - Rakefile
65
+ - bin/shrink
66
+ - image_magick.gemspec
67
+ - lib/image_magick.rb
68
+ - lib/image_magick/image.rb
69
+ - lib/image_magick/shrink.rb
70
+ - lib/image_magick/version.rb
71
+ homepage: https://github.com/tnordloh/image_magick
72
+ licenses: []
73
+ metadata:
74
+ allowed_push_host: https://rubygems.org
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.2.2
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: A simple interface on Image Magick, for shrinking images.
95
+ test_files: []