Vous l'appelez Centrage, je l'appelle Code Golf

16

"Avouons-le, les images alignées sont comme de petits cadeaux du ciel. Bienvenue, mais inattendu." - Géobits

+10000 points de réputation à celui qui remporte ce défi.

Règles:

1) Vous devez générer un programme.

2) L'entrée sera une image, mais qu'elle soit transmise sous forme de fichier ou de liste de nombres, c'est à vous de décider.

3) La sortie sera un fichier qui, une fois ouvert dans la peinture (ou similaire), montrera l'image alignée.

4) La taille du canevas sera toujours comprise entre 100 x 100 et 2000 x 2000 pixels. Ce sera toujours un rectangle, mais pas toujours un carré.

5) Pas de codage dur des images ni de magie d'URL géniale.

6) Aucune bibliothèque externe à utiliser.

Guide de centralisation (variante Joshpbarron)

Une image sera définie comme centrée si le 1er blanc (255,255,255,> 0 rgba) ou transparent (x, y, z, 0 rgba) sur un axe est à égale distance (plus ou moins 1 pixel) du bord de la toile.

Ceci peut être réalisé (et sera vérifié par) la méthode suivante.

1) Imaginez une boîte englobante autour de l'objet. (Lignes noires ajoutées pour obtenir de l'aide)

entrez la description de l'image ici

2) Déplacez l'objet jusqu'à ce que le bord de l'objet soit à égale distance du bord approprié de la toile.

entrez la description de l'image ici

3) Oubliez maintenant les lignes noires.

entrez la description de l'image ici

Contribution:

entrez la description de l'image ici

Production:

entrez la description de l'image ici

Plus d'entrées ici .

Et les sorties respectives ici .

Le représentant +10000 est un mensonge.

Joshpbarron
la source
le programme doit-il gérer des images entièrement blanches / transparentes?
Cristian Lupascu
Comme il n'y a rien à centrer, la même image doit être retournée. Idem pour les images sans espace vide.
Joshpbarron
Vous devez ajouter des détails sur les images pour lesquelles cela devrait fonctionner. Par exemple, cela devrait-il fonctionner pour une image qui contient un fond principalement blanc mais qui a des trous de transparence? Ou est-ce que la transparence signifie qu'il n'y aura pas de blanc, et vice versa.
bubalou
Désolé, mais l'explication est évidente. Les codes RBGA sont donnés.
Joshpbarron
Dans la description, vous parlez de la distance du 1er pixel blanc / transparent à partir d'un bord. Tu ne veux pas dire le premier non- blanc? Sinon, toutes les entrées d'échantillon sont déjà des solutions, car la distance du premier pixel blanc de chaque bord est de 0, donc celles distancées sont toutes égales.
Reto Koradi

Réponses:

0

Python 3, 120 205 octets

EDIT : Comme l'image de sortie doit avoir la même taille que l'entrée, le script s'allonge ...

EDIT2 : Il semble que la règle 6 (pas de bibliothèque externe) ait été ajoutée après avoir répondu, donc cette réponse doit être considérée comme invalide de toute façon :(

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

L'ancienne version vient de recadrer l'image d'entrée:

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

les deux scripts lisent le nom du fichier image depuis stdin et enregistrent l'image de sortie en tant que «o.png». par exemple :

python3 script.py <<< s2rMqYo.png

Il accepte au moins les images PNG (potentiellement avec un canal alpha) - Testé «ok» sur l'ensemble fourni par le demandeur.

... en attente de ma récompense):

diète
la source
1
Je ne peux pas tester cela à la minute, mais la taille du canevas de sortie correspond-elle à la taille du canevas d'entrée?
Joshpbarron
1
astuce pro pour vos futurs projets shell: python3 script.py <<< s2rMqYo.pngest plus propre
undergroundmonorail
1
La sortie doit être de la même taille que l'entrée, oui.
Joshpbarron
3
Vous utilisez une bibliothèque (PIL), ce qui n'est pas autorisé. (PIL ne peut pas être appelé comme faisant partie des bibliothèques standard, car il n'est pas inclus avec Python par défaut.)
marinus
2
@marinus Je pense que c'est un peu dur .. Cela aliène un grand nombre de langages de programmation.
Beta Decay
2

HTML5 + JavaScript (ES5), 515 octets

Ce nombre inclut les balises HTML car elles font partie du programme. Si vous ne comptez que le code de traitement d'image, il s'agit de 376 octets, y compris l'encapsuleur de fonction.

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

Contribution

Une URL vers une image.

Restrictions de sécurité

Étant donné que ce programme s'exécute dans un environnement de navigateur, seules les URL des images compatibles CORS fonctionneront. Imgur est compatible CORS.

IE 10 ne prend pas en charge CORS. Je n'ai pas encore testé dans IE 11 mais cela fonctionne dans Chrome et Firefox.

Comment courir

  1. Tapez / collez une URL dans le champ de saisie.
  2. Décentrer (tabulation / clic hors) du champ de saisie.

Production

Il sort sur le canevas de la page.

Comme il s'agit d'une application basée sur un navigateur, les restrictions de sécurité empêchent le téléchargement automatique d'un fichier, mais vous pouvez cliquer avec le bouton droit et enregistrer l'image dans Chrome et Firefox. Je n'ai pas encore testé sur IE 11.

Démo

Le code JavaScript a été supprimé de l' scriptélément et placé dans la zone appropriée pour accueillir les extraits de pile:

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
la source
Travail confirmé dans Edge. J'imagine que cela fonctionnerait également dans IE11.
Alex Van Liew
0

Traitement 2 - 323 450

L'image est lue à partir du fichier f.png dans le dossier de données de l'esquisse. Place l'image et détermine ses limites. Calcule la position correcte et remplace l'image décalée correctement.

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

version lisible:

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

Exemple de sortie:

entrez la description de l'image icientrez la description de l'image icientrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Vous pouvez obtenir le traitement ici

bubalou
la source
Pourriez-vous s'il vous plaît fournir un exemple de fichier de sortie pour moi de comparer.
Joshpbarron
C'est sympa ... mais pas tout à fait. Les images d'entrée ont un fond transparent.
Joshpbarron
1
"L'image est lue à partir du fichier f.png". Vraiment? Dans votre code, je vois cette ligne: PImage p=loadImage("h.png");tout en haut.
SirPython
color(-1)et background(-1)sont chacun 1 octet plus court que color(255)et background(255)respectivement. Et je pense que vous pouvez supprimer le P2Ddans l' sizeappel
Kritixi Lithos