Permalink
Cannot retrieve contributors at this time
#!/usr/bin/env ruby | |
# Make sure to 'brew install gs' before running this. | |
require 'RMagick' | |
require 'tempfile' | |
if ARGV.length != 1 | |
abort "Usage: #{$PROGRAM_NAME} /path/to/image" | |
end | |
# Make sure the file exists. | |
source = ARGV[0] | |
abort "Error: File '#{source}' not found" unless File.exist?(source) && File.file?(source) | |
# Copy it to the temp directory. | |
path = Tempfile.new('to-convert').path | |
FileUtils.cp source, path | |
# Make sure it's an image. | |
image = begin | |
Magick::Image::read(path).first | |
rescue Magick::ImageMagickError | |
abort "Error: File '#{source}' does not appear to be an image." | |
end | |
# Make sure exiftool and convert are available. | |
abort 'Error: The exiftool command does not appear to be available' if `which exiftool` == '' | |
abort 'Error: The convert command does not appear to be available' if `which convert` == '' | |
abort 'Error: the input file must be a JPEG' unless image.format == 'JPEG' | |
# Decide where we'll put the output. | |
dest_folder = File.dirname(source) | |
dest_file_base = File.basename(source, '.*') | |
dest_extention = File.extname(source) | |
# Strip all exif data. | |
`exiftool -all= #{path}` | |
# Strip color profile info. | |
FileUtils.cp path, "#{path}.convert" | |
`convert #{path}.convert +profile "*" #{path}` | |
FileUtils.rm_f "#{path}.convert" | |
# Decide on a suitable font size. | |
dimension = [image.rows, image.columns].max | |
font_size = dimension / 20 | |
# Add top / right / bottom / left text. | |
text = Magick::Draw.new | |
text.font_family = 'helvetica' | |
text.pointsize = font_size | |
text.fill = 'white' | |
text.stroke = 'black' | |
text.stroke_width = 1 | |
edge_padding = font_size / 4 | |
text.annotate(image, 0, 0, 0, edge_padding, 'top') do | |
self.gravity = Magick::NorthGravity | |
end | |
text.annotate(image, 0, 0, 0, edge_padding, 'bottom') do | |
self.gravity = Magick::SouthGravity | |
end | |
text.annotate(image, 0, 0, edge_padding, 0, 'right') do | |
self.gravity = Magick::EastGravity | |
end | |
text.annotate(image, 0, 0, edge_padding, 0, 'left') do | |
self.gravity = Magick::WestGravity | |
end | |
transformations = [ | |
{ | |
exif_tag: 0, | |
rotation_degrees: 0, | |
flop: false, | |
}, | |
{ | |
exif_tag: 1, | |
rotation_degrees: 0, | |
flop: false, | |
}, | |
{ | |
exif_tag: 2, | |
rotation_degrees: 0, | |
flop: true, | |
}, | |
{ | |
exif_tag: 3, | |
rotation_degrees: 180, | |
flop: false, | |
}, | |
{ | |
exif_tag: 4, | |
rotation_degrees: 180, | |
flop: true, | |
}, | |
{ | |
exif_tag: 5, | |
rotation_degrees: -90, | |
flop: true, | |
}, | |
{ | |
exif_tag: 6, | |
rotation_degrees: -90, | |
flop: false, | |
}, | |
{ | |
exif_tag: 7, | |
rotation_degrees: 90, | |
flop: true, | |
}, | |
{ | |
exif_tag: 8, | |
rotation_degrees: 90, | |
flop: false, | |
}, | |
] | |
transformations.each do |t| | |
tmp_image = image.dup | |
# Add centered text displaying the orientation tag number. | |
text.annotate(tmp_image, 0, 0, 0, 0, t[:exif_tag].to_s) do | |
self.gravity = Magick::CenterGravity | |
text.pointsize = font_size * 2 | |
end | |
# Rotate and transform the image. | |
tmp_image.flop! if t[:flop] | |
tmp_image.rotate! t[:rotation_degrees] if t[:rotation_degrees] != 0 | |
out_path = File.join(dest_folder, "#{dest_file_base}_#{t[:exif_tag]}#{dest_extention}") | |
tmp_image.write(out_path) | |
# Set the EXIF Orientation tag. | |
`exiftool -overwrite_original -orientation=#{t[:exif_tag]} -n #{out_path}` | |
end |