Lo llamas Centrado, lo llamo Code Golf

16

"Seamos realistas, las imágenes alineadas son como pequeños regalos del cielo. Bienvenido, pero inesperado". - Geobits

+10000 reputación a quien gane este desafío.

Reglas:

1) Debes generar un programa.

2) La entrada será una imagen, sin embargo, si se pasa como un archivo o una lista de números depende de usted.

3) La salida será un archivo que cuando se abra en paint (o similar) mostrará la imagen alineada.

4) El tamaño del lienzo siempre estará entre 100 x 100 y 2000 x 2000 píxeles. Siempre será un rectángulo, pero no siempre un cuadrado.

5) Sin codificación rígida de imágenes o magia de URL funky.

6) No se utilizarán bibliotecas externas.

Guía de centralización (variante Joshpbarron)

Una imagen se definirá como centrada si el primer blanco (255,255,255,> 0 rgba) o transparente (x, y, z, 0 rgba) en un eje está a la misma distancia (más o menos 1 píxel) desde el borde del lienzo.

Esto se puede lograr (y se verificará mediante) el siguiente método.

1) Imagine un cuadro delimitador alrededor del objeto. (Líneas negras agregadas para ayuda)

ingrese la descripción de la imagen aquí

2) Mueva el objeto alrededor hasta que el borde del objeto esté a la misma distancia del borde apropiado del lienzo.

ingrese la descripción de la imagen aquí

3) Ahora olvida las líneas negras.

ingrese la descripción de la imagen aquí

Entrada:

ingrese la descripción de la imagen aquí

Salida:

ingrese la descripción de la imagen aquí

Más entradas aquí .

Y salidas respectivas aquí .

El representante de +10000 es una mentira.

Joshpbarron
fuente
¿Debería el programa manejar imágenes completamente blancas / transparentes?
Cristian Lupascu
Como no hay nada que centrar, se debe devolver la misma imagen. Lo mismo para las imágenes sin espacio vacío.
Joshpbarron
Debe agregar algunos detalles sobre las imágenes para las que esto debería funcionar. Por ejemplo, ¿debería funcionar para una imagen que contiene un fondo mayormente blanco pero que tiene agujeros de transparencia? O tener transparencia significa que no habrá blanco, y viceversa.
bubalou
Lo siento, pero la explicación es obvia. Se dan códigos RBGA.
Joshpbarron
En la descripción, habla sobre la distancia del primer píxel blanco / transparente desde un borde. ¿No te refieres al primer no blanco? De lo contrario, todas las entradas de muestra ya son soluciones, porque la distancia del primer píxel blanco desde cada borde es 0, por lo que los distanciados son todos iguales.
Reto Koradi

Respuestas:

0

Python 3, 120 205 bytes

EDITAR : como la imagen de salida debe tener el mismo tamaño que la entrada, el script se alarga ...

