2013-03-19 9 views
27

Buduję rozmiar obrazu/przycinanie, a chciałbym wyświetlić podgląd na żywo po ich edycji w trybie modalnym (ładowanie początkowe). Myślę, że ten powinien działać, ale po prostu dostaję 0 w console.log. To wymaga karmienia szerokość i wysokość obrazu oryginalnego do innego skryptu (co zrobię potem wystarczy je console.log/zmienną na razie)Uzyskiwanie szerokości i wysokości obrazu za pomocą filereadera

function doProfilePictureChangeEdit(e) { 
    var files = document.getElementById('fileupload').files[0]; 
    var reader = new FileReader(); 
    reader.onload = (function(theFile) { 
     document.getElementById('imgresizepreview').src = theFile.target.result; 

     document.getElementById('profilepicturepreview').src = theFile.target.result; 
     } 
    ); 
    reader.readAsDataURL(files); 
    var imagepreview = document.getElementById('imgresizepreview'); 
    console.log(imagepreview.offsetWidth); 
    $('img#imgresizepreview').imgAreaSelect({ 
     handles: true, 
     enable: true, 
     aspectRatio: "1:1", 
     onSelectEnd: preview 
    }); 
    $('#resizeprofilepicturemodal').modal('show'); 
    }; 

Odpowiedz

70

Trzeba czekać na obrazie załadować. Spróbuj obsłużyć element wewnątrz .onload.

Uprościliśmy także proces ustawiania źródła dwóch elementów na sposób, w jaki powinno się to robić (z jQuery).

reader.onload = (function(theFile) { 
    var image = new Image(); 
    image.src = theFile.target.result; 

    image.onload = function() { 
     // access image size here 
     console.log(this.width); 

     $('#imgresizepreview, #profilepicturepreview').attr('src', this.src); 
    }; 
}); 
+0

Wielki, dzięki bardzo. Byłem źle poinformowany, że pliki będą ładowane wywołaniem readAsDataURL. –

+1

'reader.onload' jest wywoływane po zakończeniu odczytu systemu plików z dysku twardego. 'image.onload' jest nazywane zasadniczo, gdy w zasadzie obiekt obrazu buforował dane obrazu w przeglądarce. Widzę, jak mogłeś źle zinterpretować funkcje onload; cieszę się, że mogę pomóc. –

+1

Uwaga: Działa to tylko wtedy, gdy używasz "read.readAsDataURL". Z "read.readAsBinaryString" musisz przejść inną drogę. –

15

Dla mnie rozwiązanie Austin nie działa, więc przedstawiam jeden pracował dla mnie:

var reader = new FileReader; 

reader.onload = function() { 
    var image = new Image(); 

    image.src = reader.result; 

    image.onload = function() { 
     alert(image.width); 
    }; 

}; 

reader.readAsDataURL(this.files[0]); 

A jeśli okaże się, że zadanie image.src = reader.result; następuje po image.onload nieco przewodowej , Ja też tak myślę.

+0

Nie jest podłączone, że ładowanie obrazu jest asynchroniczne. Wszystkie dane w src muszą zostać zdekodowane, jeśli src jest łączem, które musi zostać załadowane i zdekodowane do obrazu, jeśli również base64. Jest to całkiem naturalne :-) – BrightShadow

+0

@BrightShadow to jest poprawna odpowiedź. –

0

w ten sposób mam dla angularjs

  fileReader.readAsDataUrl($scope.file, $scope).then(function(result) { 
 
       var image = new Image(); 
 
       image.src = result; 
 
       image.onload = function() { 
 
        console.log(this.width); 
 
       }; 
 
       $scope.imageSrc = result; //all I wanted was to find the width and height 
 

 

 
      });

Powiązane problemy