Конкатенация изображений в <canvas> [дубликат]

123
02 января 2021, 09:00
На этот вопрос уже даны ответы здесь:
Рисование массива изображений на Canvas (2 ответа)
Закрыт 1 год назад.

нужно сделать приложение для конкатенации изображений,которые берутся из 2 инпутов(в разметке должны быть только 2 инпута и канвас) и отображаются в теге canvas.На данный момент получается отображать только 1 инпут,и не понимаю как сделать для обоих картинок

let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');
let uploadedFile = document.getElementById('uploaded-file');
let uploadedFile2 = document.getElementById('uploaded-file2');

window.addEventListener('DOMContentLoaded',initImageLoader);

function initImageLoader(){
     uploadedFile.addEventListener('change',handleManualUploadedFiles);
    uploadedFile2.addEventListener('change',handleManualUploadedFiles);
        function handleManualUploadedFiles (ev){
            let file = ev.target.files[0];
            let file2 = ev.target.files[1];
            handleFile(file,file2);
        }
}
function handleFile (file,file2){
    let imageType = /image.*/;
    if(file.type.match(imageType) ){
        let reader = new FileReader();
        reader.onloadend = function(event) {
            let tempImageStore =new Image();
            tempImageStore.onload = function(ev) {
                canvas.height = ev.target.height;
                canvas.width = ev.target.width;
                context.drawImage(ev.target,0,0);
            }
            tempImageStore.src = event.target.result; 
        }
        reader.readAsDataURL(file);
    }
}
Answer 1

У Вас в принципе все правильно, только не надо менять размер канвы под размер вновь загруженной картинки и рисование я применяю со смещением чтобы было видно оба изображения, а Вы рисуете одно поверх другого

let canvas = document.getElementById('canvas'); 
let context = canvas.getContext('2d'); 
let uploadedFile = document.getElementById('uploaded-file'); 
let uploadedFile2 = document.getElementById('uploaded-file2'); 
 
 
window.addEventListener('DOMContentLoaded',initImageLoader); 
 
 
 
function initImageLoader(){ 
     uploadedFile.addEventListener('change',handleManualUploadedFiles); 
    uploadedFile2.addEventListener('change',handleManualUploadedFiles); 
 
        function handleManualUploadedFiles (ev){ 
            let file = ev.target.files[0]; 
            handleFile(this, file); 
        } 
} 
 
function handleFile (input, file){ 
    let imageType = /image.*/; 
 
    if(file.type.match(imageType) ){ 
        let reader = new FileReader(); 
        reader.onloadend = function(event) { 
            let tempImageStore =new Image(); 
            tempImageStore.onload = function(ev) { 
                context.drawImage(ev.target,input.id==="uploaded-file2"?100:0,0); 
            } 
            tempImageStore.src = event.target.result;  
        } 
        reader.readAsDataURL(file); 
    } 
}
<input type="file" id="uploaded-file"> 
<input type="file" id="uploaded-file2"><br> 
<canvas id="canvas"></canvas>

PS: Еще Вы как-то странно пытаетесь брать значения из обоих инпутов одновременно, функция handleManualUploadedFiles срабатывает по разу для каждого инпута и обрабатывает файл или файлы выбранные в одном инпуте

READ ALSO
Функция for_each в библиотеке vector

Функция for_each в библиотеке vector

Нужно выполнить задание:

134
Есть ли способ передать значение из QString в QGraphicsTextItem?

Есть ли способ передать значение из QString в QGraphicsTextItem?

Делаю график в QtНужно подписать координатные оси

111
Qt LineEdit search in the site

Qt LineEdit search in the site

В моем приложении у меня есть LineEdit и мне нужно при вводе, к примеру - "Собака" на определенном сайте выводился результат поискаПодскажите пожалуйста...

101