Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Open Graph-Bilderzeugung in Rails mit SVG-Vorlagen

Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Als Vorlage zur Generierung von JPG-Bildern habe ich SVG gewählt, aufgrund der Einfachheit und der schnellen Verarbeitung dieses Formats. Zum Beispiel bietet HTML als Vorlage mehr Möglichkeiten, ist jedoch komplexer in der Umsetzung und Wartung.
Die Aufgabe besteht darin, ein JPG-Bild für die OpenGraph-Markup (dies ist das Bild/Vorschaubild für einige soziale Netzwerke) zu generieren. Die Rails-Anwendung läuft auf Heroku. Der RAM ist nicht sehr groß, daher muss die Bildgenerierungsaufgabe irgendwo ausgelagert werden. Es macht keinen Sinn, Sidekiq für ein Pet-Projekt einzurichten und dafür zu bezahlen. Eine gute Option für mich war der Heroku Scheduler. Dieses standardmäßige (kostenlose) Addon wird unsere Rake-Task nach einem Zeitplan (einmal täglich) ausführen. Die Aufgabe wird die Beiträge finden, die noch kein OG-Bild haben, und sie generieren und anhängen (ActiveStorage wird verwendet, das Bild wird auf AWS hochgeladen) an das Modell.
Das erste, was zu tun ist, ist, die SVG-Vorlage zu erstellen. Zuerst spielen wir mit SVG. Das OG-Bild sollte 1200px x 630px groß sein.
So wird die SVG-Vorlage ungefähr aussehen:
<svg width="1200" height="630" viewBox="0 0 1200 630" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <!-- Hintergrund -->
  <rect width="1200" height="630" fill="black"/>
  <rect x="56" y="56" width="1088" height="518" rx="13" stroke="white" fill="black" stroke-width="13"/>
  
  <!-- Überschrift -->
  <text x="160" y="150" fill="white" font-size="50px" font-weight="bold" line-height="1.2" margin="0">
    Artikel Titel
  </text>

  <!-- Autor -->
  <text x="160" y="510" fill="white" font-size="30px">
    Autorenname
  </text>

  <!-- URL der Website -->
  <text x="860" y="510" fill="white" font-size="30px">
    website url
  </text>
</svg>
Diese Vorlage hat keine Variablen. Die Variablen werden im .erb-Template interpretiert. Wir fügen diese SVG-Vorlage in unsere Rails-Anwendung ein und geben ihr die Erweiterung .erb, zum Beispiel lib/templates/og_image_template.svg.erb.
Ich verwende die Bibliothek mini_magick. Daher habe ich bereits in der Gemfile:
gem "mini_magick"
Nun der Code selbst lib/cover_image_generator.rb.
require 'mini_magick'
require 'erb'

module CoverImageGenerator
  class Generator
    def generate_and_attach(entry, entry_title)
      begin
        # Dynamisch das SVG-Template ausfüllen
        @entry_title = entry_title.truncate(160)
        @blog_name = entry.blog.slug
        svg_template = File.read(File.expand_path('./templates/cover_image_template.svg.erb', __dir__))
        svg_content = ERB.new(svg_template).result(binding)
        
        # Erstellen Sie ein MiniMagick-Bild aus dem SVG-Inhalt
        cover_image = MiniMagick::Image.read(svg_content)

        # In JPG konvertieren
        cover_image.format('jpg')
        temp_file_path = entry.slug + '.jpg'
        cover_image.write(temp_file_path)

        # Bild an den Eintrag anhängen
        entry.cover_image.attach(io: File.open(temp_file_path), filename: "#{entry.slug}.jpg", content_type: 'image/jpeg')

        # Temporäre Datei löschen
        File.delete(temp_file_path)
      rescue => e
        # Hier wird es wahrscheinlich Probleme mit Texten geben, die spezielle Zeichen enthalten, die nicht in JPG konvertiert werden können.
        # Solche Titel ignoriere ich vorerst - ich muss eine Lösung für dieses Problem finden.
        # Derzeit, wenn das Modell kein hinzugefügtes OG-Bild hat, zeige ich das Standardbild an.
        puts "Fehler bei: #{@entry_title}, ID: #{entry.id}"
        puts e
        puts "=========================================="
      end
      puts "Bild angehängt an: #{@entry_title}, ID: #{entry.id}"
      puts "=========================================="
    end
  end
