Lo chiami Centering, io lo chiamo Code Golf


16

"Ammettiamolo, le immagini allineate sono come piccoli doni dal cielo. Benvenuto, ma inaspettato." - Geobits

+10000 reputazione a chi vince questa sfida.

Regole:

1) Devi generare un programma.

2) L'input sarà un'immagine, tuttavia dipende dal fatto che venga passato come file o da un elenco di numeri.

3) L'output sarà un file che quando aperto in paint (o simile) mostrerà l'immagine allineata.

4) Le dimensioni della tela saranno sempre comprese tra 100 x 100 e 2000 x 2000 pixel. Sarà sempre un rettangolo, ma non sempre un quadrato.

5) Nessuna codifica rigida di immagini o magia URL funky.

6) Nessuna libreria esterna da utilizzare.

Guida alla centralizzazione (variante di Joshpbarron)

Un'immagine sarà definita centrata se il 1 ° bianco (255.255.255,> 0 rgba) o trasparente (x, y, z, 0 rgba) su un asse è uguale distanza (più o meno 1 pixel) dal bordo della tela.

Ciò può essere ottenuto (e sarà verificato da) il seguente metodo.

1) Immagina un rettangolo di selezione attorno all'oggetto. (Linee nere aggiunte per aiuto)

inserisci qui la descrizione dell'immagine

2) Spostare l'oggetto fino a quando il bordo dell'oggetto è uguale distanza dal bordo appropriato della tela.

inserisci qui la descrizione dell'immagine

3) Ora dimentica le linee nere.

inserisci qui la descrizione dell'immagine

Ingresso:

inserisci qui la descrizione dell'immagine

Produzione:

inserisci qui la descrizione dell'immagine

Più input qui .

E le rispettive uscite qui .

Il rappresentante +10000 è una bugia.


il programma dovrebbe gestire immagini completamente bianche / trasparenti?
Cristian Lupascu,

Poiché non c'è nulla al centro, la stessa immagine deve essere restituita. Lo stesso vale per le immagini senza spazio vuoto.
Joshpbarron,

Dovresti aggiungere alcuni dettagli alle immagini per cui dovrebbe funzionare. Ad esempio, dovrebbe funzionare per un'immagine che contiene uno sfondo prevalentemente bianco ma con buchi di trasparenza? Oppure avere trasparenza significa che non ci sarà bianco e viceversa.
bubalou,

Scusa, ma la spiegazione è ovvia. Vengono forniti i codici RBGA.
Joshpbarron,

Nella descrizione, parli della distanza del 1 ° pixel bianco / trasparente da un bordo. Non intendi il primo non bianco ? Altrimenti tutti gli input di esempio sono già soluzioni, perché la distanza del primo pixel bianco da ciascun bordo è 0, quindi quelli distanziati sono tutti uguali.
Reto Koradi,

Risposte:


0

Python 3, 120 205 byte

EDIT : poiché l'immagine di output deve avere le stesse dimensioni dell'input, lo script si allunga ...

EDIT2 : Sembra che la regola 6 (nessuna libreria esterna) sia stata aggiunta dopo che ho risposto, quindi questa risposta deve essere considerata non valida comunque :(

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 versione precedente ha appena ritagliato l'immagine di input:

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

entrambi gli script leggono il nome del file immagine da stdin e salvano l'immagine di output come 'o.png'. per esempio :

python3 script.py <<< s2rMqYo.png

Accetta almeno immagini PNG (potenzialmente con un canale alfa) - Testato "ok" sul set fornito dal richiedente.

... aspettando la mia ricompensa):


1
Non riesco a provarlo al minuto, ma le dimensioni del canvas di output corrispondono alle dimensioni del canvas di input?
Joshpbarron,

1
suggerimento pro per le tue future attività di conchiglia: python3 script.py <<< s2rMqYo.pngè più pulito
undergroundmonorail

1
L'output deve avere le stesse dimensioni dell'input, sì.
Joshpbarron,

3
Stai utilizzando una libreria (PIL), che non è consentita. (PIL non può essere chiamato parte delle librerie standard, perché non è incluso in Python per impostazione predefinita.)
marinus

2
@marinus Penso che questo sia un po 'duro .. Che alienano un numero enorme di linguaggi di programmazione.
Decadimento beta

2

HTML5 + JavaScript (ES5), 515 byte

Questo conteggio include i tag HTML in quanto fanno parte del programma. Se si contano solo i codici di elaborazione delle immagini, sono 376 byte incluso il wrapper di funzioni.

<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)>

Ingresso

Un URL per un'immagine.

Restrizioni di sicurezza

Poiché questo programma è in esecuzione in un ambiente browser, funzioneranno solo gli URL delle immagini abilitate per CORS . Imgur è abilitato per CORS.

IE 10 non supporta CORS. Non ho ancora testato in IE 11 ma funziona su Chrome e Firefox.

Come correre

  1. Digita / incolla un URL nel campo di input.
  2. De-focus (tab / click out of) dal campo di input.

Produzione

Emette sulla tela nella pagina.

Trattandosi di un'applicazione basata su browser, le restrizioni di sicurezza impediscono il download automatico di un file ma è possibile fare clic con il pulsante destro del mouse e salvare l'immagine in Chrome e Firefox. Non ho ancora testato su IE 11.

dimostrazione

Il codice JavaScript è stato rimosso scriptdall'elemento e inserito nell'area appropriata per ospitare frammenti di stack:

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)>


Confermato il lavoro in Edge. Immagino che funzionerebbe anche in IE11.
Alex Van Liew,

0

Elaborazione 2 - 323 450

L'immagine viene letta dal file f.png nella cartella dei dati dello schizzo. Posiziona l'immagine e determina i suoi limiti. Calcola la posizione corretta e sostituisce l'immagine spostata correttamente.

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");

versione leggibile:

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");

Esempio di output:

inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Puoi ottenere l'elaborazione qui


Potresti fornire un file di output di esempio da confrontare.
Joshpbarron,

È bello ... ma non del tutto. Le immagini di input hanno uno sfondo trasparente.
Joshpbarron,

1
"L'immagine viene letta dal file f.png". Veramente? Nel tuo codice, vedo questa riga: PImage p=loadImage("h.png");in cima.
SirPython,

color(-1) e background(-1) sono ogni 1 byte più brevi di color(255)e background(255)rispettivamente. E penso che puoi rimuovere il messaggio P2Dnella sizechiamata
Kritixi Lithos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.