透明なPNGをJPGに変換するときに、透明性の色をオーバーライドします
-
05-10-2019 - |
質問
私は使用しています トンボ Railsアプリでサムネイル画像を生成します。
私はJPGとしてすべての画像を提供しています。これで、クライアントはこのような透明なPNGファイルをアップロードしています。
http://www.ibanez.co.jp/products/images/eg2010/art120_trf_12_02.png
DragonflyはRmagickを使用してこれらの画像をJPGに変換します。問題は、PNG画像を黒い背景でJPGに変換することであり、私のサイトのデザインには白い背景が必要です。私はこのようにそれをオーバーライドしようとしました:
encoded_image = Magick::Image.from_blob(image.data).first
if encoded_image.format.downcase == format
image # do nothing
else
encoded_image.format = format
encoded_image.background_color = "white"
encoded_image.transparent_color = "white"
encoded_image.to_blob
end
しかし、生成されたJPG画像にはまだ黒い背景が含まれています。透明な層を変換するときに、Rmagickをbeatる方法を白い背景を使用する方法を知っている人はいますか?
私はPNGとして機能することができることを知っていますが、画像は10倍大きく、サイトはすでにかなり重いです。
解決
イメージリストを作成して、透明な画像の下に元の画像と同じサイズの白い画像を配置できるようにできます。イメージリストを画像に平らにすると、2番目の画像が含まれるものに置き換えられた透明な色の画像が表示されます。
img_list = Magick::ImageList.new
img_list.read("my_png_file.png")
img_list.new_image(img_list.first.columns, img_list.first.rows) { self.background_color = "white" } # Create new "layer" with white background and size of original image
image = img_list.reverse.flatten_images
これは私にとってはうまくいきますが、さらに最適化することができると思います。
それが役立つことを願っています!ヘンドリック
他のヒント
他の誰かが同じ問題を抱えている場合、私はRmagickを通じてこれを行う方法を理解することができませんでした。コマンドラインImageMagick(Convert)を使用してソリューションを作成しました。
if encoded_image.format.downcase == "png"
temp_file = Tempfile.new(image.object_id)
encoded_image.write("png:" + temp_file.path)
encoded_image.destroy!
system "convert -flatten \"#{temp_file.path}\" \"jpg:#{temp_file.path}\""
encoded_image = Magick::Image.read(temp_file.path)[0]
temp_file.delete
else
所属していません StackOverflow