Transparentes JPG (Mit SVG)

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Nehmen wir an, Sie haben ein fotografisches Bild, das eigentlich ein JPG oder WebP sein sollte, für die beste Dateigröße und Qualität. Aber was, wenn ich auch Transparenz brauche? Brauche ich dafür nicht PNG? Wird das nicht entweder zu riesigen Dateigrößen (PNG-24) oder seltsamer Qualität (PNG-8) führen? Schauen wir uns einen anderen Weg an, der das Beste aus beiden Welten vereint.

Das ursprüngliche fotografische Bild.

Das Ziel ist es, mich selbst aus dem Bild auszuschneiden und den Hintergrund zu entfernen. Meine Technik dafür ist normalerweise, Photoshop zu verwenden und einen Beschneidungspfad manuell mit dem Zeichenstiftwerkzeug zu erstellen.

Jetzt kann ich die Umkehrung dieses Beschneidungspfades auswählen, um den Hintergrund leicht zu entfernen.

Der Versuch, dies als 1200 Pixel breites Bild als PNG-24 aus Photoshop zu speichern, ergibt ein Bild von etwa 1 MB!

1MB ist riesig :(

Wir könnten das um 75 % mit PNG-8 reduzieren, aber dann 1) erhalten wir diesen seltsamen Giffy-Look (weniger fotografisch) und 2) müssen wir eine Mattefarbe für die Ränder wählen, da wir hier keine schöne Alpha-Transparenz erhalten, sondern nur binäre Transparenz.

Viel bessere Dateigröße, aber die Qualität ist seltsam.

Gott, wenn wir einfach JPG verwenden könnten! Die Qualität und Dateigröße ist viel besser.

Aber keine Transparenz.

Aber Moment mal! Können wir das Ding nicht einfach ausschneiden? Wir haben jetzt clip-path. Nun ja... klar. Wir haben clip-path. Es kann aber keinen path() nehmen, und was wir für Vektorpunkte in Photoshop erstellt haben, sind Pfaddaten. Es könnte jedoch ein polygon() nehmen, wenn wir alle Linien gerade machen. Das ist wahrscheinlich nicht ideal (ich bin kurvig!). Oder wir könnten ein <clipPath>-Element in einem Inline-SVG erstellen und clip-path: url(#id_of_clipPath); verwenden, was einen <path> darin unterstützt.

Es gibt auch Maskierung, was eine weitere Möglichkeit ist.

Betrachten wir jedoch eine dritte Möglichkeit: Alles in <svg> packen. Das ergab für mich logischen Sinn, so dass alles zusammenbleibt und zusammen skaliert.

Der Trick ist, zwei Dinge zu machen

  1. Das JPG
  2. Der beschneidende <path>

Das JPG ist einfach genug. Geben Sie es direkt aus Photoshop aus. Optimieren.

Jetzt können wir das SVG einrichten. SVG nimmt gerne eine Rastergrafik auf. SVG ist bekannt für Vektorgrafiken, aber es ist ein sehr flexibles Bildformat.

<svg>
  <image xlink:href="/images/chris.jpg" x="0" y="0">
<svg>

Um den Pfad zu erhalten, exportieren wir den mit dem Zeichenstiftwerkzeug erstellten Pfad nach Illustrator.

Jetzt haben wir den Pfad dort und es ist einfach, ihn als SVG zu exportieren

Jetzt haben wir die benötigten Pfaddaten

Selbst mit all diesen Punkten waren es unoptimiert und unkomprimiert 1,5 KB. Nicht viel Overhead.

Verwenden wir diesen <path> innerhalb eines <clipPath> im SVG, das wir begonnen haben. Wenden Sie dann auch diesen Beschneidungspfad auf das <image> an

<svg viewBox="0 0 921.17 1409.71">
  <defs>
    <clipPath id="chris-clip">
      <path d=" ... " />
    </clipPath>
  </defs>
  <image xlink:href="/images/chris.jpg" clip-path="url(#chris-clip)" x="0" y="0" width="921" height="1409">
<svg>

Tada!

Ein transparentes JPG im Wesentlichen.