Visualizzazione dei risultati da 1 a 10 su 10

Discussione: ridimensionare base64

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Quote Originariamente inviata da ludlogan Visualizza il messaggio
    Salve a tutti,

    vorrei sapere se esiste un modo per ridimensionare un'immagine già in base64.

    Per spiegarmi meglio, io ho una stringa base64 che è la mia immagine originale: voglio che questa immagine venga ridimensionata se il lato più lungo supera un valore predefinito (maxheight e maxwidth per intendersi)
    e magari poter decidere anche la qualità.

    Una volta elaborata l'immagine in base64, lo script deve produrre un nuovo base64 con le modifiche richieste.

    no testo enorme grazie

    grazie in anticipo per la spremitura di meningi!
    Ciao,
    mi sa che lo puoi fare solo passando attraverso un canvas. Poi entrata e uscita può anche essere base64.
    Ultima modifica di ciro78; 11-02-2021 a 19:38

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2020
    Messaggi
    12
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Ciao,
    mi sa che lo puoi fare solo passando attraverso un canvas. Poi entrata e uscita pu� anche essere base64.
    Grazie U235!!!
    ho uno script che con un campo file carica singoli file e tramite un canvas fa il resize (maxW, maxH e qualit�) restituendomi un un b64 che poi tramite Classic ASP trasformo in immagine e salvo in una data cartella (un file upload...).
    Il mio problema � che non so come modificarlo per farlo con pi� file in una volta dato che non basta aggiungere "multiple" al campo per farlo funzionare.

    ho trovato un altro script che lavora in Angular che traforma multipli file con un campo file in altrettanti b64 quindi vorrei collegare l'output di questo al primo col canvas ciclando tutti i base64 trovati per ridimensionarli e salvarli come immagini per avere cos� un multiple-file-upload.

    mi manca quindi l'anello di congiunzione: dovrei poter utilizzare il primo script (che riporto qui sotto HTML + JS) partendo da un b64 innvece che da un campo file con un immagine dentro.


    codice:
    <input type="file" id="input" accept="image/jpeg,image/png" >
    <br>
    
    
    <br/>canvas:<br/>
    <canvas id="canvas" width=64 height=64></canvas>
    
    
    <br/>output:<br/>
    
    
    <textarea id="file_output"></textarea>
    
    
    
    
     <script>  
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    var cw=canvas.width;
    var ch=canvas.height;
    var maxW=1000;
    var maxH=1000;
    
    
    var input = document.getElementById('input');
    var output = document.getElementById('file_output');
    
    
    
    
    input.addEventListener('change', handleFiles);
    
    
    function handleFiles(e) {
    
    
    
    
    var randomNumber6=Math.floor(100000 + Math.random() * 900000)
    var filename = $('#input').val().replace(/C:\\fakepath\\/i, '')
    filename=filename.replace(".jpeg","_"+randomNumber6+".jpeg")
    filename=filename.replace(".JPEG","_"+randomNumber6+".jpeg")
    filename=filename.replace(".jpg","_"+randomNumber6+".jpg")
    filename=filename.replace(".JPG","_"+randomNumber6+".jpg")
    filename=filename.replace(".png","_"+randomNumber6+".png")
    filename=filename.replace(".PNG","_"+randomNumber6+".png")
    filename=filename.replace(".gif","_"+randomNumber6+".gif")
    filename=filename.replace(".GIF","_"+randomNumber6+".gif")
    
    
    //alert(filename)
    
    
      var img = new Image;
      img.onload = function() {
        var iw=img.width;
        var ih=img.height;
    	
    	var scale=0
        var iwScaled=0
        var ihScaled=0
    	
    	
    	if (iw>maxW || ih>maxH){
    		
    		scale=Math.min((maxW/iw),(maxH/ih));
    		iwScaled=iw*scale;
    		ihScaled=ih*scale;
    		canvas.width=iwScaled;
    		canvas.height=ihScaled;
    	
    	}else{
    		
    		//scale=Math.min((maxW/iw),(maxH/ih));
    		iwScaled=iw//*scale;
    		ihScaled=ih//*scale;
    		canvas.width=iwScaled;
    		canvas.height=ihScaled;
    	
    	}
    	
    		//console.log(iw+' - '+ih+' - '+scale+' - '+iwScaled+' - '+ihScaled+' - '+canvas.width+' - '+canvas.height)
    
    
        ctx.drawImage(img,0,0,iwScaled,ihScaled);
    output.value = canvas.toDataURL("image/jpeg",0.5);
      }
      img.src = URL.createObjectURL(e.target.files[0]);
      
    	setTimeout(function(){
    		$.ajax({
    			type: "POST",
    			url: "testRESIZE_IMAGE_SAVE.asp",
    			data: {b64:output.value,filename:filename},
    			success: function(rps){		
    				$('#input').val('')
    				$('#file_output').val('')
    			},
    			dataType: "html"
    		});
    	},200)
      
      
    }
    Avresti una vaga idea di come intervenire?

  3. #3
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    non c'� molto da modificare, ti basta impostare nel src dell'immagine direttamente la stringa in base64.
    Inoltre ti consiglio di modificare anche la pagina asp per ricevere pi� file, ma questo esula dalla domanda.

    diciamo una cosa del genere:

    codice:
    <script>
            var input = document.getElementById('input');
            var output = document.getElementById('file_output');
            var multipleCanvas = document.getElementById('multipleCanvas');
            
            input.addEventListener('change', () => {
                for (var i = 0; i < input.files.length; i++) {
                    var fileB64 = URL.createObjectURL(input.files[i]);
                    resizeImage(fileB64,
                        (resOutput, canvas) => {
                            //volendo puoi eliminare il canvas nel caso lo crei nuovo (o lo aggiungi al dom come sotto)
                            multipleCanvas.appendChild(canvas);
                            //imposti l'output (come nel tuo script), ma in questo caso essendo multipli divido i file con una nuova linea
                            output.value += '\n' + resOutput;
                            var randomNumber6 = Math.floor(100000 + Math.random() * 900000)
                            var filename = input.value.replace(/C:\\fakepath\\/i, '');
                            filename = filename.replace(".jpeg", "_" + randomNumber6 + ".jpeg");
                            filename = filename.replace(".JPEG", "_" + randomNumber6 + ".jpeg");
                            filename = filename.replace(".jpg", "_" + randomNumber6 + ".jpg");
                            filename = filename.replace(".JPG", "_" + randomNumber6 + ".jpg");
                            filename = filename.replace(".png", "_" + randomNumber6 + ".png");
                            filename = filename.replace(".PNG", "_" + randomNumber6 + ".png");
                            filename = filename.replace(".gif", "_" + randomNumber6 + ".gif");
                            filename = filename.replace(".GIF", "_" + randomNumber6 + ".gif");
                            $.ajax({
                                type: "POST",
                                url: "testRESIZE_IMAGE_SAVE.asp",
                                data: { b64: resOutput, filename: filename },
                                success: function (rps) {
                                    $('#input').val('')
                                    $('#file_output').val('')
                                },
                                dataType: "html"
                            });
                        }
                        , null//opzionale default nuovo canvas, diversamente li passo quello che preferisco
                        , 100//opzionale default 1000
                        , 100//opzionale default 1000
                    );
                }
            });
            function resizeImage(b64, handle, canvas, maxW, maxH) { 
                maxW = maxW ? maxW : 1000;
                maxH = maxH ? maxH : 1000;
                canvas = canvas?canvas:document.createElement("canvas");
                var ctx = canvas.getContext("2d");
                var img = new Image;
                var output;
                img.onload = function () {
                    var iw = img.width;
                    var ih = img.height;
                    var scale = 0;
                    var iwScaled = 0;
                    var ihScaled = 0;
    
    
                    if (iw > maxW || ih > maxH) {
    
    
                        scale = Math.min((maxW / iw), (maxH / ih));
                        iwScaled = iw * scale;
                        ihScaled = ih * scale;
                        canvas.width = iwScaled;
                        canvas.height = ihScaled;
    
    
                    } else {
                        //scale=Math.min((maxW/iw),(maxH/ih));
                        iwScaled = iw//*scale;
                        ihScaled = ih//*scale;
                        canvas.width = iwScaled;
                        canvas.height = ihScaled;
    
    
                    }
                    ctx.drawImage(img, 0, 0, iwScaled, ihScaled);
                    output = canvas.toDataURL("image/jpeg", 0.5);
                }
                img.src = b64;
                setTimeout(function () {
                    if (handle)
                        handle(output,canvas);
                }, 200);
            }
        </script>
    In questo caso resizeImage accetta il file in base64 (recuperato in questo caso da un input, ma passato in base64 alla funzione) e un handler per permetterti di eseguire quello che eseguivi alla fine della funzione (come faceva il tuo script) all'esterno della funzione, in modo che se devi eseguire qualcosa di diverso lo puoi fare li. Lo script sopra avvia il processo tramite la selezione dell'input, ma ovviamente quello che ti interessa � questo:
    codice:
    resizeImage('file in base 64',
                (output, canvas) => {
                 //'output' � come dice la parola un output in base64 dell'immagine ridimensionata (eventualmente)
                 //eseguo la chiamata ajax o quello che mi pare, 
    });
    Quindi lo puoi eseguire quando ti va, magari legato al click del button.
    Oltre questi parametri in resizeImage ho aggiunto anche la dimensione massima e la possibilit� di passare un canvas specifico (passando null lo crea nuovo), in questo modo una volta eseguito puoi fare del canvas ci� che vuoi, e il file output (base64) insieme al canvas stesso viene restituita nel tuo handler.

    P.S.
    'multipleCanvas' è solamente una div dove accodo i canvas multipli.
    Ultima modifica di U235; 01-02-2021 a 18:25

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.