2010-05-31 189 views
4

我使用Dragonfly在Rails应用程序中生成缩略图图像。将透明PNG转换为JPG时覆盖透明度颜色

我以JPG格式提供所有图片图片。现在的客户端上传透明的PNG文件,像这样的:

http://www.ibanez.co.jp/products/images/eg2010/ART120_TRF_12_02.png

蜻蜓使用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?

我知道我可以作为PNG,但是然后图像是10倍大,并且该网站已经很宽带。

回答

9

您可以创建一个ImageList,能够把一个白色的图像具有相同大小的原始图像透明像素之下。如果将ImageList平铺到图像上,则会获得透明颜色替换为任何第二个图像所包含的图像。

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 

这适用于我,但可以进一步优化,我猜。

希望有帮助! Hendrik

+0

工程就像一个魅力!很抱歉,迟到接受。 – 2010-10-17 16:45:23

0

如果其他人有同样的问题,我无法弄清楚如何通过RMagick做到这一点。我现在写使用命令行的ImageMagick(转换)的解决方案:

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