El problema:
Este desafío proviene de un problema real que estaba teniendo. Tengo una configuración de monitor dual en el trabajo, y quería usar la siguiente imagen como fondo de pantalla:
Sin embargo, mis monitores tienen biseles bastante significativos, y cuando configuro mi fondo, se ve más o menos así, donde parece que el muelle (¿apliques?) Está roto:
Pude resolver esto haciendo una imagen con el centro cortado y luego estirándola de nuevo al tamaño original, como en la imagen a continuación:
El reto:
Escriba un programa que tome una imagen y la "monitorice" para usarla con una configuración de monitor dual (es decir, elimina la sección central de la imagen, donde están los biseles). Las reglas son las siguientes:
- Debe ser un programa completo que acepte la imagen, ya sea como una ruta (argumento de cadena, etc.) o en forma de diálogo de selección de archivo.
- El programa debe tomar como entrada el número de líneas verticales (un píxel de ancho) para recortar desde el centro de la imagen.
- El recorte debe venir del centro (ancho) de la imagen original
- La imagen resultante se debe volver a escalar al tamaño original de la imagen de entrada. (O las mitades se pueden escalar individualmente, y luego concatenarse, o concatenarse y luego escalar. Escalar individualmente produce una mejor imagen / efecto, pero apenas se nota en el mundo real)
- Las imágenes de fondo son generalmente uniformes, por lo que para facilitar este desafío, las imágenes de entrada solo tendrán un número par de píxeles, y el número de líneas para eliminar también será igual.
- Este desafío es el código de golf: el código más corto en bytes gana
¡Buena suerte!
code-golf
image-processing
dberm22
fuente
fuente
Respuestas:
Octava, 85 bytes
Define una función anónima con
f
el nombre del archivo yn
el número de columnas para eliminar. Como una función anónima requiere una sola expresión, se utiliza la asignación en línea, una característica que no está presente en MATLAB.MATLAB, 98 bytes
Como beneficio adicional, también jugué una respuesta compatible con MATLAB. Curiosamente, esto es solo 13 bytes más, ya que la versión Octave necesita muchos paréntesis para analizar correctamente las asignaciones en línea.
fuente
Matlab 2013, 150 bytes
Aquí está mi intento en Matlab. Definitivamente no será el código más corto, pero es un comienzo.
Advertencia, esto sobrescribe la imagen original, así que primero haga una copia.
Versión de golf
Código no reflejado, con mejoras para tamaños de imagen impares y número impar de columnas
fuente
os
etc., a cualquier otra letra del alfabeto! ¿Y por qué no simplemente volver a escribir la imagen en la imagen de entradaf
para guardar el conjuntostrcat
? (que, por cierto, puede reemplazar en['',...]
lugar destrcat(...)
)Wolfram Language,
134,127,119111 bytesCrea una función
f
que toma una imagen como la primera entrada (como un símbolo en Mathematica o Wolfram Cloud) y un número entero como la segunda entrada.Sin golf :
Técnicamente, no funcionará correctamente si cualquiera de las dimensiones de la imagen supera los 362.880 píxeles, pero supongo que está bien, ya que eso está muy fuera del alcance del problema (y algunas computadoras).¡Fijo!fuente
PHP, 206 bytes
toma tres argumentos de línea de comando: nombre del archivo de origen, número de líneas para recortar y nombre de archivo de destino. Corre con
-r
.Es posible que desee utilizar en
imagecopyresampled
lugar deimagecopyresized
(+2 bytes) para un mejor resultado.sin golf
Podría guardar 9 bytes más enviando el resultado PNG a STDOUT ... pero ¿para qué?
fuente
php -r image.php image.png 1 > output.png
, ¿verdad?