1

Я использую FileReader + Canvas для ресайза и отображения изображения. Не отображается превью изображения в IE и Firefox (отображается только в хроме), хотя если поставить alert перед записью base64 в src все работает корректно во всех браузерах. setTimeout и img.onload не помогает, поэтому сомневаюсь что это из-за тайминга.

function preview(file, area) { //принимает с input type="file" данные и область в которую отображать данные
        if (file.type.match(/image.*/)) {
            var className = area.className;
            var reader = new FileReader();
            reader.addEventListener("load", function(event) {
                var img = document.createElement("img");
                img.src = event.target.result; // на этом этапе отображает корректно, но без ресайза
                //alert(1); // с этим алёртом все работает
                img.alt = file.name;
                img.className = "takeImg";
                area.innerHTML = "";
                if( className.indexOf('first') != -1 ) {
                    img = cropImg(img);
                    area.appendChild(img);
                } else if ......... и.т.д

function cropImg(img) {
    var canvas = document.createElement("canvas");
    var needW = 1000;
    var needH = 622;
    var w = (img.naturalWidth - needW)/2;
    var h = (img.naturalHeight - needH)/2;
    canvas.width = needW;
    canvas.height = needH;
    var ctx = canvas.getContext('2d');
    for (var i = 5; i > 1.1; i -= 0.05) {
        if((img.naturalWidth >= (needW * i)) && (img.naturalHeight >= (needH * i))) {
            ctx.drawImage(img, 0,0,(needW * i),(needH * i),0,0,1000,622);
            break;
        } else {
            ctx.drawImage(img, w,h,1000,622,0,0,1000,622);
        }
    }
    var dataURL = canvas.toDataURL("image/png");
    img.src = dataURL;
    return img;
}
Light
  • 11
  • Возможно вам будет полезен ответ на этот вопрос: http://ru.stackoverflow.com/questions/565211/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D1%8D%D0%BA%D0%B7%D0%B5%D0%BC%D0%BF%D0%BB%D1%8F%D1%80%D0%B0-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-image-%D0%B8-%D0%BF%D1%80%D0%B8%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0-img-src-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82-%D0%BF%D1%80%D0%B8%D0%BE%D0%B1%D1%80/565467#565467 – Утка Учится Укрываться Sep 12 '16 at 13:31
  • Ну то есть я отлаживаться не лез, это надо нормально отдебажить, но чутье мне говорит что это из-за асинхронной загрузки изображений – Утка Учится Укрываться Sep 12 '16 at 13:32
  • Допили код до сниппета. – Qwertiy Sep 12 '16 at 13:33
  • @Утка, от души брат, помог. Главное ставил setTimeout и img.onload, но крайняя степень аутизма мешает даже правильную мысль реализовать) – Light Sep 12 '16 at 14:19
  • @Light, ну проблемы с пониманием асинхронности возникают по началу у всех, не волнуйтесь) – Утка Учится Укрываться Sep 12 '16 at 14:22

0 Answers0