Du nennst es Zentrieren, ich nenne es Code Golf

16

"Seien wir ehrlich, ausgerichtete Bilder sind wie kleine Geschenke vom Himmel. Willkommen, aber unerwartet." - Geobits

+10000 Ruf für jeden, der diese Herausforderung gewinnt.

Regeln:

1) Sie generieren ein Programm.

2) Die Eingabe ist ein Bild, es liegt jedoch an Ihnen, ob es als Datei oder als Liste von Zahlen übergeben wird.

3) Die Ausgabe ist eine Datei, die beim Öffnen in Farbe (oder ähnlichem) das Bild ausgerichtet anzeigt.

4) Die Leinwandgröße liegt immer zwischen 100 x 100 und 2000 x 2000 Pixel. Es wird immer ein Rechteck sein, aber nicht immer ein Quadrat.

5) Keine harte Kodierung von Bildern oder funky URL Magie.

6) Es dürfen keine externen Bibliotheken verwendet werden.

Leitfaden zur Zentralisierung (Joshpbarron-Variante)

Ein Bild wird als zentriert definiert, wenn das erste Weiß (255,255,255,> 0 rgba) oder Transparent (x, y, z, 0 rgba) auf einer Achse den gleichen Abstand (plus oder minus 1 Pixel) vom Rand der Leinwand hat.

Dies kann durch die folgende Methode erreicht werden (und wird durch diese überprüft).

1) Stellen Sie sich einen Begrenzungsrahmen um das Objekt vor. (Schwarze Linien zur Hilfe hinzugefügt)

Bildbeschreibung hier eingeben

2) Bewegen Sie das Objekt, bis die Kante des Objekts den gleichen Abstand von der entsprechenden Kante der Leinwand hat.

Bildbeschreibung hier eingeben

3) Vergessen Sie jetzt die schwarzen Linien.

Bildbeschreibung hier eingeben

Eingang:

Bildbeschreibung hier eingeben

Ausgabe:

Bildbeschreibung hier eingeben

Weitere Eingaben hier .

Und entsprechende Ausgänge hier .

Die +10000 Wiederholung ist eine Lüge.

Joshpbarron
quelle
Sollte das Programm vollständig weiße / transparente Bilder verarbeiten?
Cristian Lupascu
Da nichts zu zentrieren ist, sollte dasselbe Bild zurückgegeben werden. Gleiches gilt für Bilder ohne Leerzeichen.
Joshpbarron
Sie sollten einige Details zu den Bildern hinzufügen, für die dies funktionieren soll. Sollte es beispielsweise für ein Bild funktionieren, das einen überwiegend weißen Hintergrund enthält, aber Transparenzlöcher aufweist? Oder bedeutet Transparenz, dass es kein Weiß gibt und umgekehrt.
Bubalou
Entschuldigung, aber die Erklärung ist offensichtlich. RBGA-Codes sind angegeben.
Joshpbarron
In der Beschreibung sprechen Sie über den Abstand des ersten weißen / transparenten Pixels von einer Kante. Meinst du nicht die erste? nicht- weiße? Andernfalls sind alle Abtastwerteingaben bereits Lösungen, da der Abstand des ersten weißen Pixels von jeder Kante 0 ist, so dass die Abstände alle gleich sind.
Reto Koradi

Antworten:

0

Python 3, 120 205 Bytes

BEARBEITEN : Da das Ausgabebild die gleiche Größe wie die Eingabe haben muss, wird das Skript länger ...

EDIT2 : Es scheint, dass die Regel 6 (keine externe Bibliothek) hinzugefügt wurde, nachdem ich geantwortet habe, daher ist diese Antwort sowieso als ungültig anzusehen :(

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

In der vorherigen Version wurde das Eingabebild nur zugeschnitten:

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

Beide Skripte lesen den Namen der Bilddatei aus stdin und speichern das Ausgabebild als 'o.png'. zum Beispiel :

python3 script.py <<< s2rMqYo.png

Es akzeptiert mindestens PNG-Bilder (möglicherweise mit einem Alphakanal). - Auf dem vom Fragesteller bereitgestellten Set als "OK" getestet.

... warte auf meine Belohnung):

Dieter
quelle
1
Ich kann dies momentan nicht testen, aber stimmt die Größe des Ausgabebereichs mit der Größe des Eingabebereichs überein?
Joshpbarron
1
Pro-Tipp für Ihre zukünftigen Shell-Bemühungen: python3 script.py <<< s2rMqYo.pngIst sauberer
Undergroundmonorail
1
Die Ausgabe muss dieselbe Größe haben wie die Eingabe, ja.
Joshpbarron
3
Sie verwenden eine Bibliothek (PIL), die nicht zulässig ist. (PIL kann nicht als Teil der Standardbibliotheken bezeichnet werden, da es standardmäßig nicht in Python enthalten ist.)
marinus
2
@marinus Ich denke, das ist ein bisschen hart. Das verfremdet eine große Anzahl von Programmiersprachen.
Beta Decay
2

HTML5 + JavaScript (ES5), 515 Byte

Diese Zählung schließt die HTML-Tags ein, da sie Teil des Programms sind. Wenn Sie nur den Bildverarbeitungscode zählen, sind es 376 Byte, einschließlich des Funktionswrappers.

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

Eingang

Eine URL zu einem Bild.

Sicherheitsbeschränkungen

Da dieses Programm in einer Browserumgebung ausgeführt wird, funktionieren nur URLs zu CORS-fähigen Bildern . Imgur ist CORS-fähig.

IE 10 unterstützt CORS nicht. Ich habe in IE 11 noch nicht getestet, aber es funktioniert in Chrome und Firefox.

Wie läuft man?

  1. Geben Sie eine URL in das Eingabefeld ein.
  2. Deaktivieren (Tabulator / Klick aus) aus dem Eingabefeld.

Ausgabe

Es wird auf der Leinwand auf der Seite ausgegeben.

Da dies eine browserbasierte Anwendung ist, verhindern Sicherheitsbeschränkungen das automatische Herunterladen einer Datei. Sie können jedoch mit der rechten Maustaste klicken und das Bild in Chrome und Firefox speichern. Ich habe noch nicht auf IE 11 getestet.

Demo

JavaScript-Code wurde aus dem scriptElement entfernt und in den entsprechenden Bereich eingefügt, um Stapel-Snippets aufzunehmen:

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
quelle
Bestätigt das Arbeiten in Edge. Ich stelle mir vor, es würde auch im IE11 funktionieren.
Alex Van Liew
0

Verarbeitung 2 - 323 450

Das Bild wird aus der Datei f.png im Datenordner der Skizze gelesen. Platziert das Bild und bestimmt seine Grenzen. Berechnet die korrekte Position und ersetzt das korrekt verschobene Bild.

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

lesbare Version:

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

Beispielausgabe:

Bildbeschreibung hier eingebenBildbeschreibung hier eingebenBildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Sie können erhalten die Verarbeitung hier

bubalou
quelle
Könnten Sie mir bitte eine Musterausgabedatei zum Vergleich zur Verfügung stellen?
Joshpbarron
Es ist schön ... aber nicht ganz. Die Eingabebilder haben einen transparenten Hintergrund.
Joshpbarron
1
"Bild wird aus der Datei f.png gelesen". "Ja wirklich?" In Ihrem Code sehe ich diese Zeile: PImage p=loadImage("h.png");ganz oben.
SirPython
color(-1)und background(-1)sind jeweils 1 Byte kürzer als color(255)und background(255). Und ich denke, Sie können die P2Dim sizeAnruf entfernen
Kritixi Lithos