Saya bekerja dengan elemen kanvas dengan tinggi 600
hingga 1000
piksel dan lebar beberapa puluh atau ratusan ribu piksel. Namun, setelah sejumlah piksel (jelas tidak diketahui), kanvas tidak lagi menampilkan bentuk yang saya gambar dengan JS.
Adakah yang tahu jika ada batasan?
Telah diuji di Chrome 12 dan Firefox 4.
javascript
html
canvas
seriusdev
sumber
sumber
tens OR hundreds of thousands
...Jawaban:
Diperbarui 13/10/2014
Semua browser yang diuji memiliki batasan tinggi / lebar elemen kanvas, tetapi banyak browser juga membatasi total area elemen kanvas. Batasannya adalah sebagai berikut untuk browser yang dapat saya uji:
Chrome:
Tinggi / lebar maksimum: 32.767 piksel
Area maksimum: 268.435.456 piksel (mis., 16.384 x 16.384)
Firefox:
Tinggi / lebar maksimum: 32.767 piksel
Area maksimum: 472.907.776 piksel (mis., 22.528 x 20.992)
YAITU:
Tinggi / lebar maksimum: 8.192 piksel
Area maksimum: N / A
IE Mobile:
Tinggi / lebar maksimum: 4.096 piksel
Area maksimum: N / A
Lain:
Saya tidak dapat menguji browser lain saat ini. Lihat jawaban lain di halaman ini untuk batasan tambahan.
Melebihi panjang / lebar / area maksimum pada kebanyakan browser membuat kanvas tidak dapat digunakan. (Ini akan mengabaikan perintah gambar apa pun, bahkan di area yang dapat digunakan.) IE dan IE Mobile akan menghormati semua perintah gambar dalam ruang yang dapat digunakan.
sumber
<canvas>
elemen yang ditumpuk dan secara otomatis menerapkan instruksi gambar ke konteks yang sesuai.Saya mengalami kesalahan memori di Firefox dengan tinggi kanvas lebih dari 8000, chrome tampaknya menangani jauh lebih tinggi, setidaknya hingga 32000.
EDIT: Setelah menjalankan beberapa tes lagi, saya menemukan beberapa kesalahan yang sangat aneh dengan Firefox 16.0.2.
Pertama, saya tampaknya mendapatkan perilaku yang berbeda dari dalam kanvas memori (dibuat dalam javascript) sebagai lawan dari kanvas yang dinyatakan html.
Kedua, jika Anda tidak memiliki tag html dan meta charset yang tepat, kanvas mungkin dibatasi ke 8196, jika tidak, Anda bisa naik ke 32767.
Ketiga, jika Anda mendapatkan konteks kanvas 2d dan kemudian mengubah ukuran kanvas, Anda mungkin dibatasi ke 8196 juga. Cukup mengatur ukuran kanvas sebelum mengambil konteks 2d memungkinkan Anda memiliki hingga 32767 tanpa mendapatkan kesalahan memori.
Saya belum bisa mendapatkan kesalahan memori secara konsisten, terkadang hanya pada pemuatan halaman pertama, dan kemudian perubahan tinggi berikutnya berfungsi. Ini adalah file html yang saya uji dengan http://pastebin.com/zK8nZxdE .
sumber
Ukuran kanvas maksimal iOS (lebar x tinggi):
diuji pada Maret 2014.
sumber
Untuk memperluas sedikit tentang jawaban @FredericCharette: Sesuai panduan konten safari di bawah bagian "Ketahui Batas Sumber Daya iOS":
Oleh karena itu, variasi ukuran apa pun dari 5242880 (5 x 1024 x 1024) piksel akan berfungsi pada perangkat memori besar, jika tidak maka 3145728 piksel.
Contoh untuk kanvas 5 megapiksel (lebar x tinggi):
dan seterusnya..
Kanvas SQUARE terbesar adalah ("MiB" = 1024x1024 Bytes):
sumber
Pembaruan untuk 2018:
Seiring berjalannya waktu, batasan kanvas telah berubah. Sayangnya, yang tidak berubah adalah fakta bahwa browser masih belum memberikan informasi mengenai batasan ukuran canvas melalui Canvas API.
Bagi mereka yang ingin menentukan secara terprogram ukuran kanvas maksimum browser atau menguji dukungan untuk dimensi kanvas khusus, lihat ukuran kanvas .
Dari dokumen:
Tautan demo dan hasil pengujian tersedia di README , serta bagian masalah umum yang menyentuh pertimbangan kinerja dan mesin virtual.
Pengungkapan penuh, saya penulis perpustakaan. Saya membuatnya kembali pada tahun 2014 dan baru-baru ini mengunjungi kembali kode untuk proyek terkait kanvas baru. Saya terkejut menemukan kekurangan alat yang sama untuk mendeteksi batasan ukuran kanvas pada tahun 2018 jadi saya memperbarui kode, merilisnya, dan berharap ini membantu orang lain mengalami masalah serupa.
sumber
Menurut spesifikasi w3 , antarmuka lebar / tinggi adalah panjang tanpa tanda tangan - jadi 0 hingga 4.294.967.295 (jika saya ingat nomor itu dengan benar - mungkin ada beberapa).
EDIT: Anehnya, dikatakan unsigned long, tetapi pengujiannya hanya menunjukkan nilai long normal sebagai max: 2147483647. Jsfiddle - 47 berfungsi tetapi hingga 48 dan kembali ke default.
sumber
Meskipun kanvas memungkinkan Anda untuk meletakkan height = 2147483647, ketika Anda mulai menggambar, tidak akan terjadi apa-apa
Menggambar terjadi hanya jika saya mengembalikan tinggi ke 32767
sumber
iOS memiliki batasan yang berbeda.
Dengan menggunakan simulator iOS 7 saya dapat menunjukkan batasnya adalah 5MB seperti ini:
tetapi jika saya mendorong ukuran kanvas hingga satu baris piksel:
sumber
Di PC-
Saya tidak berpikir ada batasan tetapi ya Anda bisa keluar dari pengecualian memori.
Di perangkat Seluler-
Berikut adalah batasan kanvas untuk perangkat seluler: -
Ukuran maksimum elemen kanvas adalah 3 megapiksel untuk perangkat dengan RAM kurang dari 256 MB dan 5 megapiksel untuk perangkat dengan RAM lebih besar atau sama dari 256 MB.
Jadi misalnya - jika Anda ingin mendukung perangkat keras Apple yang lebih lama, ukuran kanvas Anda tidak boleh melebihi 2048 × 1464.
Semoga sumber daya ini akan membantu Anda menarik diri.
sumber
Batasan untuk Safari (semua platform) jauh lebih rendah.
Batasan iOS / Safari yang Diketahui
Misalnya, saya memiliki buffer kanvas 6400x6400px dengan data yang ditarik ke dalamnya. Dengan menelusuri / mengekspor konten dan dengan mengujinya di browser lain, saya dapat melihat bahwa semuanya baik-baik saja. Tapi di Safari, itu akan melewatkan gambar buffer khusus ini ke konteks utama saya.
sumber
Saya mencoba untuk secara terprogram mencari tahu batasnya: mengatur ukuran kanvas mulai dari 35000, turun 100 hingga ukuran yang valid ditemukan. Di setiap langkah tulis piksel kanan bawah dan kemudian membacanya. Ini bekerja - dengan hati-hati.
Kecepatan diterima jika salah lebar atau tinggi diatur untuk beberapa nilai rendah (misalnya 10-200.) Dengan cara ini:
get_max_canvas_size('height', 20)
.Tetapi jika disebut tanpa lebar atau tinggi seperti
get_max_canvas_size()
, kanvas yang dibuat sangat besar sehingga pembacaan warna piksel TUNGGAL sangat lambat, dan di IE menyebabkan hang yang serius.Jika tes seperti ini dapat dilakukan bagaimanapun tanpa membaca nilai piksel, kecepatannya akan dapat diterima.
Tentu saja cara termudah untuk mendeteksi ukuran maksimum adalah dengan cara asli untuk menanyakan lebar dan tinggi maksimum. Tapi Canvas adalah 'standar hidup', jadi mungkin itu akan datang suatu hari nanti.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Hati-hati! Browser Anda mungkin macet!)
sumber
Saat Anda menggunakan kanvas WebGL, browser (termasuk yang desktop) akan memberlakukan batasan ekstra pada ukuran buffer yang mendasarinya. Meskipun kanvas Anda besar, misalnya 16.000x16.000, sebagian besar browser akan membuat gambar yang lebih kecil (katakanlah 4096x4096), dan memperbesarnya. Itu mungkin menyebabkan pixelating jelek, dll.
Saya telah menulis beberapa kode untuk menentukan ukuran maksimum menggunakan pencarian eksponensial, jika ada yang membutuhkannya.
determineMaxCanvasSize()
adalah fungsi yang Anda minati.Juga di jsfiddle https://jsfiddle.net/1sh47wfk/1/
sumber
Anda dapat memotongnya dan dalam javascript otomatis menambahkan kanvas kecil sebanyak yang diperlukan dan menggambar elemen di kanvas yang sesuai. Anda mungkin masih akan kehabisan memori pada akhirnya, tetapi Anda akan mendapatkan batas kanvas tunggal.
sumber
Saya tidak tahu cara mendeteksi ukuran maksimum yang mungkin tanpa itterasi, tetapi Anda dapat mendeteksi apakah ukuran kanvas tertentu berfungsi dengan mengisi piksel dan kemudian membaca warnanya kembali. Jika kanvas belum di-render maka warna yang Anda dapatkan tidak akan cocok. W
kode parsial:
sumber