2010-01-19 12 views
15

Vorrei ridimensionare un'immagine a una dimensione di file specifica. Ad esempio, non più di 200 KB. Qual è l'approccio migliore per ottenere questo risultato con C# .NET?Come ridimensionare un'immagine a una dimensione di file specifica?

Grazie!

+0

Quale formato? PNG? JPEG? –

+1

Definisci "migliore": la qualità visiva più veloce e migliore, l'uso minimo della memoria, l'uso minimo della CPU? – RedFilter

+0

Formato JPEG (è davvero diverso con altri formati?). "Migliore" -> 1. migliore qualità visiva 2. più veloce –

risposta

3

Se ci pensate, non conoscerete la dimensione dell'immagine prima di ridimensionarla. Quindi è necessario eseguire un'iterazione successiva di tentativi e confrontare le dimensioni dei file in seguito oppure è possibile modificare i vincoli per limitare le immagini a un particolare insieme di dimensioni di altezza e larghezza.

+1

Dopo aver verificato diversi metodi che ottengono risultati insoddisfacenti, ho deciso di limitare la larghezza e l'altezza :) –

1

Si può fare molto con la classe Drawing.Image per ridimensionare un'immagine.

Ci sono molte domande su come farlo. Ecco one.

In termini di dimensioni, non si sa quale sarà la dimensione dopo l'operazione di ridimensionamento. L'unico modo per essere certi è ridimensionare, controllare il risultato e se è troppo grande prova a ridimensionarlo con una qualità inferiore. Ripeti fino al termine.

È possibile approssimare la dimensione se si conoscono le dimensioni e la profondità del colore, come descritto nelle risposte alla domanda this (identica?).

+0

Sembra un modo stupido per farlo, da un punto di vista CompSci. – MSalters

+0

@MSalters Come andresti a predire il futuro, in modo CompSci, cioè? – Oded

+0

Per i principianti, questo è un algoritmo di approssimazione consecutiva unilaterale (non c'è controllo per output troppo piccoli/cattiva qualità).Pertanto è lento o soggetto a overshoot. Il secondo problema è che se non colpisci il bersaglio al primo tentativo, dovrai rifare tutto. – MSalters

1

Se questa non è una funzione molto importante, per tentativi ed errori funziona abbastanza bene. Supponiamo che, se è necessario ridurre l'input a N * 100%, lo si fa ridimensionando entrambe le dimensioni per sqrt(N) * 100%.

Se è importante per, è necessario comprendere meglio le tecnologie di compressione delle immagini. Assumerò JPG. Si tratta di un formato immagine che raggiunge una compressione con perdita rompendo l'immagine in blocchi di 8x8 pixel, trasformandoli con DFT, eliminando i piccoli coefficienti e quindi comprimendo il flusso di bit risultante.

Ora ne consegue che è possibile armeggiare un po 'con il livello di qualità, quanti dei piccoli coefficienti si buttano via. Non è necessario ripetere il DFT (costoso) per questo. Quindi, se il file finisce leggermente troppo grande, puoi gettare via qualche altro coefficiente e ricomprimerlo. E se tu fossi un po 'aggressivo, poi rimetti alcuni coeffecients e comprimi di nuovo. Questo è tutto abbastanza veloce.

-1

Una stima approssimativa è la seguente:

size(KB) = (width * height * bitdepth)/(8 * 1024)

La dimensione del file è gonfiato un po 'di più a causa di file dati (informazioni di compressione, ecc).

+0

-1 A quale tipo di file si applica questo? Come sei arrivato a questa formula? –

Problemi correlati