2010-01-19 20 views
15

Me gustaría cambiar el tamaño de una imagen a un tamaño de archivo específico. Por ejemplo, no más de 200 KB. ¿Cuál es el mejor enfoque para lograr esto con C# .NET?¿Cómo cambiar el tamaño de una imagen a un tamaño de archivo específico?

Gracias!

+0

¿Qué formato? PNG? JPEG? –

+1

Defina "mejor": la calidad visual más rápida, mejor, uso mínimo de memoria, uso mínimo de la CPU? – RedFilter

+0

Formato JPEG (¿es esto realmente diferente con otros formatos?). "Mejor" -> 1. mejor calidad visual 2. más rápido –

Respuesta

3

Si lo piensas bien, no sabrás el tamaño del archivo de la imagen hasta que haya cambiado el tamaño. Por lo tanto, debe realizar una iteración sucesiva de intentos y comparar los tamaños de archivo posteriormente o puede cambiar sus restricciones para restringir las imágenes a un conjunto particular de dimensiones de alto y ancho.

+1

Después de verificar varios métodos que obtienen resultados insatisfactorios, decidí restringir el ancho y la altura :) –

1

Puede hacer bastante con la clase Drawing.Image para cambiar el tamaño de una imagen.

Hay muchas preguntas sobre cómo hacerlo. Aquí está one.

En términos de tamaño, no sabrá cuál es el tamaño hasta después de la operación de cambio de tamaño. La única manera de estar seguro es cambiar el tamaño, verificar el resultado y, si es demasiado grande, intentar cambiar el tamaño con una calidad inferior. Repita hasta que termine.

Puede aproximar el tamaño si conoce las dimensiones y la profundidad de color, como se describe en las respuestas a la pregunta this (¿idéntica?).

+0

Suena como una manera tonta de hacerlo, desde un punto de vista CompSci. – MSalters

+0

@MSalters ¿Cómo harías para predecir el futuro, de una manera CompSci, eso es? – Oded

+0

Para empezar, se trata de un algoritmo de aproximación sucesiva unilateral (no hay verificación para una producción demasiado pequeña/mala calidad).Por lo tanto, es lento o está sujeto a sobrepasarse. El segundo problema es que si no golpeas el objetivo en tu primer intento, tendrás que volver a hacer todo. – MSalters

1

Si esto no es una función muy importante, el juicio y funciona bastante bien de error. Simplemente suponga que si necesita reducir la entrada a N * 100%, lo hace escalando ambas dimensiones por sqrt(N) * 100%.

Si es importante, debe comprender mejor las tecnologías de compresión de imágenes. Asumiré JPG. Es un formato de imagen que logra una compresión con pérdida al dividir la imagen en bloques de 8x8 píxeles, transformarlos en DFT, eliminar pequeños coeficientes y luego comprimir el flujo de bits resultante.

Ahora se deduce que se puede jugar un poco con el nivel de calidad, cuántos de los pequeños coeficientes se tiran. No es necesario volver a hacer la (costosa) DFT para esto. Entonces, si el archivo termina demasiado grande, puedes descartar algunos coeficientes más y recomprimir. Y si fuiste levemente agresivo, entonces regresa algunos coefecientes y vuelve a comprimir. Esto es bastante rápido.

-1

Una estimación aproximada es la siguiente:

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

El tamaño del archivo se infla un poco más debido al archivo de información (la información de compresión, etc).

+0

-1 ¿A qué tipo de archivo se aplica? ¿Cómo llegaste a esta fórmula? –

Cuestiones relacionadas