Visualizzazione dei risultati da 1 a 9 su 9

Discussione: ridimensionare base64

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2020
    Messaggi
    12

    ridimensionare base64

    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!
    Ultima modifica di ciro78; 11-02-2021 a 19:38

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,523
    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

  3. #3
    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?

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,523
    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

  5. #5
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,523
    Qui un esempio in funzione (senza chiamata ajax).

    NB
    Un unltima cosa: occhio alla pagina sul server, fai in modo che sia dotata di controllo credenziali e che le dimensioni massime dei file siano controllate, diversamente rischi che magari passa qualche male intenzionato e ti blocca il server mandandoti immagini esagerate...
    Ultima modifica di U235; 01-02-2021 a 18:59

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2020
    Messaggi
    12
    U235 sei un idolo! Chiedo venia ma non ricevo le notifiche per email quindi mi era passato di mente di controllare la discussione!

    Parrebbe perfetto, nella pagina asp faccio uno split e recupero i singoli file, li ciclo convertendoli e salvandoli e dovrebbe andare tutto ok!

    Grazie davvero!!!!!!!!!!!!!!!!!!!

    "NB
    Un unltima cosa: occhio alla pagina sul server, fai in modo che sia dotata di controllo credenziali e che le dimensioni massime dei file siano controllate, diversamente rischi che magari passa qualche male intenzionato e ti blocca il server mandandoti immagini esagerate...
    "

    Ottimo consiglio!!! Blocco con IIS e con un controllo js le dimensioni dei file. Pensi possa bastare?

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,523
    Quote Originariamente inviata da ludlogan Visualizza il messaggio
    U235 sei un idolo!
    chiamami Draghi allora. Stamattina ha tirato fuori a mani nude un bus uscito fuori strada intrappolato sotto al ghiaccio di un lago in nord Europa, dopo ha rianimato tutti i passeggeri rimasti sotto ghiaccio per 6 giorni. Domani si riposa.

    Per l'altra questione dipende da cosa intendi per bastare, per evitare che ti mandino file troppo grandi da gestire per il server li puoi bloccare lato client con javascript, ma se uno vuole li manda lo stesso senza passare per javascript, quindi devi fare il controllo anche lato server. Fare quello lato client è semplicemente "una cortesia" all'utente che usa il tuo sito per evitargli di fare un upload di dati inutili in quanto sarebbe rifiutata sul server, ma il controllo vero e proprio lo fai sul server perché non è detto che tutti passino per il tuo codice client.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2020
    Messaggi
    12
    ahahahahahahahahahahahahahahahahhahahahahahahahaha hahahahahahahahaha
    ha rcuperato anche degli esemplari perfettamente conservati di mammut dal fondale ghiacciato.

    ok grazie mille davvero farò strizzerò a dovere la valvola lato server!

    grazie ancora e complimenti per la soluzione!

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,523
    Quote Originariamente inviata da ludlogan Visualizza il messaggio
    ahahahahahahahahahahahahahahahahhahahahahahahahaha hahahahahahahahaha
    ha rcuperato anche degli esemplari perfettamente conservati di mammut dal fondale ghiacciato.

    ok grazie mille davvero farò strizzerò a dovere la valvola lato server!

    grazie ancora e complimenti per la soluzione!


    Figurati. Comunque io nello script che avevi non ho cambiato quasi nulla, ho solo risistemato un po il codice in modo da essere un po più "usabile". la soluzione era già li.

    Ciao e buon lavoro

  10. #10
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,509
    Ciao Ludlogan,
    benvenuto sul forum. Ti invito a leggere il regolamento qualora non lo avessi già fatto.

    Inoltre ti chiedo di non mettere testo gigante e colorato di verde.

    Non aggiunge nulla alla tua richiesta e per alcuni potrebbe essere difficile da leggere.

    Grazie
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


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 © 2024 vBulletin Solutions, Inc. All rights reserved.