Domanda su dimensione/ridimensionamento caricamento immagini

Dopo aver letto questo argomento, questo e questo, non sono del tutto sicuro di cosa faccia Discourse con le immagini di grandi dimensioni. La mia precedente comprensione era che non venisse effettuato alcun ridimensionamento software, ma solo tramite CSS: le dimensioni dell’immagine erano limitate da massima dimensione di caricamento immagine in kB e basta. Se un’immagine più grande è un file remoto, viene collegata; altrimenti, non puoi semplicemente caricarla.

Ma ora sono confuso perché quegli argomenti menzionano il ridimensionamento verso il basso e l’ottimizzazione, cose che non pensavo avvenissero, dato che non ne ho mai visto traccia nella pratica, per quanto mi risulti. Inoltre, non ho idea di cosa si applichi il limite Numero massimo di megapixel consentiti per un'immagine. Questo impedisce il caricamento di immagini più grandi di quel valore, oppure le immagini che superano tale limite vengono ridimensionate, purché siano inferiori a massima dimensione di caricamento?

Se è quest’ultima ipotesi, perché l’impostazione predefinita per i megapixel è così enorme rispetto alla dimensione massima di caricamento predefinita? Sembra estremamente improbabile che qualcuno voglia pubblicare un’immagine da 51 megapixel che pesi meno di 4096 kB.


Ciò che voglio è che gli utenti possano caricare comodamente qualsiasi cosa abbiano senza preoccuparsi di dimensioni del file e risoluzioni, e che il software consegni qualcosa di appropriato che non metta in difficoltà gli utenti mobili e chi ha connessioni più lente. È attualmente possibile farlo semplicemente regolando massima dimensione immagine e massimi megapixel?

Tutto questo funziona immediatamente:

Clicca con il tasto destro su :arrow_double_up: visualizza sorgente: l’immagine è piccola. Cliccaci sopra e vedrai l’immagine a risoluzione completa.

Quindi, se modifico max upload a 10 MB e max megapixel a 12, cosa succede quando un utente tenta di caricare un’immagine da 12 megapixel di 7 MB?

Con le impostazioni predefinite, una percentuale significativa di foto scattate dai telefoni più recenti supera i 4096 kB, ma è ben lontana dai 40 megapixel.

Non ho ancora capito cosa succede in questi casi o perché i valori predefiniti siano impostati in quel modo.

Consiglio di provare a modificare le impostazioni: cambia una configurazione, carica un’immagine enorme e vedi cosa succede.

Ok, posso farlo. Tuttavia, vorrei anche capire cosa fa effettivamente il software per prendere decisioni più informate. Nel tempo in cui ho utilizzato Discourse, ho imparato a rispettare le impostazioni predefinite e a modificarle solo quando necessario. In questo caso, le impostazioni predefinite non funzionano molto bene per una comunità abbastanza tipica e sono curioso di sapere perché sono impostate in quel modo, quali valori ragionevoli dovrei prendere in considerazione e cosa accadrà quando apportero queste modifiche.

Leggendo il codice, il numero massimo di megapixel è una restrizione rigida. È un interruttore di sicurezza, non qualcosa che il sistema utilizza per prendere decisioni sul ridimensionamento.

max_image_size_kb è l’unico fattore determinante per il ridimensionamento automatico al momento del caricamento.

Aumenta il numero massimo di megapixel alla quantità assoluta più grande di megapixel che desideri mai ospitare.

Dopo aver premuto a caso i tasti per un po’ per capire come funziona, ecco cosa penso stia succedendo:

  • Con un’installazione predefinita, se client_max_body_size è uguale a max image size kb, le immagini non vengono ridimensionate.

  • Aumentare client_max_body_size consentirà caricamenti più grandi, che Discourse tenterà poi di ridimensionare rispettando il limite impostato in max image size kb.

  • Nonostante la descrizione suggerisca il contrario, max image size kb non limita effettivamente le dimensioni dei caricamenti (è davvero confuso!)

  • Le dimensioni dei caricamenti sono determinate esclusivamente da client_max_body_size di nginx.

  • Durante il ridimensionamento, i JPEG rimangono JPEG con buoni risultati, i PNG vengono convertiti in JPG con risultati accettabili, mentre i GIF animati rimangono GIF con risultati generalmente scadenti.

È tutto corretto? Se sì, sembra una di quelle cose che andrebbero spiegate meglio, dato che un’installazione standard non esegue alcun ridimensionamento delle immagini, anche se è una funzionalità che molte persone potrebbero desiderare, e dalla documentazione disponibile non è affatto chiaro come attivarla.

Hmm, ho appena controllato nginx.sample.conf su GitHub e sembra che il valore predefinito per client_max_body_size sia ora 10 MB invece di 4 MB. È sempre stato così? Non ricordo di aver mai modificato quel file sulla mia installazione prima di oggi.

Grazie per i test approfonditi con la versione corrente. L’ho verificato e sembra che funzioni nella pratica esattamente come hai descritto.

La dimensione massima del corpo è stata 10 per un bel po’ di tempo; dovremmo probabilmente aumentarla a 20.

Concordo sul fatto che dovremmo migliorare la descrizione dell’impostazione del sito; lo farò più tardi oggi.

MODIFICA:

La documentazione è stata aggiornata secondo:

https://review.discourse.org/t/doc-improve-documentation-of-image-limit-site-settings/9303

Ciao Sam, dalla descrizione sembra che non stia funzionando per me:

+ max_image_size_kb: “La dimensione massima di upload delle immagini in kB. Questa deve essere configurata anche in nginx (client_max_body_size) / apache o nel proxy. Le immagini più grandi di questo valore ma più piccole di client_max_body_size verranno ridimensionate per adattarsi durante l’upload.”

+ max_image_megapixels: “Numero massimo di megapixel consentiti per un’immagine. Le immagini con un numero di megapixel superiore verranno rifiutate.”

O almeno non sembra che venga tentato alcun ridimensionamento.

Avevo impostato max_image_size_kb a 1000kb e un’immagine leggermente superiore è stata sostituita da un link seguito dal testo che dice (immagine più grande di 1000KB).

Ho modificato l’impostazione a 500kb e la stessa cosa è accaduta.

Non ho modificato client_max_body_size in NGINX, dato che presumo sia al valore predefinito (4096).

Queste sono immagini hot linkate, a proposito (dove presumo che se hai spuntato scarica immagini remote in locale) dovrebbe essere trattato come un upload standard? (Se non è così, possiamo far sì che si comporti allo stesso modo, per favore?)

Modifica: Ok, quindi l’upload diretto e il ridimensionamento funzionano - ottimo! Quindi sono solo le immagini remote recuperate a fallire. Non sono sicuro di quale sia il comportamento ideale, ma a primo pensiero penserei che anche quelle immagini dovrebbero essere ridimensionate.

Penso che questa sia una richiesta di funzionalità separata. Certamente, se si riduce la dimensione massima dell’immagine a 200 KB, ha tutto il senso ridimensionare le immagini con link diretto quando le scarichiamo. Ci sono delle soglie in gioco: non dovremmo scaricare un’immagine da 700 gigabyte solo per verificare questo aspetto, ma sì, qualcosa potrebbe essere migliorato.

Concordo, Sam. Non riesco a pensare a nessun motivo per cui non si vorrebbe che le immagini hotlinkate scaricate seguano le stesse regole, a dire il vero.


Ho anche appena scoperto che modificando la dimensione massima dell’immagine, questo influisce effettivamente sulla dimensione finale del file: cosa davvero interessante! Impostandola a 500 KB, un’immagine di 1,2 MB è stata ridimensionata a 360 KB; impostandola a 200 KB, lo stesso file è finito a 118 KB :+1: (anche se, ovviamente, è anche più piccola).

Modifica: Argh, ma riemergiamo quel problema originale: le immagini troppo grandi per essere ridimensionate falliscono con:

lib/discourse.rb:57:in `exec': convert: improper image header `/tmp/image20200228-23391-t365z9.jpg' @ error/png.c/ReadPNGImage/4294.

Mi chiedo se esista un modo per cui DC esegua sempre un ridimensionamento? Anche se l’immagine finisce per essere minuscola?


Questa è l’impostazione predefinita sui nostri forum. Ho provato a cambiarla in 20000 e ha funzionato (o sembrava aver attecchito), ma quando ho cercato di caricare un’immagine/GIF da 17,2 MB ho ricevuto questo messaggio di errore:


Puoi dirmi quale percorso seguire (comandi da inserire) in Linux per modificare “client_max_body_size” in nginx? Sono su un droplet di DigitalOcean.

Questo significa che il valore predefinito verrà presto cambiato da 4096 a 20000?

Splendido @riking! Grazie, amico!

/var/discourse contiene solo una cartella condivisa. Non riesco a trovare il file di cui parli. Il mio problema è che ho un’installazione completamente nuova di Discourse e il caricamento delle immagini nei post non funziona affatto. Anche come amministratore, ricevo l’errore: “Spiacente, si è verificato un errore durante il caricamento del file. Riprova.” Ho provato più e più volte, ma ottengo sempre lo stesso errore.

I log degli errori mostrano:

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) non è stato trovato: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

Discourse è progettato per essere un gruppo di discussione “solo testo”? Ho impostato le dimensioni massime di caricamento dei file su valori enormi, ma non riesco nemmeno a caricare un’immagine di 7 kb.

Se non c’è nulla in /var/discourse, potresti avere un’installazione più vecchia; controlla anche /var/docker.

Mmm, prova a ricostruire? Potresti avere una vecchia immagine base che non gestisce correttamente l’assenza della chiave mmdb.

Ok, ecco come appaiono quelle cartelle.


Non sono sicuro di come procedere con la ricostruzione. Potete fornirmi indicazioni? Si tratta di un’installazione completamente nuova su una VM e non ho riscontrato alcun errore. Tutto sembra funzionare tranne la grafica.

Come chiede Jay qui: Uploading Files to Discourse - #3 by pfaffman
Hai eseguito una Installazione Standard Ufficiale di Discourse?