Buna Merkezleme diyorum, Kod Golf diyorum


16

"Kabul edelim, hizalanmış görüntüler Cennetten küçük hediyeler gibidir. Hoş geldiniz, ama beklenmedik." - Geobits

Bu mücadeleyi kimin kazandığına +10000 itibar.

Kurallar:

1) Bir program oluşturmalısınız.

2) Girdi bir görüntü olacaktır, ancak bir dosya olarak mı yoksa bir numara listesi mi size ait.

3) Çıktı, boyayla açıldığında (veya benzeri) görüntüyü hizalanmış olarak gösteren bir dosya olacaktır.

4) Tuval boyutu her zaman 100 x 100 ve 2000 x 2000 piksel arasında olacaktır. Her zaman bir dikdörtgen olur, ancak her zaman bir kare olmaz.

5) Hiçbir sabit kodlama kodu veya korkak URL büyü.

6) Harici kütüphaneler kullanılamaz.

Merkezileştirme Rehberi (Joshpbarron Varyantı)

Bir eksendeki 1. beyaz (255,255,255,> 0 rgba) veya saydam (x, y, z, 0 rgba), tuvalin kenarından eşit uzaklıkta (artı veya eksi 1 piksel) bir görüntü ortalanmış olarak tanımlanır.

Bu, aşağıdaki yöntemle elde edilebilir (ve doğrulanacaktır).

1) Nesnenin etrafında sınırlayıcı bir kutu düşünün. (Yardım için siyah çizgiler eklendi)

resim açıklamasını buraya girin

2) Nesnenin kenarı, tuvalin uygun kenarından eşit mesafede oluncaya kadar nesneyi hareket ettirin.

resim açıklamasını buraya girin

3) Şimdi siyah çizgileri unutun.

resim açıklamasını buraya girin

Giriş:

resim açıklamasını buraya girin

Çıktı:

resim açıklamasını buraya girin

Burada daha fazla girdi .

Ve ilgili çıktılar burada .

+10000 temsilcisi bir yalandır.


program tamamen beyaz / şeffaf görüntüleri işlemeli mi?
Cristian Lupascu

Ortalanacak hiçbir şey olmadığından, aynı görüntü döndürülmelidir. Boş alanı olmayan görüntüler için aynıdır.
Joshpbarron

Bunun çalışması gereken görüntülere bazı özellikler eklemelisiniz. Örneğin, çoğunlukla beyaz bir arka plan içeren ancak saydamlık delikleri olan bir görüntü için mi çalışmalıdır? Yoksa şeffaflığa sahip olmak beyazın olmayacağı anlamına gelir mi, yoksa tam tersi.
bubalou

Üzgünüm, ama açıklama ortada. RBGA kodları verilmiştir.
Joshpbarron

Açıklamada, 1. beyaz / saydam pikselin bir kenardan uzaklığı hakkında konuşuyorsunuz. İlk beyaz olmayan demek istemiyor musun ? Aksi takdirde, tüm örnek girişleri zaten çözümdür, çünkü ilk beyaz pikselin her kenardan uzaklığı 0'dır, bu yüzden mesafeli olanların hepsi eşittir.
Reto Koradi

Yanıtlar:


0

Piton 3, 120 205 bayt

DÜZENLE : Çıktı görüntüsü girişle aynı boyuta sahip olması gerektiğinden, komut dosyası uzar ...

EDIT2 : Görünüşe göre cevap verdikten sonra kural 6 (harici kütüphane yok) eklendi, bu nedenle bu cevap geçersiz sayılmalı :(

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

Eski sürüm giriş görüntüsünü kırptı:

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

her iki komut dosyası da görüntü dosyası adını stdin'den okur ve çıktı görüntüsünü 'o.png' olarak kaydeder. Örneğin :

python3 script.py <<< s2rMqYo.png

En azından PNG görüntülerini (potansiyel olarak bir alfa kanalı ile) kabul eder - Asker tarafından sağlanan sette 'tamam' test edildi.

... ödülümü bekliyorum):


1
Bunu şu anda test edemiyorum, ancak çıktı tuval boyutu giriş tuval boyutuyla eşleşiyor mu?
Joshpbarron

1
gelecekteki kabuk çabalarınız için profesyonel ipucu: python3 script.py <<< s2rMqYo.pngtemiz
undergroundmonorail

1
Çıkış, girişle aynı boyutta olmalıdır, evet.
Joshpbarron

3
İzin verilmeyen bir kütüphane (PIL) kullanıyorsunuz. (PIL, standart kütüphanelerin bir parçası olarak adlandırılamaz, çünkü varsayılan olarak Python'a dahil değildir.)
marinus

2
@marinus Bunun biraz sert olduğunu düşünüyorum .. Bu çok sayıda programlama dilini yabancılaştırıyor.
Beta Çürümesi

2

HTML5 + JavaScript (ES5), 515 bayt

Bu sayı, programın bir parçası oldukları için HTML etiketlerini içerir. Yalnızca görüntü işleme kodunu sayarsanız , işlev sarmalayıcı dahil 376 bayttır .

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

Giriş

Görüntünün URL'si.

Güvenlik kısıtlamaları

Bu program bir tarayıcı ortamında çalıştığından, yalnızca CORS etkin resimlere ait URL'ler çalışır. Imgur CORS etkin.

IE 10, CORS'i desteklemez. Henüz IE 11'de test etmedim ancak Chrome ve Firefox'ta çalışıyor.

Nasıl çalıştırılır

  1. Giriş alanına bir URL yazın / yapıştırın.
  2. Giriş alanından odaklamayı kaldırın (sekme / tıklama).

Çıktı

Sayfadaki tuval üzerine çıktı.

Bu, tarayıcı tabanlı bir uygulama olduğundan, güvenlik kısıtlamaları bir dosyanın otomatik olarak indirilmesini önler, ancak Chrome ve Firefox'ta resmi sağ tıklayıp kaydedebilirsiniz. Henüz IE 11 üzerinde test yapmadım.

gösteri

JavaScript kodu scriptöğeden kaldırıldı ve Yığın Parçacıkları için uygun alana yerleştirildi:

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


Edge'de çalıştığı onaylandı. IE11'de de işe yarayacağını hayal ediyorum.
Alex Van Liew

0

İşleme 2 - 323 450

Resim, çizimin veri klasöründeki f.png dosyasından okunur. Görüntüyü yerleştirir ve sınırlarını belirler. Doğru konumu hesaplar ve doğru kaydırılan görüntünün yerini alır.

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

okunabilir versiyon:

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

Örnek çıktı:

resim açıklamasını buraya girinresim açıklamasını buraya girinresim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin

Buradan işleme alabilirsiniz


Karşılaştırmak için lütfen örnek bir çıktı dosyası sağlayabilir misiniz?
Joshpbarron

Güzel ... ama pek de değil. Giriş görüntüleri şeffaf bir arka plana sahiptir.
Joshpbarron

1
Msgstr "Görüntü f.png dosyasından okunur". Gerçekten mi? Kodunuzda şu satırı görüyorum: PImage p=loadImage("h.png");en üstte.
SirPython

color(-1)ve background(-1)her biri sırasıyla 1 bayt color(255)ve daha kısadır background(255). Ve seni kaldırabilir düşünmek P2Dde sizeçağrı
Kritixi Lithos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.