Menyimpan Hari - Mengendalikan Imej Besar dalam Pelayar" />
Seorang pelanggan memuat naik 28 imej, setiap satu sekitar 5800 x 9500 piksel dan saiz 28 MB. Apabila cuba memaparkan imej ini dalam penyemak imbas, keseluruhan tab membeku - malah enggan ditutup - selama 10 minit yang kukuh. Dan ini adalah pada mesin mewah dengan CPU Ryzen 9 dan GPU RTX 4080, bukan komputer riba kecil.
Dalam CMS (Grace Web) kami, apabila pentadbir memuat naik fail - sama ada gambar atau video - kami memaparkannya serta-merta selepas muat naik selesai. Ia bagus untuk UX - ia mengesahkan muat naik berjaya, mereka memuat naik perkara yang mereka mahu dan ia menunjukkan responsif UI untuk rasa yang lebih baik.
Tetapi dengan imej besar ini, penyemak imbas hampir tidak dapat memaparkannya dan terhenti.
Adalah penting untuk ambil perhatian bahawa masalahnya bukan pada muat naik itu sendiri tetapi dengan memaparkan imej besar ini. Memaparkan 28 imej besar secara serentak dan satu demi satu adalah terlalu banyak. Walaupun pada halaman kosong, ia hanya... tidak.
Bila-bila masa anda memaparkan gambar dalam tag, penyemak imbas melalui keseluruhan proses yang menggunakan CPU, RAM, GPU, dan kadangkala pemacu - kadangkala melalui proses ini beberapa kali sebelum gambar dipaparkan semasa pemuatan imej dan pengiraan semula reka letak. Ia melalui pengiraan piksel, pemindahan data antara perkakasan, algoritma interpolasi, dsb. Untuk penyemak imbas, ia merupakan proses yang penting.
Kami mempertimbangkan beberapa pilihan:
Kedua-dua penyelesaian ini dirasakan tidak boleh digunakan. Kami tidak mahu mengehadkan keupayaan pentadbir kami untuk memuat naik apa sahaja yang mereka perlukan, dan kami juga tidak mahu berkompromi dengan pengalaman pengguna.
Saya teringat bahawa
Kami memutuskan untuk menggantikan elemen dengan
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); };
Peningkatan adalah serta-merta dan dramatik! Penyemak imbas bukan sahaja mengendalikan 28 imej besar tanpa sebarang gangguan, tetapi kami juga meneruskannya dengan memuatkan imej 120 MB berukuran 28,000 x 17,000 piksel, dan ia masih berfungsi seolah-olah ia ialah ikon kecil.
Menggunakan
Dengan mengubah saiz imej dalam
Memandangkan kejayaan ini, kami kini mempertimbangkan untuk menggantikan dengan
Kami akan menjalankan ujian dan penanda aras untuk mengukur sebarang peningkatan prestasi. Saya pasti akan berkongsi penemuan kami dalam artikel akan datang.
Semasa menggunakan
Untuk tapak web awam, sebaiknya ubah saiz imej pada bahagian pelayan dengan betul sebelum menyampaikannya kepada pengguna. Jika anda berminat dengan cara mengautomasikan saiz semula dan pengoptimuman imej, saya menulis artikel mengenai topik itu yang mungkin anda rasa berguna.
Saya suka pengoptimuman! Walaupun kami bergerak ke arah perkakasan berprestasi tinggi tempatan setiap hari, dengan mengoptimumkan - walaupun "ia bagus, tetapi boleh menjadi lebih baik" - kami boleh menghalang isu seperti ini daripada bermula.
Pendekatan ini bukan standard. Dan saya tidak begitu mengambil berat tentang piawaian. Mereka sering dianggap sebagai peraturan yang sukar, tetapi ia hanya garis panduan. Penyelesaian ini sesuai. Kami tidak mempunyai pelanggan dengan peranti purba tanpa
Adakah anda mempunyai pengalaman yang serupa? Bagaimana anda mengendalikannya? Jangan ragu untuk berkongsi pengalaman anda atau bertanya soalan dalam ulasan di bawah!
Atas ialah kandungan terperinci Bagaimana