Es probable que haya una forma mucho más elegante de hacer esto, pero lo que siempre he hecho es algo así:
1) Supongamos que availableWidth y availableHeight definen el área de destino (fija) contra la que cambia el tamaño.
2) Supongamos que imageWidth e imageHeight representan el ancho y la altura ACTUAL de su imagen cargada en cualquier momento dado.
- ¿Qué tipo de ordenación usa C ++ para hacer múltiples clasificaciones?
- ¿Cuál es el algoritmo más adecuado para la agrupación en una red social?
- ¿Cómo funciona el algoritmo de Clasificación de Señal Múltiple (MUSIC)?
- ¿Qué estructura de datos es mejor para implementar una guía telefónica: Trie o Hash? ¿Por qué?
- ¿Qué es mejor para la programación competitiva, la introducción del MIT a los algoritmos o los tutoriales de TopCoder?
3) Primero, realice un cambio de tamaño restringido a la relación de aspecto bloqueado con el valor del Ancho disponible. Esto se hace ajustando primero la altura de la imagen cargada, luego configurando el ancho:
imageHeight = imageHeight x ( disponibleWidth / imageWidth)
imageWidth = availableWidth
4) El paso anterior supone que la imagen está orientada al paisaje (por lo tanto, utiliza el ancho como valor de bloqueo), pero puede que no lo sea, por lo que hacemos una comprobación rápida para ver si la altura de la imagen excede nuestra altura objetivo:
if ( imageHeight > availableHeight )
5) Si este es el caso, aplicamos el paso 3 nuevamente, pero esta vez usamos la altura como el valor de bloqueo:
imageWidth = imageWidth x (availableHeight / imageHeight)
imageHeight = altura disponible
6) En este punto, sabemos que tenemos una imagen que se ajusta al área delimitadora que hemos definido, por lo que es solo una cuestión de centrarla vertical y horizontalmente dentro de esa área, lo que se logra mediante una simple división y resta.
Siempre he tenido la impresión de que hay algún tipo de fórmula o algoritmo que combina los pasos de ancho y alto anteriores, pero cada vez que me veo obligado a hacer esto, tengo demasiado tiempo para darlo investigación adecuada 🙂