Skip to content

Instantly share code, notes, and snippets.

@jlyonsmith
Forked from richellis/Iconizer.sh
Last active December 8, 2016 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jlyonsmith/40306e3b7f17c7a0c940d7041e130522 to your computer and use it in GitHub Desktop.
Save jlyonsmith/40306e3b7f17c7a0c940d7041e130522 to your computer and use it in GitHub Desktop.
Ruby script to create iOS application icon sets from PDF files. Requires ImageMagick and GhostScript.
#!/usr/bin/env ruby
# Requires ImageMagick: http://www.imagemagick.org/
# Requires GhostScript: http://www.ghostscript.com/
require 'fileutils'
if ARGV.count < 2 then
puts "Usage: #{File.basename(__FILE__)} <pdf-file> [<pdf-file> ...] <project-folder>"
exit 1
end
pdf_files = []
(0..(ARGV.count - 2)).each do |i|
pdf_file = ARGV[i]
if File.extname(pdf_file) != ".pdf" then
puts "File #{pdf_file} does not have a '.pdf' extension"
exit 1
end
if !File.exists?(pdf_file) then
puts "error: Could not find PDF file #{pdf_file}"
exit 1
end
pdf_files.push(pdf_file)
end
proj_dir = File.join(ARGV[ARGV.count - 1])
if !Dir.exists?(proj_dir) then
puts "error: Could not find project directory #{proj_dir}"
exit 1
end
assets_dir = File.join(proj_dir, "Assets.xcassets")
if !Dir.exists?(assets_dir) then
puts "error: Could not find directory #{assets_dir} in the project directory"
exit 1
end
if `command -v convert` == '' then
puts "error: Executable 'convert' not found in path. Please install ImageMagick."
end
if `command -v gs` == '' then
puts "error: Executable 'gs' not found in path. Please install GhostScript."
end
pdf_files.each do |pdf_file|
icon_set_dir = File.join(assets_dir, File.basename(pdf_file, ".pdf")) + ".appiconset"
FileUtils.rm_rf icon_set_dir
FileUtils.mkdir icon_set_dir
puts "Creating icons from #{pdf_file} into #{icon_set_dir}"
[20, 29, 40, 58, 76, 80, 87, 120, 152, 167, 180].each do |size|
puts "Creating #{size}px icon"
`convert -density 400 #{pdf_file} -scale #{size}x#{size} #{icon_set_dir}/appicon_#{size}.png`
end
contents_json = %q({
"images":[
{ "size":"20x20", "idiom":"iphone", "filename":"appicon_40.png", "scale":"2x" },
{ "size":"20x20", "idiom":"iphone", "filename":"appicon_80.png", "scale":"3x" },
{ "size":"29x29", "idiom":"iphone", "filename":"appicon_58.png", "scale":"2x" },
{ "size":"29x29", "idiom":"iphone", "filename":"appicon_87.png", "scale":"3x" },
{ "size":"40x40", "idiom":"iphone", "filename":"appicon_80.png", "scale":"2x" },
{ "size":"40x40", "idiom":"iphone", "filename":"appicon_120.png", "scale":"3x" },
{ "size":"60x60", "idiom":"iphone", "filename":"appicon_120.png", "scale":"2x" },
{ "size":"60x60", "idiom":"iphone", "filename":"appicon_180.png", "scale":"3x" },
{ "size":"20x20", "idiom":"ipad", "filename":"appicon_20.png", "scale":"1x" },
{ "size":"20x20", "idiom":"ipad", "filename":"appicon_40.png", "scale":"2x" },
{ "size":"29x29", "idiom":"ipad", "filename":"appicon_29.png", "scale":"1x" },
{ "size":"29x29", "idiom":"ipad", "filename":"appicon_58.png", "scale":"2x" },
{ "size":"40x40", "idiom":"ipad", "filename":"appicon_40.png", "scale":"1x" },
{ "size":"40x40", "idiom":"ipad", "filename":"appicon_80.png", "scale":"2x" },
{ "size":"76x76", "idiom":"ipad", "filename":"appicon_76.png", "scale":"1x" },
{ "size":"76x76", "idiom":"ipad", "filename":"appicon_152.png", "scale":"2x" },
{ "size":"83.5x83.5", "idiom":"ipad", "filename":"appicon_167.png", "scale":"2x" },
],
"info": {
"version":1, "author":"xcode"
}
})
File.open(File.join(icon_set_dir, "Contents.json"), "w") { |file| file.write(contents_json) }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment