Некорректно определяется ширина и высота изображения
В обработчике
$('#usrpfile').on("change", function() {изменения элемента <input id="usrpfile" type="file"не всегда корректно определяется ширина и высота изображения. То верно, то неверно, искажая пропорции рисунка выводимого в соответствующем контейнере. Для небольших файлов, например 37 Кб, возвращает габариты неверно, как бы не 'успевает' возвращать правильную ширину-realWidthPic и высоту-realHeightPic. Поэтому использовал сначала метод setTimeout, вроде заработало. Затем понадобилось на время определения ширины и высоты прятать рисунок, и вновь его отображать после установки подогнанных размеров. Скрытие и отображение при этом стало работать ( с точки зрения корректного определения ширины и высота рисунка) и без setTimeout. То есть проблема как бы решена, просто остались сомнения что какое-либо сочетание размеров файла и периода их обработки может вылезти боком. Прошу подсказать обоснованы ли эти сомнения и верно ли в принципе такое решение? $('#usrpfile').on("change", function(){ // #1, при изменении <input id="usrpfile" type="file"> file = this.files[0]; // Получаем файл из <input type="file") - элемент массива files[0] // вставка контейнеров, img и ссылки 'удалить' $("<div class='occupiedImgCont'><div class='occupiedImg-wrapper'><img id='usrpPhoto' src='' /></div><div class ='clear'></div><div class='userpic-del'><a class='del_usrp' href='#'>Удалить фото</a></div></div>").insertBefore($('.emptyImgCont')); uploadImage = $('#usrpPhoto'); // пустой объект <img id='usrpPhoto' var oReaderUploadPic = new FileReader(); // объект FileReader oReaderUploadPic.onload = (function() { // #C return function(e) { // #B uploadImage.attr('src', e.target.result); uploadImage.hide(); // скрываем рис. на время определения его ширины и высоты // setTimeout (function(){ // отсрочка 10 мс realWidthPic = uploadImage.width(); // ширина изображения (px) realHeightPic = uploadImage.height(); // высота изображения (px) ratioPic = realWidthPic / realHeightPic; // ширина и высота контейнера изображения var imgContWidth = $('.occupiedImg-wrapper').width()-6, imgContHeight = $('.occupiedImg-wrapper').height()-6; // Подгонка размера загруженной картинки под контейнер if (realWidthPic > realHeightPic) { if ((imgContWidth/ratioPic) <= imgContHeight) { fittedWidthPic = imgContWidth; fittedHeightPic = fittedWidthPic / ratioPic; } else { fittedHeightPic = imgContHeight; fittedWidthPic = fittedHeightPic * ratioPic; } } else { fittedHeightPic = imgContHeight; fittedWidthPic = fittedHeightPic * ratioPic; } // установка подогнанных размеров изображения uploadImage.height(fittedHeightPic); uploadImage.width(fittedWidthPic); uploadImage.show(); // }, 10); // отсрочка выполнения на 10мс, можно даже поставить 0-эффект тот же }; // end #B })(); // end #C oReaderUploadPic.readAsDataURL(file); // считываем текущий image file как data URL }); // end#1 |
setTimeout не пойдет, нужно обрабатывать окончание загрузки изображения. Или же - oReaderUploadPic.readAsDataURL(file) возвращает все данные о файле, а зная какого формата изображение, можно из этих данных получить данные только заголовка файла, в котором указано и его разрешение.
|
Часовой пояс GMT +3, время: 07:25. |