Ich habe einen DIV-Container mit einem Bild als Hintergrundbild festgelegt (durch URL angegeben). Gibt es eine Möglichkeit, dieses Hintergrundbild in Canvas neu zu zeichnen (ohne den Server erneut zu kontaktieren oder erneut herunterzuladen - da das Inhaltsbild einmalig angezeigt wird)?Render-Hintergrundbild auf Canvas
Antwort
Ja. Sie können die URL des Hintergrundbildes erhalten, fordern Sie die Bilddatei als Blob
, erstellen Sie ein <img>
Element, setzen src
-Blob URL
der Reaktion, bei load
Fall erstellt img
Element Anruf .drawImage()
mit img
als ersten Parameter.
Das Hintergrundbild kann je nach Browsereinstellungen zwischengespeichert werden. Wenn das Bild nicht im Browser zwischengespeichert wird, können Sie zuerst ein Bild anfordern und dann css
background-image
und <canvas>
mit einer einzigen Anforderung festlegen. zu setzen src
von <img>
-.result
von FileReader
bei load
Ereignis
Sie können fetch()
oder XMLHttpResponse()
verwenden background-image
url()
, FileReader.prototype.readAsDataURL()
FileReader()
, beantragen.
Sie können auch URL.createObjectURL()
verwenden, um eine Blob URL
von response
Blob
zu erstellen. URL.revokeObjectURL()
, um die Blob URL
zu widerrufen.
prüfen Network
Registerkarte DevTools
oder Developer Tools
, sollte das Bild
(from cache)
#bg {
width:50px;
height:50px;
background-image:url(http://placehold.it/50x50);
}
<div id="bg"></div>
<br>
<canvas id="canvas" width="50px" height="50px"></canvas>
<script>
window.onload = function() {
var bg = document.getElementById("bg");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image;
img.width = canvas.width;
img.height = canvas.height;
img.onload = (e) => ctx.drawImage(e.target,0,0);
var background = getComputedStyle(bg).getPropertyValue("background-image");
var src = background.replace(/^url|["()]/g, "");
var reader = new FileReader;
reader.onload = (e) => img.src = e.target.result;
fetch(src)
.then(response => response.blob())
.then(blob => {
reader.readAsDataURL(blob);
// const url = URL.createObjectURL(blob); img.src = url;
})
}
</script>
- 1. FabricJS Canvas auf einem anderen FabricJS Canvas
- 2. Bitmaps auf Canvas überlappen
- 3. HTML-Canvas-Bilder - Zeichnung Multi-Canvas-Bild auf einer Seite
- 4. Zeichne Strichlinie auf einem Canvas
- 5. FabricJS AngularJS Ereignisse auf Canvas
- 6. Raster auf HTML5-Canvas rendern
- 7. Perfect Center auf WPF Canvas
- 8. nicht zeichnen EditText auf Canvas
- 9. Bitmap auf Android-Canvas drehen
- 10. Eine DrawingVisual auf Canvas anzeigen
- 11. Canvas Neustart auf Knopf klicken
- 12. Canvas senkrechte Punkte auf Linie
- 13. Python Tkinter Canvas in Canvas
- 14. canvas drawBildqualität
- 15. Nativescripte Canvas
- 16. Canvas drawImage Absturz auf große Bilder
- 17. Canvas toBlob funktioniert nicht auf iPhone Safari?
- 18. Cursor: Zeiger auf Hover html5 canvas Element
- 19. Speichern als Verhalten auf HTML-Canvas überschreiben
- 20. Zeichnen Sie Base64-Video auf Canvas?
- 21. Falsche Koordinaten auf SVG Canvas Konvertierung
- 22. Warum reagiert touchmove nicht auf HTML Canvas?
- 23. Blättern auf <canvas> aktivieren Element
- 24. ID für Objekte auf JavaFX Canvas setzen
- 25. Wie zeichne gefüllte Dreieck auf Android Canvas
- 26. Klicken Sie auf Veranstaltung im Canvas?
- 27. Canvas Position basierend auf einem anderen Element
- 28. Upload 'Canvas' Bilddaten auf den Server
- 29. Einschränkung der Bildlauffunktion auf HTML5-Canvas-Elementen
- 30. Hinzufügen von Listener auf Canvas-Punkten
Wird diese Methode Kontakt mit dem Server abgerufen werden? Oder behandeln Browser es intern? Das Bild, das ich versuche zu erhalten, wird pro Anfrage generiert –
Es hängt von den Browsereinstellungen ab. Im Allgemeinen sendet der Browser keine weitere Anforderung für ein zwischengespeichertes Bild. Wenn der Cache deaktiviert ist, können Sie die Antwort aus einer einzelnen Anfrage verwenden, um sowohl das Hintergrundbild als auch das Bild auf Canvas zu setzen. _ "Das Bild, das ich versuche zu erhalten, wird pro Anfrage generiert" _ Wie wird das Bild angefordert? Können Sie "html", "javascript", das Sie versucht haben, Problem bei Frage zu lösen? – guest271314
Ich zeige die dritte Partyseite an, die nur Hintergrundbilder verwendet, um Bilder zu dispayieren (sie benutzen nie IMG-Tag). Mein Ziel ist es, alle Bilder (mit Hilfe von Canvas) herunterzuladen, aber ich kann es mir nicht leisten, den Server erneut zu kontaktieren, da es ein anderes Bild zurückgibt (für die gleiche Bild-URL; jedes angezeigte Bild hat eine eindeutige URL, aber die erneute Kontaktaufnahme führt zu einem neues Bild) –