end
AWS ist bereits eingerichtet und alles, was zu tun ist, ist, cover_image zu unserem Modell (zum Beispiel Topic) hinzuzufügen.
# app/models/topic.rb
has_one_attached :cover_image
Unsere SVG-Vorlage muss unsere Variablen rendern. Außerdem müssen wir, unter Berücksichtigung der Eigenschaften der SVG-Dateistile, lange Titel in mehrere Zeilen aufteilen.
<svg width="1200" height="630" viewBox="0 0 1200 630" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <!-- Hintergrund -->
  <rect width="1200" height="630" fill="black"/>
  <rect x="56" y="56" width="1088" height="518" rx="13" stroke="white" fill="black" stroke-width="13"/>
  
  <!-- Mehrzeilige Überschrift -->
  <text x="160" y="110" fill="white" font-size="50px" font-weight="bold" line-height="1.2" margin="0">
    <% lines = @entry_title.scan(/\S.{0,34}\S(?=\s|\z)/) %>
    <% lines.each_with_index do |line, index| %>
      <tspan x="160" dy="<%= index == 0 ? '1.5em' : '1.2em' %>"><%= line.strip %></tspan>
    <% end %>
  </text>

  <!-- Blogname -->
  <text x="160" y="510" fill="white" font-size="30px">
    <%= @blog_name %>
  </text>

  <!-- URL der Website -->
  <text x="860" y="510" fill="white" font-size="30px">
    tseivo.com
  </text>
</svg>
Und schließlich zur Generierung des Bildes:
topic = Topic.last
CoverImageGenerator::Generator.new.generate_and_attach(topic, topic.name)
Dieser Code muss in die Rake-Task eingefügt werden, die durchläuft und OG-Bilder für alle erforderlichen Objekte generiert. Dieser Code kann auch verwendet werden, um ein Bild nach der Erstellung oder Aktualisierung (des Titels) eines Objekts zu generieren.
Das Ergebnis:
Приклад створеного JPEG з SVG шаблону
Приклад створеного JPEG з SVG шаблону
Dieses Beispiel für Code/Konzept ist nicht die endgültige Version. Es gibt noch viel zu tun.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

29. Dez, 10:22 Uhr

Was ist automatische Spracherkennung (ASR)?

meme code
meme code@memecode
29. Dez, 10:30 Uhr

Was ist NLP? Wozu dient die Verarbeitung natürlicher Sprache?

meme code
meme code@memecode
29. Dez, 10:37 Uhr

Was ist Chat GPT? Wozu dient es und wie funktioniert es?

meme code
meme code@memecode
29. Dez, 10:48 Uhr

Was ist KI? Was bedeutet "mit KI generiert"?

meme code
meme code@memecode
03. Jan, 13:16 Uhr

Ein Fehler ist aufgetreten, während tiny_tds (2.1.5) installiert wurde, und Bundler kann auf dem Mac mit M1 nicht fortfahren.

meme code
meme code@memecode
10. Jan, 19:41 Uhr

[Eigene Erfahrung] MacBook friert ein. Schaltet sich überhaupt nicht ein oder der Bildschirm schaltet sich sofort aus.

meme code
meme code@memecode
10. Feb, 16:08 Uhr

Was ist Hot Potato (Heiße Kartoffel) in der Softwareentwicklung?

meme code
meme code@memecode
05. Mär, 19:17 Uhr

Was ist Skalierbarkeit?

meme code
meme code@memecode
05. Mär, 19:18 Uhr

Was bedeutet HA (Hochverfügbarkeit)?

meme code
meme code@memecode
05. Mär, 19:29 Uhr

Was ist der Unterschied zwischen Hochverfügbarkeit und Skalierbarkeit?

meme code
meme code@memecode
05. Mär, 19:38 Uhr

Was ist Service Discovery in der IT?

meme code
meme code@memecode
07. Mär, 18:36 Uhr

Was ist Clustering in der IT?

meme code
meme code@memecode