EDIT2 : Parece que la regla 6 (sin biblioteca externa) se ha agregado después de que respondí, por lo que esta respuesta se considerará no válida de todos modos :(

from PIL.Image import*;from PIL.ImageOps import*
c='RGB';i=open(input()).convert(c);w,h=i.size
o,a=new(c,(w,h),'white'),i.crop(invert(i).getbbox())
e,f=a.size;o.paste(a,((w-e)//2,(h-f)//2));o.save('o.png')

La versión anterior acaba de recortar la imagen de entrada:

from PIL.Image import*;from PIL.ImageOps import*
i=open(input()).convert('RGB')
i.crop(invert(i).getbbox()).save('o.png')

ambos scripts leen el nombre del archivo de imagen desde stdin y guardan la imagen de salida como 'o.png'. por ejemplo :

python3 script.py <<< s2rMqYo.png

Acepta al menos imágenes PNG (potencialmente con un canal alfa): probado 'ok' en el conjunto proporcionado por el autor de la pregunta.

... esperando mi recompensa):

dieter
fuente
1
No puedo probar esto en el momento, pero ¿el tamaño del lienzo de salida coincide con el tamaño del lienzo de entrada?
Joshpbarron
1
consejo profesional para tus futuros proyectos de shell: python3 script.py <<< s2rMqYo.pnges más limpio
undergroundmonorail
1
La salida debe ser del mismo tamaño que la entrada, sí.
Joshpbarron
3
Estás utilizando una biblioteca (PIL), que no está permitida. (PIL no puede ser llamado parte de las bibliotecas estándar, ya que no está incluido en Python por defecto.)
marinus
2
@marinus Creo que esto es un poco duro ... Eso aliena una gran cantidad de lenguajes de programación.
Beta Decay
2

HTML5 + JavaScript (ES5), 515 bytes

Ese recuento incluye las etiquetas HTML, ya que son parte del programa. Si solo cuenta el código de procesamiento de imágenes, son 376 bytes, incluido el contenedor de funciones.

<canvas id=o></canvas><script>f=function(p){o=new Image();o.crossOrigin='Anonymous';o.src=p;o.onload=function(){v=document.getElementById('o'),c=v.getContext('2d');v.width=l=w=o.width;v.height=t=h=o.height;c.drawImage(o,0,0);for(k=255,d=c[g='getImageData'](0,0,w,h).data,r=b=i=0;i<d.length;)if((d[i++]<k||d[i++]<k||d[i++]<k)&&d[i++]){x=i/4%w;y=~~(i/4/w);l=l<x?l:x;t=t<y?t:y;b=b>y?b:y;r=r>x?r:x}n=c[g](l,t,r-l+1,b-t+1);c.clearRect(0,0,w,h);c.putImageData(n,(w-r+l)/2,(h-b+t)/2)}}</script><input onblur=f(this.value)>

Entrada

Una URL a una imagen.

Restricciones de seguridad

Debido a que este programa se ejecuta en un entorno de navegador, solo funcionarán las URL para imágenes habilitadas para CORS . Imgur está habilitado para CORS.

IE 10 no es compatible con CORS. Todavía no he probado en IE 11 pero funciona en Chrome y Firefox.

Como correr

  1. Escriba / pegue una URL en el campo de entrada.
  2. Desenfoque (pestaña / clic fuera) del campo de entrada.

Salida

Se muestra en el lienzo de la página.

Como se trata de una aplicación basada en navegador, las restricciones de seguridad impiden la descarga automática de un archivo, pero puede hacer clic derecho y guardar la imagen en Chrome y Firefox. Todavía no he probado en IE 11.

Manifestación

El código JavaScript se ha eliminado del scriptelemento y se ha colocado en el área adecuada para acomodar fragmentos de pila:

f = function(p) {
  o = new Image();
  o.crossOrigin = 'Anonymous';
  o.src = p;
  o.onload = function() {
    v = document.getElementById('o'), c = v.getContext('2d');
    v.width = l = w = o.width;
    v.height = t = h = o.height;
    c.drawImage(o, 0, 0);
    for (k = 255, d = c[g = 'getImageData'](0, 0, w, h).data, r = b = i = 0; i < d.length;)
      if ((d[i++] < k || d[i++] < k || d[i++] < k) && d[i++]) {
        x = i / 4 % w;
        y = ~~(i / 4 / w);
        l = l < x ? l : x;
        t = t < y ? t : y;
        b = b > y ? b : y;
        r = r > x ? r : x
      }
    n = c[g](l, t, r - l + 1, b - t + 1);
    c.clearRect(0, 0, w, h);
    c.putImageData(n, (w - r + l) / 2, (h - b + t) / 2)
  }
}
<canvas id=o></canvas>
<input onblur=f(this.value)>

rink.attendant.6
fuente
Confirmado trabajando en Edge. Me imagino que también funcionaría en IE11.
Alex Van Liew
0

Procesamiento 2 - 323 450

La imagen se lee del archivo f.png en la carpeta de datos del boceto. Coloca la imagen y determina sus límites. Calcula la posición correcta y reemplaza la imagen desplazada correctamente.

PImage p=loadImage("h.png");int a,b,c,d,x,y,w,i,n,m,t;a=w=p.width;c=i=p.height;clear();size(w,i,P2D);x=y=b=d=t=0;image(p,0,0);loadPixels();while(x<w*i){if(pixels[x]==color(255))t=1;x++;}x=0;background(255);image(p,0,0);loadPixels();while(y*w+x<w*i){if(pixels[y*w+x]!=color(255)){if(x<a)a=x;if(x>b)b=x;if(y<c)c=y;if(y>d)d=y;}x++;if(x==w){x=0;y++;}}n=(w-(b-a))/2;m=(i-(d-c))/2;clear();if(t>0)background(255);image(p,n-a,m-c);loadPixels();save("g.png");

versión legible:

PImage p=loadImage("h.png");
int a,b,c,d,x,y,w,i,n,m,t;
a=w=p.width;
c=i=p.height;
clear();
size(w,i,P2D);
x=y=b=d=t=0;
image(p,0,0);
loadPixels();
while(x<w*i)
{
 if(pixels[x]==color(255))t=1;
 x++;
}
x=0;
background(255);
image(p,0,0);
loadPixels(); 
while(y*w+x<w*i)
{
 if(pixels[y*w+x]!=color(255))
 {
   if(x<a)a=x;
   if(x>b)b=x;
   if(y<c)c=y;
   if(y>d)d=y;
 }
 x++;
 if(x==w){x=0;y++;}
}
n=(w-(b-a))/2;
m=(i-(d-c))/2;
clear();
if(t>0)background(255);
image(p,n-a,m-c);
loadPixels();
save("g.png");

Salida de ejemplo:

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Puedes obtener el procesamiento aquí

bubalou
fuente
¿Podría por favor proporcionarme un archivo de salida de muestra para que pueda comparar?
Joshpbarron
Está bien ... pero no del todo. Las imágenes de entrada tienen un fondo transparente.
Joshpbarron
1
"La imagen se lee del archivo f.png". De Verdad? En su código, veo esta línea: PImage p=loadImage("h.png");en la parte superior.
SirPython
color(-1)y background(-1)son 1 byte más cortos que color(255)y background(255)respectivamente. Y creo que puede eliminar el P2Den la sizellamada
Kritixi Lithos