2016-03-20 22 views
1

İstenen Sonuç: Bir dosya yükleme formundan bir resim seçmek, küçük resme ölçeklemek ve görüntülemek için arıyorum.Resimden ölçekleme [type = dosya]

Sorun: Aşağıdaki kod tam olarak istediğim şeyi yapar, ancak dosyayı bir kez değil, resim önizlemesini görmek için iki kez seçmem gerekir. (Görüntü seç, ekran yok, aynı görüntüyü seç, ölçeklendirilmiş ekrana sahip olurum) Her şey el ile & yüksekliğini manuel olarak atadığımda harika çalışıyordu, ancak şimdi ölçeklendiriyordum - bu sorun başladı. Bir kod incelemesine ihtiyacım var! If/if else/else ifadesini açıkladığımda ve img.width & img.height değerini manuel olarak atadığımda, her ikisi de 75 olacak şekilde ekrana bakıyorum. Bu makaleyi takip https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/ çalıştı ve ben aynı sorun var -

previewFiles = function (file, i) { 

    preview = function (file) { 

     // Make sure `file.name` matches our extensions criteria 
     switch (/\.(jpe?g|png|gif)$/i.test(file.name)) { 
      case true: 
       var reader = new FileReader(); 
       reader.onload = function (e) { 
        var img = new Image(); 
        img.src = reader.result; 
        var width = img.width, 
          height = img.height, 
          max_size = 75; 

        if (width <= max_size && height <= max_size) { 
         var ratio = 1; 
        } else if (width > height) { 
         var ratio = max_size/width; 
        } else { 
         var ratio = max_size/height; 
        } 

        img.width = Math.round(width * ratio); 
        img.height = Math.round(height * ratio); 
        img.title = file.type; 
        $('div.box.box-primary').find('span.prev').eq(i).append(img); 
       }; 
       reader.readAsDataURL(file); 
       break; 
      default: 
       $('div.box.box-primary').find('span.prev').eq(i).append('<a class="btn btn-app" href="#"><span class="vl vl-bell-o"></span> Unsupported File</a>'); 
       break; 
     } 
    }; 
    preview(file); 
}; 

Biraz ölçeklendirme kadar değişen var. Sorun, tuval kullanmıyorum gerçeğinden kaynaklanıyor mu? Ben çok yeni w/jQuery & javascript - Burada herhangi bir yardım büyük takdir!

+0

Merhaba. FileReader'ı hiç kullanmamıştım. Garip bulduğum bir şey, eğer yanılıyorsam beni affet. Bu satırda '' img.src = reader.result; 'reader.result'dan dosya yolunu nasıl alırsınız? Reader.result ne zaman bir yol atadı? – Mihir

+0

reader.result, dosya okuyucu API'sinin bir özelliğidir. Yeni FileReader çağrıldığında buna inanıyorum. Https://developer.mozilla.org/en-US/docs/Web/API/FileReader –

+0

belki de bu kadar kolay bir şekilde etiketlenmiş olabileceğini varsayalım (https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications # Example_Showing_thumbnails_of_user-selected_images) size yardımcı olabilir. – Mihir

cevap

0

Resim çeken bu pasajı oluşturdum, & görüntüyü küçük resim olarak dışa aktarıyor.

// limit the image to 150x100 maximum size 
 
var maxW=150; 
 
var maxH=100; 
 

 
var input = document.getElementById('input'); 
 
input.addEventListener('change', handleFiles); 
 

 
function handleFiles(e) { 
 
    var img = new Image; 
 
    img.onload = function() { 
 
     var canvas=document.createElement("canvas"); 
 
     var ctx=canvas.getContext("2d"); 
 
     var iw=img.width; 
 
     var ih=img.height; 
 
     var scale=Math.min((maxW/iw),(maxH/ih)); 
 
     var iwScaled=iw*scale; 
 
     var ihScaled=ih*scale; 
 
     canvas.width=iwScaled; 
 
     canvas.height=ihScaled; 
 
     ctx.drawImage(img,0,0,iwScaled,ihScaled); 
 
     var thumb=new Image(); 
 
     thumb.src=canvas.toDataURL(); 
 
     document.body.appendChild(thumb); 
 
    } 
 
    img.src = URL.createObjectURL(e.target.files[0]); 
 
}
body{ background-color: ivory; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<h4>Select a file to create a thumbnail from</h4> 
 
<input type="file" id="input"/> 
 
<br>

+0

Bu iyi bir iş! Paylaşım için teşekkürler. Örneği kullanarak tuvali uyguladığımda, bana boş bir tuval verir ve veri URL'si verileri gösterir: görüntüyü ilk kez seçtiğimde. 2. seçimde, resmi görüyorum. Esasen aynı problemi yaşıyorum! Ölçeklemeyi ayrı bir işleve sokmayı ve önizleme() yöntemim içinde çağırmayı deneyeceğim ve daha iyi şansım olup olmadığına bakacağım. –

+1

Hızlı güncelleme - Bu öğleden önce, Mihir'e yazılan makalenin yardımıyla cevabınızı çözebildim ve cevabınız MarkE - Yanıtları gerçekten takdir ediyorum! –

+0

Görüntü yüklendiğinde, URL.revokeObjectURL numarasını çağırmayı unutmamalısınız. Bellekte tutmaya gerek yoktur ve * bellek sızıntılarına * yol açabilir. – Kaiido