आप इसे केंद्र कहते हैं, मैं इसे कोड गोल्फ कहता हूं


16

"चलो इसका सामना करते हैं, संरेखित चित्र स्वर्ग से छोटे उपहारों की तरह हैं। आपका स्वागत है, लेकिन अप्रत्याशित है।" - जियोबिट्स

+10000 प्रतिष्ठा जो कोई भी इस चुनौती को जीतता है।

नियम:

1) आप एक कार्यक्रम उत्पन्न करने के लिए कर रहे हैं।

2) इनपुट एक छवि होगी, हालांकि यह एक फ़ाइल के रूप में पारित हो गई है या संख्याओं की सूची आपके ऊपर है।

3) आउटपुट एक फाइल होगी जो पेंट (या समान) में खोली जाने पर छवि को संरेखित दिखाएगा।

4) कैनवास का आकार हमेशा 100 x 100 और 2000 x 2000 पिक्सेल के बीच रहेगा। यह हमेशा एक आयत होगी, लेकिन हमेशा एक वर्ग नहीं।

5) छवियों या कायरता यूआरएल जादू की कोई हार्ड कोडिंग नहीं।

6) कोई बाहरी पुस्तकालयों का इस्तेमाल नहीं किया जाएगा।

केंद्रीकरण के लिए गाइड (जोशपर्बन वेरिएंट)

यदि एक अक्ष पर 1 सफ़ेद (255,255,255,> 0 आरजीबीए) या पारदर्शी (x, y, z, 0 आरजीबी) एक छवि को केंद्र के रूप में परिभाषित किया जाएगा तो कैनवास के किनारे से समान दूरी (प्लस या माइनस 1 पिक्सेल) है।

यह निम्नलिखित विधि से प्राप्त किया जा सकता है (और सत्यापित किया जाएगा)।

1) ऑब्जेक्ट के चारों ओर एक बाउंडिंग बॉक्स की कल्पना करें। (मदद के लिए काली लाइनें जोड़ी गईं)

यहाँ छवि विवरण दर्ज करें

2) ऑब्जेक्ट को तब तक इधर-उधर घुमाएँ जब तक कि ऑब्जेक्ट का किनारा कैनवास के उपयुक्त किनारे से समान दूरी पर न हो।

यहाँ छवि विवरण दर्ज करें

3) अब काली रेखाओं को भूल जाओ।

यहाँ छवि विवरण दर्ज करें

इनपुट:

यहाँ छवि विवरण दर्ज करें

आउटपुट:

यहाँ छवि विवरण दर्ज करें

अधिक जानकारी यहाँ

और संबंधित आउटपुट यहां

+10000 प्रतिनिधि एक झूठ है।


कार्यक्रम पूरी तरह से सफेद / पारदर्शी छवियों को संभालना चाहिए?
क्रिस्टियन लुपस्कू

जैसा कि केंद्र में कुछ भी नहीं है, उसी छवि को वापस किया जाना चाहिए। खाली जगह वाले चित्रों के लिए भी।
जोशपब्रॉन

आपको उन छवियों पर कुछ विवरण जोड़ना चाहिए जिनके लिए यह काम करना चाहिए। उदाहरण के लिए, यह एक ऐसी छवि के लिए काम करना चाहिए जिसमें ज्यादातर सफेद पृष्ठभूमि हो लेकिन इसमें पारदर्शिता के छेद हों? या पारदर्शिता का मतलब है कि कोई सफेद नहीं होगा, और इसके विपरीत।
बुबलौ

क्षमा करें, लेकिन स्पष्टीकरण स्पष्ट है। RBGA कोड दिए गए हैं।
जोशपब्रॉन

विवरण में, आप एक किनारे से 1 सफेद / पारदर्शी पिक्सेल की दूरी के बारे में बात करते हैं। क्या आपका मतलब पहले गैर- सफेद नहीं है? अन्यथा सभी नमूना इनपुट पहले से ही समाधान हैं, क्योंकि प्रत्येक किनारे से पहले सफेद पिक्सेल की दूरी 0 है, इसलिए उन सभी को बराबर किया जाता है।
रेटो कोराडी

जवाबों:


0

पायथन 3, 120 205 बाइट्स

संपादित करें : जैसा कि आउटपुट छवि में इनपुट के समान आकार होना चाहिए, स्क्रिप्ट लंबा हो जाता है ...

EDIT2 : ऐसा लगता है कि नियम 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')

दोनों स्क्रिप्ट स्टड से छवि फ़ाइल नाम पढ़ते हैं, और आउटपुट छवि को 'o.png' के रूप में सहेजते हैं। उदाहरण के लिए :

python3 script.py <<< s2rMqYo.png

यह कम से कम पीएनजी छवियों (संभावित रूप से एक अल्फा चैनल के साथ) को स्वीकार करता है - पूछने वाले द्वारा प्रदान किए गए सेट पर 'ओके' का परीक्षण किया गया।

... मेरे इनाम का इंतजार):


1
मैं इस मिनट पर परीक्षण नहीं कर सकता, लेकिन क्या आउटपुट कैनवास आकार इनपुट कैनवास आकार से मेल खाता है?
जोशपब्रॉन

1
अपने भविष्य के खोल प्रयासों के लिए प्रो टिप: python3 script.py <<< s2rMqYo.pngक्लीनर है
भूमिगत 15

1
आउटपुट का आकार इनपुट के समान होना चाहिए, हां।
जोशपब्रॉन

3
आप एक लाइब्रेरी (PIL) का उपयोग कर रहे हैं, जिसकी अनुमति नहीं है। (PIL को मानक पुस्तकालयों का हिस्सा नहीं कहा जा सकता है, क्योंकि यह डिफ़ॉल्ट रूप से पायथन के साथ शामिल नहीं है।)
marinus

2
@marinus मुझे लगता है कि यह थोड़ा कठोर है .. यह प्रोग्रामिंग भाषाओं की एक बड़ी संख्या को अलग करता है।
बीटा डेके

2

एचटीएमएल 5 + जावास्क्रिप्ट (ईएस 5), 515 बाइट्स

गणना में HTML टैग शामिल हैं क्योंकि वे कार्यक्रम का हिस्सा हैं। यदि आप केवल इमेज प्रोसेसिंग कोड की गिनती करते हैं, तो यह है 376 बाइट्स है, जिसमें फ़ंक्शन रैपर भी शामिल है।

<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 कोर का समर्थन नहीं करता है।मैंने IE 11 में अभी तक परीक्षण नहीं किया है, लेकिन यह क्रोम और फ़ायरफ़ॉक्स में काम करता है।

कैसे चलाना है?

  1. URL को इनपुट फ़ील्ड में टाइप / पेस्ट करें।
  2. इनपुट फ़ील्ड से डी-फ़ोकस (टैब / क्लिक आउट)।

उत्पादन

यह पृष्ठ पर कैनवास पर आउटपुट देता है।

जैसा कि यह एक ब्राउज़र-आधारित एप्लिकेशन है, सुरक्षा प्रतिबंध किसी फ़ाइल के स्वचालित डाउनलोड को रोकते हैं लेकिन आप क्रोम और फ़ायरफ़ॉक्स में छवि को राइट क्लिक और सहेज सकते हैं। मैंने IE 11 पर अभी तक परीक्षण नहीं किया है।

डेमो

जावास्क्रिप्ट कोड को 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)
  }
}
<canvas id=o></canvas>
<input onblur=f(this.value)>


एज में काम करने की पुष्टि की। मुझे लगता है कि यह IE11 में भी काम करेगा।
एलेक्स वान एलवाईई

0

प्रसंस्करण 2 - 323 450

छवि स्केच के डेटा फ़ोल्डर में फ़ाइल f.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");

पठनीय संस्करण:

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

उदाहरण आउटपुट:

यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

आप यहां प्रसंस्करण प्राप्त कर सकते हैं


क्या आप मेरी तुलना के लिए एक नमूना आउटपुट फ़ाइल प्रदान कर सकते हैं।
जोशपब्रोन

यह अच्छा है ... लेकिन काफी नहीं। इनपुट छवियों में एक पारदर्शी पृष्ठभूमि होती है।
जोशपब्रॉन

1
"फ़ाइल f.png से चित्र पढ़ा जाता है"। वास्तव में? आपके कोड में, मुझे यह रेखा दिखाई देती है: PImage p=loadImage("h.png");सबसे ऊपर।
SirPython

color(-1)और background(-1)प्रत्येक 1 बाइट की तुलना में कम कर रहे हैं color(255)और background(255)क्रमशः। और मुझे लगता है आप निकाल सकते हैं P2Dमें sizeकॉल
Kritixi lithos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.