คุณเรียกว่ากึ่งกลางฉันเรียกมันว่า Code Golf


16

"ลองดูสิภาพที่จัดเรียงนั้นเหมือนของขวัญเล็กน้อยจากสวรรค์ยินดีต้อนรับ แต่ไม่คาดคิด" - Geobits

มากกว่า 10,000 ชื่อเสียงให้กับใครก็ตามที่ชนะการท้าทายนี้

กฎ:

1) คุณต้องสร้างโปรแกรม

2) อินพุตจะเป็นรูปภาพอย่างไรก็ตามไม่ว่าจะผ่านเป็นไฟล์หรือรายการหมายเลขขึ้นอยู่กับคุณ

3) เอาท์พุทจะเป็นไฟล์ที่เมื่อเปิดในสี (หรือคล้ายกัน) จะแสดงภาพที่จัดตำแหน่ง

4) ขนาดผ้าใบจะอยู่ระหว่าง 100 x 100 และ 2000 x 2000 พิกเซล มันจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ แต่ไม่ใช่รูปสี่เหลี่ยมเสมอ

5) ไม่มีการเข้ารหัสอย่างหนักของภาพหรือมายากล URL ที่ขี้ขลาด

6) ไม่มีไลบรารีภายนอกที่จะใช้

คู่มือการรวมศูนย์ (ตัวแปร Joshpbarron)

รูปภาพจะถูกกำหนดให้อยู่กึ่งกลางถ้าสีขาวตัวที่ 1 (255,255,255,> 0 rgba) หรือโปร่งแสง (x, y, z, 0 rgba) บนแกนคือระยะทางที่เท่ากัน (บวกหรือลบ 1 พิกเซล) จากขอบของผืนผ้าใบ

สามารถทำได้ (และจะถูกตรวจสอบโดย) วิธีการดังต่อไปนี้

1) ลองนึกภาพกล่องรอบวัตถุ (เพิ่มเส้นสีดำเพื่อขอความช่วยเหลือ)

ป้อนคำอธิบายรูปภาพที่นี่

2) ย้ายวัตถุไปรอบ ๆ จนกว่าขอบของวัตถุจะมีระยะห่างเท่ากันจากขอบผ้าใบที่เหมาะสม

ป้อนคำอธิบายรูปภาพที่นี่

3) ลืมเส้นสีดำ

ป้อนคำอธิบายรูปภาพที่นี่

การป้อนข้อมูล:

ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

ปัจจัยการผลิตอื่น ๆที่นี่

และผลที่เกี่ยวข้องที่นี่

ตัวแทน +10000 เป็นเรื่องโกหก


โปรแกรมควรจัดการภาพขาว / ใสอย่างสมบูรณ์หรือไม่
Cristian Lupascu

เนื่องจากไม่มีสิ่งใดอยู่ตรงกลางภาพเดียวกันควรถูกส่งคืน เหมือนกันสำหรับรูปภาพที่ไม่มีพื้นที่ว่าง
Joshpbarron

คุณควรเพิ่มรายละเอียดเกี่ยวกับภาพที่ควรใช้ ตัวอย่างเช่นควรใช้กับภาพที่มีพื้นหลังสีขาวเป็นส่วนใหญ่ แต่มีรูโปร่งหรือไม่ หรือมีความโปร่งใสหมายความว่าจะไม่มีสีขาวและในทางกลับกัน
bubalou

ขออภัยคำอธิบายนั้นชัดเจน รับรหัส RBGA
Joshpbarron

ในคำอธิบายคุณพูดถึงระยะทางของพิกเซลขาว / ใสที่ 1 จากขอบ คุณไม่ได้หมายความว่าคนแรกที่ไม่ใช่สีขาว? ไม่เช่นนั้นอินพุตตัวอย่างทั้งหมดจะเป็นวิธีแก้ปัญหาอยู่แล้วเนื่องจากระยะทางของพิกเซลสีขาวแรกจากแต่ละขอบคือ 0 ดังนั้นระยะห่างเหล่านั้นจึงเท่ากันหมด
Reto Koradi

คำตอบ:


0

Python 3, 120 205 ไบต์

แก้ไข : ในขณะที่ภาพออกจะต้องมีขนาดเดียวกับอินพุตสคริปต์ได้อีกต่อไป ...

แก้ไข 2 : ดูเหมือนว่ากฎ 6 (ไม่มีห้องสมุดภายนอก) ได้รับการเพิ่มหลังจากที่ฉันตอบดังนั้นคำตอบนี้จะถือว่าไม่ถูกต้องแล้ว :(

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

เวอร์ชันก่อนหน้าตัดภาพอินพุต:

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

สคริปต์ทั้งสองอ่านชื่อไฟล์ภาพจาก stdin และบันทึกภาพเอาต์พุตเป็น 'o.png' ตัวอย่างเช่น :

python3 script.py <<< s2rMqYo.png

ยอมรับรูปภาพ PNG อย่างน้อย (อาจมีช่องอัลฟ่า) - ทดสอบ 'ตกลง' ในชุดที่ผู้ถามเตรียมไว้

... กำลังรอรางวัลของฉัน):


1
ฉันไม่สามารถทดสอบได้ในนาทีนี้ แต่ขนาดภาพออกงานตรงกับขนาดภาพเข้าจริงหรือไม่?
Joshpbarron

1
เคล็ดลับสำหรับการpython3 script.py <<< s2rMqYo.png
ทดลองใช้

1
เอาต์พุตต้องมีขนาดเท่ากับอินพุตใช่
Joshpbarron

3
คุณกำลังใช้ห้องสมุด (PIL) ซึ่งไม่ได้รับอนุญาต (PIL ไม่สามารถเรียกได้ว่าเป็นส่วนหนึ่งของไลบรารีมาตรฐานเพราะมันจะไม่รวมอยู่ใน Python โดยค่าเริ่มต้น)
marinus

2
@marinus ฉันคิดว่ามันค่อนข้างรุนแรง .. ที่แปลกแยกภาษาโปรแกรมจำนวนมาก
Beta Decay

2

HTML5 + JavaScript (ES5), 515 ไบต์

จำนวนนั้นรวมถึงแท็ก HTML เนื่องจากเป็นส่วนหนึ่งของโปรแกรม หากคุณนับเฉพาะรหัสการประมวลผลภาพจะเป็น376 ไบต์ซึ่งรวมถึงฟังก์ชั่น wrapper

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

อินพุต

URL ไปยังรูปภาพ

ข้อ จำกัด ด้านความปลอดภัย

เนื่องจากโปรแกรมนี้ทำงานในสภาพแวดล้อมของเบราว์เซอร์เฉพาะ URL ไปยังรูปภาพที่เปิดใช้งาน CORSเท่านั้น Imgur เปิดใช้งาน CORS

IE 10 ไม่รองรับ CORSฉันยังไม่ได้ทดสอบใน IE 11 แต่ใช้งานได้ใน Chrome และ Firefox

วิธีการวิ่ง

  1. พิมพ์ / วาง URL ในฟิลด์อินพุต
  2. ยกเลิกการโฟกัส (แท็บ / คลิกออกจาก) จากช่องป้อนข้อมูล

เอาท์พุต

มันออกมาบนผืนผ้าใบบนหน้า

เนื่องจากเป็นแอปพลิเคชันที่ใช้เบราว์เซอร์ข้อ จำกัด ด้านความปลอดภัยจึงป้องกันการดาวน์โหลดไฟล์โดยอัตโนมัติ แต่คุณสามารถคลิกขวาและบันทึกภาพใน Chrome และ Firefox ฉันยังไม่ได้ทดสอบบน IE 11

การสาธิต

รหัส JavaScript ถูกลบออกจากscriptองค์ประกอบและใส่ลงในพื้นที่ที่เหมาะสมเพื่อรองรับ 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)>


ยืนยันการทำงานใน Edge ฉันคิดว่ามันจะทำงานใน IE11 เช่นกัน
Alex Van Liew

0

กำลังดำเนินการ 2 - 323 450

รูปภาพถูกอ่านจากไฟล์ f.png ในโฟลเดอร์ data ของ sketch วางภาพและกำหนดขอบเขต คำนวณตำแหน่งที่ถูกต้องและแทนที่ภาพที่ถูกเลื่อน

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

รุ่นที่อ่านได้:

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

ตัวอย่างผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่ป้อนคำอธิบายรูปภาพที่นี่ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถประมวลผลได้ที่นี่


คุณช่วยเตรียมไฟล์ผลลัพธ์ตัวอย่างให้ฉันเปรียบเทียบได้ไหม
Joshpbarron

เป็นคนดี ... แต่ไม่ค่อยมาก ภาพอินพุตมีพื้นหลังโปร่งใส
Joshpbarron

1
"รูปภาพถูกอ่านจากไฟล์ f.png" จริงๆ? ในรหัสของคุณฉันเห็นบรรทัดนี้: PImage p=loadImage("h.png");ที่ด้านบนสุด
SirPython

color(-1)และbackground(-1)แต่ละ 1 ไบต์จะสั้นกว่าcolor(255)และbackground(255)ตามลำดับ และฉันคิดว่าคุณสามารถลบP2Dการsizeโทรได้
Kritixi Lithos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.