Estoy tratando de seleccionar algunas imágenes de arte para que quepan en algunos cuadros nuevos. Me gustaría poder ordenar estas imágenes por proximidad a una relación de aspecto particular y luego verlas en orden decreciente de proximidad a través de algo como feh.
¿Hay alguna gloriosa expresión de Unix de una línea? De lo contrario, unas pocas docenas de líneas de Python deberían aclarar esto.
identify -format "%[fx:w/h]:%M\n" *.jpg
. No sé cómo ordenar fácilmente por proximidad a un valor arbitrario.sort
no parece apoyar tal clasificación.Respuestas:
Usando el comentario ImageNagick de NN como una ventaja, resulta que puede hacer que realice cálculos arbitrarios como parte de su
-format
salida. Entonces, una forma posible:Debes hacer lo que quieras. Tenga en cuenta que 4/3 hay una relación de aspecto constante, la deseada. Por supuesto, podría encontrarlo como el resultado de un anterior
identify
(para que coincida con "más cercano a esta imagen").Para explicar, estamos tomando la diferencia simple entre la relación de aspecto deseada y real. Luego multiplica por un gran número y redondea. La multiplicación y la ronda se deben a que la ordenación solo maneja enteros, no racionales.
editar
Resulta
sort
que parece hacer racionales, no solo enteros. Incluso se especifica en la especificación Single Unix (v4). Entonces, puede deshacerse de esa solución alternativa:fuente
33333:cover.jpg
donde cover.jpg es 500x500.Bueno, la forma más fácil de hacer esto sería usar ImageMagick . Debe estar en los repositorios de su distribución de Linux, para sistemas basados en Debian, ejecute:
Uno de los programas de la suite ImageMagick es
identify
que imprimirá las características de una lista de archivos de imagen de entrada. Combinarlo consort
le dará una lista de imágenes ordenadas por tamaño (puede cambiar png para cualquier extensión que tenga:Si realmente necesita la relación de aspecto y no solo el tamaño, intente algo como esto:
Opción simple, supone que los nombres de sus imágenes no tienen espacios :
El comando gawk divide el tercer campo (el tamaño de la imagen que tiene el formato LxH) en los "tamaños" de la matriz y luego imprime el primer campo (el nombre de la imagen) y el resultado de dividir la longitud de la imagen por su altura. los
sed
comando simplemente embellece la salida ysort
ordena el resultado de acuerdo con la relación de tamaño de imagen.Más complejo, este puede tratar con espacios en los nombres de archivo:
Aquí estamos utilizando
find
para identificar los archivos que nos interesan y ejecutar elidentify
comando, y luego canalizar su salida a través de un pequeño script PERL. La expresión regular busca tres letras mayúsculas ([A-Z]{3}
) que deberían ser el formato de imagen. Una vez que hayamos encontrado eso, es fácil identificar el nombre y las dimensiones de la imagen.No estoy usando gawk aquí porque la presencia de espacios en los nombres de los archivos de entrada confundirá los números de campo. Finalmente, el script imprimirá el nombre de la imagen y el resultado de la división de longitud / altura que
sort
numéricamente.Si simplemente explorar las relaciones de aspecto disponibles no es suficiente, si tiene al menos una imagen con la relación de aspecto deseada, solo use grep para extraer esas imágenes cuya relación es más cercana:
fuente
Puede calcular la diferencia de cada relación de aspecto con la referencia. Parece la respuesta de derobert, pero más simple:
fuente
Una relación de aspecto es solo un número, por lo que puede explorar las imágenes según sus nombres, si el nombre tiene el prefijo de la relación de aspecto. La creación de enlaces simbólicos con la relación de aspecto preestablecida le permite explorar las imágenes ordenadas por relación de aspecto.
Los siguientes espectadores funcionan como se esperaba. ( Feh no avanza / retrocede, incluso para imágenes reales, en mi sistema)
Vaya al
ar-sort
directorio y simplemente navegue desde el punto de partida (relación de aspecto) que le interese.Los nombres de los enlaces simbólicos se ven así:
fuente
Mi línea habitual de razonamiento es utilizar la métrica de la distancia de error al cuadrado donde escucho las palabras "grado de proximidad". Seguramente se pueden usar valores absolutos, y sería más rápido. El script toma como argumento la relación de aspecto ideal , procesa todos los archivos * .jpg en el directorio actual y los genera ordenados en orden creciente de divergencia de la relación ideal.
head
elimina el carácter final de línea insertado por ImageMagick.El script contiene un comando gawk que establece el separador de campo de salida en un carácter improbable, calcula la diferencia al cuadrado e imprime el nombre de archivo de diferencia de pares. Se realiza la clasificación y se elimina la información innecesaria (diferencia de relación de aspecto al cuadrado)
cut
.fuente