When trying to place generated screenshots into device frames (automated by fastlane's frameit), I discovered that, since the iPhone 14 devices have small bezels, the corners of the screenshot can be seen spilling over to outside of the template frames for these devices:
trim_devices = [
"iPhone 14 Plus",
"iPhone 14 Pro",
"iPhone 14 Pro Max",
]
I solved this by cutting the corners off of the screenshot images before running frameit
. This can be done by three ImageMagick commands, creating a rounded-rect image with 50-pixel-radius curved corners:
`convert '#{file}'
-format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 50,50'
info: > mask.mvg`
`convert '#{file}'
-alpha transparent
-background none
-fill white
-stroke none
-strokewidth 0
-draw "@mask.mvg" mask.png`
`convert '#{file}'
-alpha set
-bordercolor none
mask.png
-compose DstIn
-composite '#{file_name}'`
In my setup, I am operating in a temporary directory (with a language subdirectory, e.g. "en-US"):
Dir.mktmpdir do |tmp|
path_temp = File.join(tmp, language)
Dir.mkdir(path_temp)
puts "Operating in #{path_temp}"
num_found = 0
# ...(see below)...
end
Then for each of the devices, depending on whether it is a large iPhone 14 device or not, I either create a corner-cropped image in the temporary directory or place a copy of - or rather a symbolic link to - the original image:
path_shot = File.absolute_path(File.join(
"..", output_directory, language
))
run_devices.each do |device|
Dir.glob(File.join(path_shot, device + "-*.png")).each do |file|
file_name = File.basename(file)
Dir.chdir(path_temp) do
if trim_devices.include? device
# Cut off rounded corners using ImageMagick:
puts "Rounded frame for: #{file_name}"
`convert '#{file}' -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 50,50' info: > mask.mvg`
`convert '#{file}' -alpha transparent -background none -fill white -stroke none -strokewidth 0 -draw "@mask.mvg" mask.png`
`convert '#{file}' -alpha set -bordercolor none mask.png -compose DstIn -composite '#{file_name}'`
Dir.glob("mask.*").each { |mask| File.delete(mask) }
else
puts "Linking frame for: #{file_name}"
File.symlink(file, file_name)
end
end
num_found += 1
end
end
After adding Framefile.json
as well as any other needed files into the temporary directory, frameit
can be called to do its work there:
frame_screenshots(
use_platform: "IOS",
path: tmp
)
Thereafter the "*_framed.png" images need to be copied before the temporary directory is deleted. Here is an example where the result frames are placed in a separate "en-US_framed" directory:
path_fram = File.absolute_path(File.join(
"..", output_directory, language + "_framed"
))
Dir.glob(File.join(path_temp, "*_framed.png")).each do |file|
file_name = File.basename(file).sub(/_framed/, "")
puts "Frame generated: #{file_name}"
FileUtils.cp(file, File.join(path_fram, file_name))
end