Files
davideisinger.com/bin/dither/dither.rb
2025-02-05 22:59:58 -05:00

51 lines
1.0 KiB
Ruby

require "sinatra"
require "mini_magick"
MiniMagick.logger.level = Logger::DEBUG
ROOT = ENV.fetch("ROOT")
KEY = ENV.fetch("KEY")
DITHER = ENV["DITHER"] != "0"
FORMAT = "png"
get "/*" do |path|
halt 404, {"Content-Type" => "text/plain"}, "not found" unless File.exist?("#{ROOT}/#{path}.enc")
content_type "image/#{FORMAT}"
geometry = params["geo"] unless params["geo"] == ""
geometry.gsub!(/\d+/) { |n| n.to_i * 2 } if geometry && !DITHER
decrypted = %x(
openssl \
aes-256-cbc \
-d \
-in #{ROOT}/#{path}.enc \
-pass file:#{KEY} \
-iter 1000000
)
convert = MiniMagick::Tool::Convert.new
convert.stdin
convert.background("white")
convert.layers("flatten")
if geometry
if geometry.match?(/^\d+x\d+$/)
convert.resize "#{geometry}^"
convert.gravity "center"
convert.extent geometry
else
convert.resize geometry
end
end
if DITHER
convert.ordered_dither "o8x8"
convert.monochrome
end
convert << "#{FORMAT.upcase}:-"
convert.call(stdin: decrypted)
end