Anda menyebutnya Centering, saya menyebutnya Golf Code

16

"Mari kita hadapi itu, gambar selaras seperti hadiah kecil dari Surga. Selamat datang, tapi tak terduga." - Geobit

+10000 reputasi bagi siapa pun yang memenangkan tantangan ini.

Aturan:

1) Anda harus membuat program.

2) Input akan berupa gambar, namun apakah dilewatkan sebagai file atau daftar angka terserah Anda.

3) Output akan berupa file yang ketika dibuka dalam cat (atau serupa) akan menunjukkan gambar selaras.

4) Ukuran kanvas akan selalu antara 100 x 100 dan 2000 x 2000 piksel. Itu akan selalu menjadi persegi panjang, tetapi tidak selalu persegi.

5) Tidak ada pengkodean gambar atau sulap URL yang funky.

6) Tidak ada perpustakaan eksternal yang digunakan.

Panduan untuk Sentralisasi (Varian Joshpbarron)

Sebuah gambar akan didefinisikan sebagai terpusat jika putih pertama (255.255.255,> 0 rgba) atau transparan (x, y, z, 0 rgba) pada suatu sumbu adalah jarak yang sama (plus atau minus 1 piksel) dari tepi kanvas.

Ini dapat dicapai (dan akan diverifikasi oleh) metode berikut.

1) Bayangkan sebuah kotak pembatas di sekitar objek. (Garis hitam ditambahkan untuk bantuan)

masukkan deskripsi gambar di sini

2) Gerakkan objek di sekitar sampai tepi objek berjarak sama dari tepi kanvas yang sesuai.

masukkan deskripsi gambar di sini

3) Sekarang lupakan garis hitam.

masukkan deskripsi gambar di sini

Memasukkan:

masukkan deskripsi gambar di sini

Keluaran:

masukkan deskripsi gambar di sini

Masukan lebih banyak di sini .

Dan output masing-masing di sini .

Rep +10000 adalah bohong.

Joshpbarron
sumber
haruskah program menangani gambar yang sepenuhnya putih / transparan?
Cristian Lupascu
Karena tidak ada apa-apa ke pusat, gambar yang sama harus dikembalikan. Sama untuk gambar tanpa ruang kosong.
Joshpbarron
Anda harus menambahkan beberapa spesifik pada gambar yang seharusnya berfungsi. Misalnya haruskah itu berfungsi untuk gambar yang kebanyakan berisi latar belakang putih tetapi memiliki lubang transparansi? Atau memiliki transparansi berarti tidak akan ada putih, dan sebaliknya.
bubalou
Maaf, tapi penjelasannya jelas. Kode RBGA diberikan.
Joshpbarron
Dalam deskripsi, Anda berbicara tentang jarak piksel putih / transparan 1 dari tepi. Bukankah maksud Anda yang bukan kulit putih? Jika tidak, semua input sampel sudah merupakan solusi, karena jarak piksel putih pertama dari masing-masing tepi adalah 0, sehingga semua yang berjarak semua sama.
Reto Koradi

Jawaban:

0

Python 3, 120 205 byte

EDIT : Karena gambar output harus memiliki ukuran yang sama dengan input, skrip menjadi lebih panjang ...

EDIT2 : Tampaknya aturan 6 (tidak ada perpustakaan eksternal) telah ditambahkan setelah saya menjawab, jadi jawaban ini tetap dianggap tidak valid :(

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

Versi sebelumnya hanya memotong gambar input:

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

kedua skrip membaca nama file gambar dari stdin, dan menyimpan gambar output sebagai 'o.png'. sebagai contoh :

python3 script.py <<< s2rMqYo.png

Ini menerima setidaknya gambar PNG (berpotensi dengan saluran alfa) - Diuji 'ok' pada set yang disediakan oleh penanya.

... menunggu hadiah saya):

pelaku diet
sumber
1
Saya tidak dapat menguji ini pada saat ini, tetapi apakah ukuran kanvas keluaran cocok dengan ukuran kanvas masukan?
Joshpbarron
1
tip pro untuk usaha shell masa depan Anda: python3 script.py <<< s2rMqYo.pnglebih bersih
undergroundmonorail
1
Outputnya harus sama dengan input, ya.
Joshpbarron
3
Anda menggunakan perpustakaan (PIL), yang tidak diizinkan. (PIL tidak dapat disebut bagian dari perpustakaan standar, karena tidak disertakan dengan Python secara default.)
marinus
2
@marinus Saya pikir ini agak keras .. Itu mengasingkan sejumlah besar bahasa pemrograman.
Beta Decay
2

HTML5 + JavaScript (ES5), 515 byte

Hitungan itu termasuk tag HTML karena merupakan bagian dari program. Jika Anda hanya menghitung kode pemrosesan gambar, itu adalah 376 byte termasuk pembungkus fungsi.

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

Memasukkan

URL ke gambar.

Pembatasan keamanan

Karena program ini berjalan di lingkungan browser, hanya URL ke gambar yang mendukung CORS yang akan berfungsi. Imgur diaktifkan CORS.

IE 10 tidak mendukung CORS. Saya belum menguji di IE 11, tetapi itu berfungsi di Chrome dan Firefox.

Bagaimana cara menjalankannya

  1. Ketik / rekatkan dalam URL ke dalam kolom input.
  2. Tidak fokus (tab / klik keluar) dari kolom input.

Keluaran

Ini output pada kanvas di halaman.

Karena ini adalah aplikasi berbasis browser, pembatasan keamanan mencegah pengunduhan otomatis file tetapi Anda dapat mengklik kanan dan menyimpan gambar di Chrome dan Firefox. Saya belum menguji pada IE 11.

Demo

Kode JavaScript telah dihapus dari scriptelemen dan dimasukkan ke area yang sesuai untuk mengakomodasi Stack Snippets:

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
sumber
Dikonfirmasi bekerja di Edge. Saya membayangkan itu akan berhasil di IE11 juga.
Alex Van Liew
0

Memproses 2 - 323 450

Gambar dibaca dari file f.png di folder data sketsa. Tempatkan gambar dan tentukan batasnya. Menghitung posisi yang benar dan mengganti gambar yang digeser dengan benar.

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

versi yang dapat dibaca:

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

Contoh output:

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Anda dapat memproses di sini

bubalou
sumber
Bisakah Anda memberikan sampel file output untuk saya bandingkan.
Joshpbarron
Itu bagus ... tapi tidak cukup. Gambar input memiliki latar belakang transparan.
Joshpbarron
1
"Gambar dibaca dari file f.png". Betulkah? Dalam kode Anda, saya melihat baris ini: PImage p=loadImage("h.png");di bagian paling atas.
SirPython
color(-1)dan background(-1)masing-masing 1 byte lebih pendek dari color(255)dan background(255)masing - masing. Dan saya pikir Anda dapat menghapus P2Ddalam sizepanggilan
Kritixi Lithos