Frage

Ich bin mit Libelle Miniaturbild in einer Rails-Anwendung zu generieren.

Ich diene alle Bilder Bilder als JPG ist. Jetzt ist der Client lädt transparente PNG-Dateien, wie diese:

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

Dragonfly verwendet RMagick diese Bilder in JPG-Dateien zu konvertieren. Das Problem ist, dass es die PNG-Bilder in JPG-Dateien mit einem schwarzen Hintergrund umwandelt, und meine Website-Design erfordert einen weißen Hintergrund. Ich habe versucht, es so außer Kraft zu setzen:

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

Aber die erzeugten JPG-Bilder noch einen schwarzen Hintergrund enthalten. Wer weiß, wie RMagick in mit einem weißen Hintergrund zu schlagen, wenn die transparente Schicht Umwandlung?

Ich weiß, ich könnte genauso PNG dienen, aber dann sind die Bilder 10 mal so groß ist, und die Seite ist schon ziemlich Bandbreite schwer.

War es hilfreich?

Lösung

Sie können einen Abbildungsliste erstellen zu können, ein weißes Bild mit der gleichen Größe wie das Originalbild unter dem transparenten Bild setzen. Wenn Sie die Abbildungsliste nach unten auf ein Bild glätten, Sie ein Bild mit der transparenten Farbe ersetzt bekommen, was auch immer das zweite Bild enthalten ist.

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

für mich Dies funktioniert aber weiter optimiert werden kann, denke ich.

Ich hoffe, das hilft! Hendrik

Andere Tipps

Wenn jemand anderes das gleiche Problem hat, war ich nicht in der Lage, herauszufinden, wie dies durch RMagick zu tun. Ich habe jetzt eine Lösung mit der Befehlszeile ImageMagick (convert) geschrieben:

  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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top