Nazywasz to Centrowaniem, ja nazywam Code Golf

16

„Spójrzmy prawdzie w oczy, wyrównane obrazy są jak małe prezenty z Nieba. Witamy, ale nieoczekiwanie.” - Geobity

+10000 reputacji dla każdego, kto wygra to wyzwanie.

Zasady:

1) Masz wygenerować program.

2) Dane wejściowe będą obrazem, jednak niezależnie od tego, czy zostanie przesłany jako plik, czy lista numerów, zależy od Ciebie.

3) Wyjście będzie plikiem, który po otwarciu w farbie (lub podobnym) pokaże wyrównany obraz.

4) Rozmiar płótna zawsze będzie wynosił od 100 x 100 do 2000 x 2000 pikseli. Zawsze będzie to prostokąt, ale nie zawsze kwadrat.

5) Brak twardego kodowania obrazów lub funky magii URL.

6) Żadnych zewnętrznych bibliotek do użycia.

Przewodnik po centralizacji (wariant Joshpbarron)

Obraz zostanie zdefiniowany jako wyśrodkowany, jeśli 1. biały (255,255,255,> 0 rgba) lub przezroczysty (x, y, z, 0 rgba) na osi jest równej odległości (plus lub minus 1 piksel) od krawędzi obszaru roboczego.

Można to osiągnąć (i zostanie to zweryfikowane) następującą metodą.

1) Wyobraź sobie obwiednię wokół obiektu. (Dodano czarne linie w celu uzyskania pomocy)

wprowadź opis zdjęcia tutaj

2) Przesuwaj obiekt dookoła, aż krawędź obiektu znajdzie się w równej odległości od odpowiedniej krawędzi płótna.

wprowadź opis zdjęcia tutaj

3) Teraz zapomnij o czarnych liniach.

wprowadź opis zdjęcia tutaj

Wejście:

wprowadź opis zdjęcia tutaj

Wynik:

wprowadź opis zdjęcia tutaj

Więcej informacji tutaj .

I odpowiednie wyniki tutaj .

+10000 powtórzeń to kłamstwo.

Joshpbarron
źródło
czy program powinien obsługiwać całkowicie białe / przezroczyste obrazy?
Cristian Lupascu
Ponieważ nie ma nic do wyśrodkowania, należy zwrócić ten sam obraz. To samo dotyczy obrazów bez pustej przestrzeni.
Joshpbarron
Powinieneś dodać kilka szczegółów do obrazów, dla których to powinno działać. Na przykład, czy powinien on działać z obrazem, który zawiera głównie białe tło, ale ma otwory przezroczystości? Czy też posiadanie przezroczystości oznacza, że ​​nie będzie bieli i odwrotnie.
bubalou
Przepraszamy, ale wyjaśnienie jest oczywiste. Podane są kody RBGA.
Joshpbarron
W opisie mówimy o odległości pierwszego białego / przezroczystego piksela od krawędzi. Nie masz na myśli pierwszego? nie -białego? W przeciwnym razie wszystkie przykładowe dane wejściowe są już rozwiązaniami, ponieważ odległość pierwszego białego piksela od każdej krawędzi wynosi 0, więc wszystkie te odległości są równe.
Reto Koradi,

Odpowiedzi:

0

Python 3, 120 205 bajtów

EDYCJA : Ponieważ obraz wyjściowy musi mieć taki sam rozmiar jak wejście, skrypt staje się dłuższy ...

EDIT2 : Wygląda na to, że reguła 6 (brak biblioteki zewnętrznej) została dodana po tym, jak odpowiedziałem, więc i tak odpowiedź należy uznać za nieważną :(

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

Poprzednia wersja właśnie przycięła obraz wejściowy:

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

oba skrypty odczytują nazwę pliku obrazu ze standardowego wejścia i zapisują obraz wyjściowy jako „o.png”. na przykład :

python3 script.py <<< s2rMqYo.png

Akceptuje co najmniej obrazy PNG (potencjalnie z kanałem alfa) - Testowane „ok” na zestawie dostarczonym przez pytającego.

... czekam na moją nagrodę):

dieter
źródło
1
Nie mogę tego przetestować od razu, ale czy wyjściowy rozmiar płótna jest zgodny z rozmiarem płótna wejściowego?
Joshpbarron
1
Pro wskazówka dla twoich przyszłych starań o pociski: python3 script.py <<< s2rMqYo.pngjest czystsza
podziemny
1
Wyjście musi mieć taki sam rozmiar jak wejście, tak.
Joshpbarron
3
Korzystasz z biblioteki (PIL), co jest niedozwolone. (PIL nie może być nazywany częścią standardowych bibliotek, ponieważ nie jest domyślnie dołączony do Pythona).
marinus
2
@marinus Myślę, że jest to trochę trudne. To wyobcuje ogromną liczbę języków programowania.
Beta Decay
2

HTML5 + JavaScript (ES5), 515 bajtów

Liczba ta obejmuje tagi HTML, ponieważ są one częścią programu. Jeśli policzysz tylko kod przetwarzania obrazu, jest on 376 bajtów łącznie z opakowaniem funkcji.

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

Wejście

Adres URL obrazu.

Ograniczenia bezpieczeństwa

Ponieważ ten program działa w środowisku przeglądarki, będą działać tylko adresy URL obrazów obsługujących CORS . Imgur ma włączoną obsługę CORS.

IE 10 nie obsługuje CORS. Nie testowałem jeszcze w IE 11, ale działa w Chrome i Firefox.

Jak biegać

  1. Wpisz / wklej adres URL w polu wejściowym.
  2. Odznacz (pole / kliknięcie poza) w polu wprowadzania.

Wynik

Wyprowadza na kanwie na stronie.

Ponieważ jest to aplikacja oparta na przeglądarce, ograniczenia bezpieczeństwa uniemożliwiają automatyczne pobieranie pliku, ale możesz kliknąć prawym przyciskiem myszy i zapisać obraz w Chrome i Firefox. Nie testowałem jeszcze na IE 11.

Próbny

Kod JavaScript został usunięty z scriptelementu i umieszczony w odpowiednim obszarze, aby pomieścić fragmenty stosu:

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

lodowisko. dozorca 6
źródło
Potwierdzono pracę w Edge. Wyobrażam sobie, że działałoby to również w IE11.
Alex Van Liew
0

Przetwarzanie 2 - 323 450

Obraz jest odczytywany z pliku f.png w folderze danych szkicu. Umieszcza obraz i określa jego granice. Oblicza prawidłową pozycję i zastępuje poprawnie przesunięty obraz.

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

czytelna wersja:

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

Przykładowe dane wyjściowe:

wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Możesz uzyskać przetwarzanie tutaj

bubalou
źródło
Czy możesz podać przykładowy plik wyjściowy do porównania.
Joshpbarron
To miłe ... ale niezupełnie. Obrazy wejściowe mają przezroczyste tło.
Joshpbarron
1
„Obraz jest czytany z pliku f.png”. Naprawdę? W twoim kodzie widzę ten wiersz: PImage p=loadImage("h.png");na samej górze.
SirPython
color(-1)oraz background(-1)każdy bajt krócej niż 1 color(255)i background(255)odpowiednio. I myślę, że można usunąć P2Dw sizezaproszeniu
Kritixi Lithos