Heim > Web-Frontend > js-Tutorial > Wie den Tag gerettet hat – Umgang mit großen Bildern im Browser

Wie den Tag gerettet hat – Umgang mit großen Bildern im Browser

DDD
Freigeben: 2024-12-03 01:48:14
Original
593 Leute haben es durchsucht

How <canvas>Rettete den Tag – Umgang mit großen Bildern im Browser“ />Rettete den Tag – Umgang mit großen Bildern im Browser“ /></p><p>Ein Kunde hat 28 Bilder hochgeladen, jedes ungefähr <strong>5800 x 9500 Pixel</strong> und <strong>28 MB</strong> groß. Beim Versuch, diese Bilder im Browser anzuzeigen, fror der gesamte Tab für <strong>10 Minuten</strong> ein und weigerte sich sogar, ihn zu schließen. Und das auf einem High-End-Computer mit einer Ryzen 9-CPU und einer RTX 4080-GPU, nicht auf einem winzigen Laptop.</p>

<h2>
  
  
  Hier ist die Situation
</h2>

<p>Wenn ein Administrator in unserem CMS (Grace Web) eine Datei hochlädt – sei es ein Bild oder ein Video – zeigen wir diese sofort nach Abschluss des Uploads an. Es ist großartig für UX – es bestätigt, dass der Upload erfolgreich war, dass hochgeladen wurde, was sie beabsichtigt haben, und es zeigt die Reaktionsfähigkeit der Benutzeroberfläche für ein besseres Gefühl.</p>

<p>Aber bei diesen riesigen Bildern konnte der Browser sie kaum anzeigen und fror ein.</p>

<p>Es ist wichtig zu beachten, dass das Problem nicht beim Hochladen selbst lag, sondern bei der <strong>Anzeige dieser großen Bilder</strong>. 28 riesige Bilder gleichzeitig und einzeln zu rendern, war einfach zu viel. Selbst auf einer leeren Seite ist es einfach... nein.</p>

<h3>
  
  
  Warum ist das passiert (Deep Dive)?
</h3>

<p>Jedes Mal, wenn Sie ein Bild in einem <img> Tag durchläuft der Browser einen ganzen Prozess, der die CPU, den RAM, die GPU und manchmal auch das Laufwerk beansprucht – manchmal durchläuft er diesen Prozess sogar mehrere Male, bevor das Bild beim Laden des Bildes und bei der Neuberechnung des Layouts angezeigt wird. Dabei werden Pixel berechnet, Daten zwischen Hardware übertragen, Algorithmen interpoliert usw. Für einen Browser ist das ein wichtiger Prozess.</p>

<h2>
  
  
  Die Brainstorming-Lösungen
</h2>

<p>Wir haben mehrere Optionen in Betracht gezogen:</p>

<ol>
<li>
<strong>Größe sofort nach dem Hochladen ändern und Miniaturansicht anzeigen</strong>

<ul>
<li>
<strong>Problem</strong>: Die Größenänderung kann zu lange dauern und erfolgt nicht garantiert sofort, insbesondere wenn die Größenänderungswarteschlange nicht leer ist – das führt dazu, dass das System nicht reagiert.</li>
</ul>
</li>
<li>
<strong>Überprüfen Sie die Dateigröße und zeigen Sie bei großen Dateien nur deren Namen an</strong>

<ul>
<li>
<strong>Problem</strong>: Dies würde das Benutzererlebnis beeinträchtigen, insbesondere für diejenigen, die eine stärkere Kontrolle und Überprüfung des Medienmaterials benötigen (übrigens handelt es sich dabei häufig um dieselben Medien mit großen Dateien).</li>
</ul>
</li>
</ol>

<p>Keine dieser Lösungen fühlte sich brauchbar an. Wir wollten die Möglichkeit unserer Administratoren nicht einschränken, alles hochzuladen, was sie brauchten, und wir wollten auch keine Kompromisse bei der Benutzererfahrung eingehen.</p><h2>
  
  
  Glühbirne! Mit <canvas>
</h2>

<p>Ich habe mich daran erinnert, dass die <Leinwand> Element nutzt die GPU viel effektiver zum Rendern von Inhalten. Ich habe kürzlich gesehen, wie jemand ein ziemlich komplexes Spiel mit JavaScript und <canvas> erstellt hat, sodass es theoretisch große Bilder effizienter verarbeiten sollte als <img>.</p>

<h3>
  
  
  Testen der Theorie
</h3>

<p>Wir haben beschlossen, das <img> Elemente mit <canvas> zur Anzeige der hochgeladenen Bilder. Hier ist der Codeausschnitt, den wir verwendet haben:<br>
</p>

