Rumah > hujung hadapan web > tutorial js > Mengapakah Kanvas saya `drawImage()` mengembalikan data kosong atau gagal untuk dipaparkan, dan bagaimana saya boleh membetulkannya menggunakan `onload` dan CORS?

Mengapakah Kanvas saya `drawImage()` mengembalikan data kosong atau gagal untuk dipaparkan, dan bagaimana saya boleh membetulkannya menggunakan `onload` dan CORS?

Patricia Arquette
Lepaskan: 2024-12-12 21:03:13
asal
980 orang telah melayarinya

Why is my Canvas `drawImage()` returning empty data or failing to render, and how can I fix it using `onload` and CORS?

CanvasContext2D drawImage() Conundrum: Onload and CORS

Dalam percubaan untuk melukis imej pada kanvas sebelum mendapatkan semula dataURLnya, pengguna mungkin menghadapi masalah apabila ia dikembalikan data kelihatan kosong, menyerupai rentetan yang diisi dengan aksara "A". Tambahan pula, penambahan kanvas pada dokumen mungkin gagal untuk memaparkan imej, manakala tiada ralat dilaporkan dalam konsol.

Penyelesaian Masalah

Punca isu terletak pada sifat imej tak segerak memuatkan. Untuk menyelesaikannya, seseorang mesti menggunakan pengendali acara onload elemen untuk melaksanakan operasi mengecat hanya selepas imej selesai dimuatkan.

// Create a new image
var img = new Image();

// Define a function to execute after the image has loaded
img.onload = function() {
  var canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  var context = canvas.getContext('2d');
  context.drawImage(img, 0, 0);

  // Now you can retrieve the dataURL
  var dataURL = canvas.toDataURL();
  doSomething(dataURL);
};

// Set the image source
img.src = "http://somerandomWebsite/picture.png";
Salin selepas log masuk

CORS dan Retrieval Data

Untuk kaedah context.toDataURL() dan context.getImageData berfungsi dengan betul, imej sumber mesti diambil dengan cara yang mematuhi rentas asal. Jika tidak, kanvas menjadi "tercemar", menyekat sebarang percubaan untuk mendapatkan semula data piksel.

Jika imej berasal dari pelayan yang sama dengan skrip anda, tiada masalah. Walau bagaimanapun, jika imej berada pada pelayan luaran, adalah penting untuk memastikan pelayan membenarkan akses silang asal dengan menetapkan pengepala CORS yang sesuai. Selain itu, sifat img.crossOrigin hendaklah ditetapkan kepada sama ada "guna-kredensial" untuk permintaan yang disahkan atau "tanpa nama" untuk permintaan tanpa nama.

Adalah penting untuk ambil perhatian bahawa pengepala CORS ditetapkan pada bahagian pelayan. Atribut silang asal hanya menunjukkan niat pelanggan untuk mengakses data imej menggunakan CORS. Mengelakkan sekatan CORS tidak mungkin jika konfigurasi pelayan melarangnya.

Dalam senario tertentu, sesetengah imej mungkin dihoskan pada pelayan anda manakala yang lain mungkin memerlukan CORS. Untuk mengendalikan perkara ini, pertimbangkan untuk menggunakan pengendali peristiwa onerror, yang dicetuskan apabila atribut silang asal ditetapkan kepada "tanpa nama" pada pelayan yang tidak menyokong CORS.

function corsError() {
  this.crossOrigin = "";
  this.src = "";
  this.removeEventListener("error", corsError, false);
}

img.addEventListener("error", corsError, false);
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah Kanvas saya `drawImage()` mengembalikan data kosong atau gagal untuk dipaparkan, dan bagaimana saya boleh membetulkannya menggunakan `onload` dan CORS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan