Bạn gọi nó là Centering, tôi gọi nó là Code Golf


16

"Hãy đối mặt với nó, những hình ảnh được căn chỉnh giống như những món quà nhỏ từ Thiên đường. Chào mừng, nhưng thật bất ngờ." - Địa chất

+10000 danh tiếng cho bất cứ ai chiến thắng thử thách này.

Quy tắc:

1) Bạn phải tạo ra một chương trình.

2) Đầu vào sẽ là một hình ảnh, tuy nhiên liệu nó được truyền dưới dạng tệp hay danh sách các số là tùy thuộc vào bạn.

3) Đầu ra sẽ là một tập tin mà khi được mở bằng sơn (hoặc tương tự) sẽ hiển thị hình ảnh được căn chỉnh.

4) Kích thước vải sẽ luôn nằm trong khoảng từ 100 x 100 đến 2000 x 2000 pixel. Nó sẽ luôn là một hình chữ nhật, nhưng không phải luôn luôn là một hình vuông.

5) Không mã hóa cứng hình ảnh hoặc ma thuật URL sôi nổi.

6) Không có thư viện bên ngoài được sử dụng.

Hướng dẫn tập trung hóa (Biến thể Joshpbarron)

Một hình ảnh sẽ được xác định là chính giữa nếu màu trắng thứ nhất (255,255,255,> 0 rgba) hoặc trong suốt (x, y, z, 0 rgba) trên một trục có khoảng cách bằng nhau (cộng hoặc trừ 1 pixel) từ cạnh của khung vẽ.

Điều này có thể đạt được (và sẽ được xác minh bằng) phương pháp sau.

1) Tưởng tượng một hộp giới hạn xung quanh đối tượng. (Dòng màu đen được thêm vào để được giúp đỡ)

nhập mô tả hình ảnh ở đây

2) Di chuyển đối tượng xung quanh cho đến khi cạnh của đối tượng bằng khoảng cách từ cạnh thích hợp của khung vẽ.

nhập mô tả hình ảnh ở đây

3) Bây giờ hãy quên các đường màu đen.

nhập mô tả hình ảnh ở đây

Đầu vào:

nhập mô tả hình ảnh ở đây

Đầu ra:

nhập mô tả hình ảnh ở đây

Thêm đầu vào ở đây .

Và đầu ra tương ứng ở đây .

Đại diện +10000 là một lời nói dối.


chương trình nên xử lý hình ảnh hoàn toàn trắng / trong suốt?
Cristian Lupascu

Vì không có gì để căn giữa, nên trả lại cùng một hình ảnh. Tương tự cho hình ảnh không có không gian trống.
Joshpbarron

Bạn nên thêm một số chi tiết cụ thể về hình ảnh mà điều này sẽ làm việc cho. Ví dụ, nó có nên hoạt động đối với một hình ảnh chứa nền chủ yếu là màu trắng nhưng có lỗ trong suốt không? Hoặc không có độ trong suốt có nghĩa là sẽ không có màu trắng và ngược lại.
bubalou

Xin lỗi, nhưng lời giải thích là rõ ràng. Mã RBGA được đưa ra.
Joshpbarron

Trong phần mô tả, bạn nói về khoảng cách của pixel trắng / trong suốt thứ 1 từ một cạnh. Bạn không có nghĩa là người đầu tiên không -white? Mặt khác, tất cả các đầu vào mẫu đã là giải pháp, bởi vì khoảng cách của pixel trắng đầu tiên từ mỗi cạnh là 0, vì vậy những khoảng cách này đều bằng nhau.
Reto Koradi

Câu trả lời:


0

Python 3, 120 205 byte

EDIT : Vì hình ảnh đầu ra phải có cùng kích thước với đầu vào, tập lệnh sẽ dài hơn ...

EDIT2 : Có vẻ như quy tắc 6 (không có thư viện bên ngoài) đã được thêm sau khi tôi trả lời, vì vậy câu trả lời này vẫn được coi là không hợp lệ :(

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

Phiên bản cũ chỉ cắt xén hình ảnh đầu vào:

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

cả hai tập lệnh đều đọc tên tệp hình ảnh từ stdin và lưu hình ảnh đầu ra dưới dạng 'o.png'. ví dụ :

python3 script.py <<< s2rMqYo.png

Nó chấp nhận ít nhất là hình ảnh PNG (có khả năng có kênh alpha) - Đã kiểm tra 'ok' trên bộ do người hỏi cung cấp.

... đang chờ phần thưởng của tôi):


1
Tôi không thể kiểm tra điều này vào lúc này, nhưng kích thước canvas đầu ra có khớp với kích thước canvas đầu vào không?
Joshpbarron

1
mẹo chuyên nghiệp cho những nỗ lực trong tương lai của bạn: python3 script.py <<< s2rMqYo.pngsạch hơn
ngầm trong

1
Đầu ra phải có cùng kích thước với đầu vào, vâng.
Joshpbarron

3
Bạn đang sử dụng thư viện (PIL), không được phép. (PIL không thể được gọi là một phần của các thư viện chuẩn, bởi vì nó không được bao gồm trong Python theo mặc định.)
marinus

2
@marinus Tôi nghĩ rằng điều này là một chút khắc nghiệt .. Điều đó làm tha hóa một số lượng lớn ngôn ngữ lập trình.
Beta Decay

2

HTML5 + JavaScript (ES5), 515 byte

Số lượng đó bao gồm các thẻ HTML vì chúng là một phần của chương trình. Nếu bạn chỉ đếm mã xử lý hình ảnh, thì đó là 376 byte bao gồm cả trình bao bọc hàm.

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

Đầu vào

Một URL đến một hình ảnh.

Hạn chế bảo mật

Vì chương trình này đang chạy trong môi trường trình duyệt, chỉ các URL tới hình ảnh hỗ trợ CORS mới hoạt động. Imgur được bật CORS.

IE 10 không hỗ trợ CORS. Tôi chưa thử nghiệm trên IE 11 nhưng nó hoạt động trong Chrome và Firefox.

Cách chạy

  1. Nhập / dán URL vào trường đầu vào.
  2. Bỏ tiêu điểm (tab / nhấp chuột ra) từ trường đầu vào.

Đầu ra

Nó xuất ra trên khung vẽ trên trang.

Vì đây là một ứng dụng dựa trên trình duyệt, các hạn chế bảo mật ngăn tự động tải xuống tệp nhưng bạn có thể nhấp chuột phải và lưu hình ảnh trong Chrome và Firefox. Tôi chưa thử nghiệm trên IE 11.

Bản giới thiệu

Mã JavaScript đã được xóa khỏi scriptphần tử và đưa vào khu vực thích hợp để chứa 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)>


Khẳng định làm việc trong Edge. Tôi tưởng tượng nó cũng hoạt động trong IE11.
Alex Van Liew

0

Gia công 2 - 323 450

Hình ảnh được đọc từ tệp f.png trong thư mục dữ liệu của bản phác thảo. Đặt hình ảnh và xác định giới hạn của nó. Tính toán vị trí chính xác và thay thế hình ảnh được dịch chuyển chính xác.

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

phiên bản có thể đọc được:

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

Ví dụ đầu ra:

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Bạn có thể xử lý ở đây


Bạn có thể vui lòng cung cấp một tập tin đầu ra mẫu để tôi so sánh.
Joshpbarron

Thật tuyệt ... nhưng không hẳn. Các hình ảnh đầu vào có một nền trong suốt.
Joshpbarron

1
"Hình ảnh được đọc từ tệp f.png". Có thật không? Trong mã của bạn, tôi thấy dòng này: PImage p=loadImage("h.png");ở trên cùng.
SirPython 6/07/2015

color(-1)background(-1)mỗi 1 byte ngắn hơn color(255)background(255)tương ứng. Và tôi nghĩ bạn có thể loại bỏ các P2Dtrong sizecuộc gọi
Kritixi Lithos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.