<pre class=const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); // img.src = URL.createObjectURL(file); // Use this if you're working with uploaded files img.src = filesroot + data.file_path; // Our existing file path img.onload = function() { // Resize canvas to desired size (for preview) canvas.width = 80 * (img.width / img.height); // Adjust scaling as needed canvas.height = 80; // Draw the image onto the canvas, resizing it in the process ctx.drawImage(img, 0, 0, canvas.width, canvas.height); file_div.innerHTML = ''; // Prepared <div> in UI to display the thumbnail file_div.appendChild(canvas); };

Die Ergebnisse

Die Verbesserung war sofort und dramatisch! Der Browser verarbeitete nicht nur die 28 großen Bilder ohne Probleme, wir haben ihn auch noch weiter gesteigert, indem wir 120-MB-Bilder mit den Maßen 28.000 x 17.000 Pixel geladen haben, und es funktionierte immer noch so, als ob es so wäre war ein kleines Symbol.

Wo ist der Unterschied?

Mit der Funktion Element, die Zeichnung liegt vollständig in den Händen der GPU, und diese Chips sind buchstäblich für diese Aufgabe gemacht.

  • Versucht immer noch, 28.000 * 17.000 = 476.000.000 Pixel zu rendern.
  • Diese zeichnet nur 80 * 80 = 6.400 Pixel.

Durch die Größenänderung des Bildes innerhalb der Auf eine kleine Vorschaugröße reduzieren wir die Datenmenge, die der Browser verarbeiten muss, drastisch – senden Sie Hunderte Millionen Pixel an die GPU und erhalten Sie Tausende zurück, ein tolles Angebot, oder?

Nächste Schritte

Angesichts dieses Erfolgs denken wir jetzt darüber nach, mit in anderen Teilen unserer Anwendung, insbesondere in Admin-Bildschirmen, auf denen etwa 250 Bilder gleichzeitig angezeigt werden. Obwohl die Größe dieser Bilder bereits korrekt ist, sind wir gespannt, ob die Verwendung von kann eine noch bessere Leistung bieten.

Wir führen Tests und Benchmarking durch, um etwaige Leistungssteigerungen zu messen. Ich werde unsere Erkenntnisse auf jeden Fall in einem zukünftigen Artikel teilen.

Wichtige Vorbehalte

Bei der Verwendung von Da dies für unseren speziellen Anwendungsfall Wunder gewirkt hat, muss ich beachten, dass Sie nicht verwenden sollten. zum Anzeigen von Bildern auf öffentlich zugänglichen Teilen von Websites. Hier ist der Grund:

  • Barrierefreiheit: Elemente sind für Bildschirmlesegeräte lesbar und helfen sehbehinderten Benutzern.
  • SEO: Suchmaschinen indizieren Bilder von Tags, die die Sichtbarkeit Ihrer Website verbessern können. (Auf die gleiche Weise „indizieren“ auch KI-Trainings-Scraper die Bilder. Nun, was können Sie tun ...)
  • mit kann verwendet werden, um die Pixeldichte automatisch zu erkennen und größere oder kleinere Bilder für eine perfekte Passform anzuzeigen – kippen. Ich habe einen Artikel darüber geschrieben, wie Sie Ihr .
  • erstellen

Bei öffentlichen Websites ist es am besten, die Größe der Bilder auf der Serverseite richtig zu ändern, bevor sie den Benutzern bereitgestellt werden. Wenn Sie daran interessiert sind, wie Sie die Größenänderung und Optimierung von Bildern automatisieren können, habe ich einen Artikel zu diesem Thema geschrieben, der für Sie möglicherweise nützlich sein könnte.

Abschluss

Ich liebe Optimierung! Auch wenn wir jeden Tag auf lokale Hochleistungshardware umsteigen, können wir durch Optimierung – auch wenn „es gut ist, aber besser sein kann“ – solche Probleme verhindern Anfang.

Dieser Ansatz ist kein Standard. Und ich halte nicht viel von Standards. Sie werden oft als strenge Regeln behandelt, sind aber lediglich Richtlinien. Diese Lösung passt. Wir haben keine Kunden mit alten Geräten ohne solide Unterstützung. Auch wenn wir jetzt mehr Code verwalten müssen und mehrere Möglichkeiten zum Anzeigen von Bildern haben, passt es perfekt, und das ist es, worauf es ankommt!

Haben Sie ähnliche Erfahrungen? Wie bist du damit umgegangen? Teilen Sie gerne Ihre Erfahrungen mit oder stellen Sie Fragen in den Kommentaren unten!

">

Das obige ist der detaillierte Inhalt vonWie den Tag gerettet hat – Umgang mit großen Bildern im Browser. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Vorheriger Artikel:Löscht der „delete“-Operator von JavaScript tatsächlich Objekte? Nächster Artikel:Wie kann ich einen String verwenden, um dynamisch auf JavaScript-Variablen zuzugreifen und diese zu ändern?
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage