इंद्रधनुष एक छवि


23

यह चुनौती धीरे-धीरे इस तरह से सुंदर चित्र बनाने के लिए एक छवि में hues को स्थानांतरित करने के बारे में है:

बड़ी तारों वाली रात ( मूल )

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो दो गैर-नकारात्मक पूर्णांक और आपके चयन के किसी भी सामान्य छवि फ़ाइल प्रारूप में एक छवि लेता है (आप छवि या कच्ची छवि डेटा के लिए एक पथ ले सकते हैं)।

हम पहले पूर्णांक को चक्र और दूसरे पूर्णांक को ऑफ़सेट कहेंगे ।

हम फ़्लोटिंग-पॉइंट स्टेप को छवि के क्षेत्र द्वारा विभाजित 360 गुणा चक्र के रूप में भी परिभाषित करेंगे step = 360 * cycles / (image width * image height)

छवि में प्रत्येक पिक्सेल पी के लिए, एक समय में एक पंक्ति, बाएं-से-दाएं, ऊपर से नीचे (यानी पढ़ने के क्रम में अगर पिक्सेल अक्षर थे), निम्नलिखित करें:

  1. ऑफसेट डिग्री (यदि आवश्यक हो तो लगभग 360 से 0 से लूपिंग) द्वारा पी के ह्यू को बढ़ाएं ।

  2. फिर बढ़ ऑफसेट द्वारा कदम

किसी भी सामान्य छवि फ़ाइल स्वरूप में परिणामी छवि को सहेजें, प्रदर्शित करें, या आउटपुट करें।

यह प्रक्रिया छवि में सभी पिक्सल की वृद्धि को बढ़ाती है, जिससे ह्यू इंद्रधनुष के चारों ओर चक्रों को पूर्ण लूप बनाया जाता है , शुरुआत में ऑफसेट द्वारा ह्यू को ऑफसेट करके शुरू होता है ।

जब चक्र 1 होता है और ऑफसेट 0 होता है, जैसा कि ऊपर की तारों वाली रात की छवि में, पिक्सल के ऊपर और नीचे की पंक्तियों में व्यावहारिक रूप से कोई ह्यू शिफ्ट नहीं है, लेकिन बीच में एक पूर्ण रंग चक्र है।

विवरण

  • चक्र कोई भी गैर-नकारात्मक पूर्णांक हो सकता है लेकिन आप मान सकते हैं कि ऑफसेट 0 से 359 समावेशी है।

  • जब चक्र 0 होता है, तो छवि में प्रत्येक पिक्सेल का रंग बिल्कुल हट जाएगा, क्योंकि चरण 0 भी होना चाहिए। (इस मामले में यदि ऑफसेट 0 है तो छवि बिल्कुल नहीं बदलती है।)

  • यदि आप वांछित (यानी के बजाय ) हैं तो आप मान सकते हैं कि चक्र और ऑफसेट इनपुट हैं । (मुझे पता है कि उन्हें पूर्णांक की आवश्यकता नहीं है, यह सिर्फ चुनौती को सरल बनाता है।)1.01

  • "ह्यू" RGB रंग अंतरिक्ष संस्करण को संदर्भित करता है, जो HSL / HSV रंग मॉडल में सामान्य है ।

उदाहरण

मूल:

नदी

चक्र = 1, ऑफसेट = 0:

नदी का उत्पादन १

चक्र = 1, ऑफसेट = 180:

नदी का उत्पादन २

मूल:

क्षेत्रों

चक्र = 2, ऑफसेट = 60:

उत्पादन का क्षेत्र

मूल:

सूर्य का अस्त होना
(धन्यवाद आर्टऑफकोड )

चक्र = 1, ऑफसेट = 120:

सूर्यास्त का उत्पादन

मूल:

दरवाज़े
( साभार डोरकनॉब ।)

चक्र = 1, ऑफसेट = 0:

doorknob आउटपुट 1

चक्र = 4, ऑफसेट = 0:

doorknob आउटपुट 2

चक्र = 200, ऑफसेट = 0:

doorknob आउटपुट 3

चक्र = 30000, ऑफ़सेट = 0:

doorknob आउटपुट 4

(ये चित्र imgur कंप्रेस करने के कारण पिक्सेल परफेक्ट नहीं हो सकते हैं।)

स्कोरिंग

बाइट्स में सबसे छोटा कोड जीतता है। टाईब्रेकर उच्च मतदान वाला उत्तर है।

अपने स्वयं के शांत दिखने वाले परीक्षण चित्रों के उत्तर देने से मुझे अधिक ब्राउनी अंक मिलेंगे।


6
ऐसा लग रहा है कि Doorknob कुछ बर्तन धूम्रपान कर रहा है।
डेनकर

मैं पूर्णांक का एक सरणी मानता हूं जैसे कि रिटर्न वैल्यू को "या आउटपुट रॉ" में शामिल किया जाएगा?
मार्व

2
@Marv नहीं। मेरा मतलब है कि छवि के कच्चे बाइट्स (आपके चुने हुए सामान्य प्रारूप में, पीपीएम कहते हैं ) को स्टडआउट तक सीधे पाइप किया जा सकता है।
केल्विन के शौक

2
क्या आउटपुट को आपके उदाहरणों के समान होना चाहिए? मुझे थोड़ी अलग छवियां मिल रही हैं
DJMcMayhem

1
@DrGreenEggsand HamDDJ यदि आप नेत्रहीन एक अंतर नहीं बता सकते हैं तो यह शायद ठीक है। पिक्सेल पूर्णता की आवश्यकता नहीं है (imgur नुकसानदायक मेरी छवियों को किसी भी तरह से संकुचित कर सकता है)।
केल्विन के शौक

जवाबों:


8

पायथ, 86 बाइट्स, पूरा कार्यक्रम

=N.tE7=Z*6*.n0cEl.n'zMmhtS[0255ss*VG.>+Lc-1.tH1 3[.tH1Kc.tH0@3 2_K)d)3.wmmgk~-NZd'z

Pyth में बिल्ट-इन कलर स्पेस रूपांतरण नहीं है - यह वास्तविक सौदा है।

स्टड पर निम्नलिखित प्रारूप में इनपुट लेता है:

input_filename.png
offset
cycles

आउटपुट छवि को लिखा है o.png


यह अपने विकर्ण के चारों ओर रंग घन को घुमाकर काम करता है, और फिर सीमा के बाहर किसी भी मान को जकड़ता है।

यदि aकोण को घुमाने के लिए है, और r, g, bइनपुट रंग है, तो हम नए रंग की गणना करते हैं r', g', b':

o = cos(a), i = sin(a) / sqrt(3)
n = (1 - o) / 3
m = [n + o, n - i, n + i]
clamp(c) = max(0, min(255, c))
r' = clamp(r*m[0] + g*m[1] + b*m[2])
g' = clamp(r*m[2] + g*m[0] + b*m[1])
b' = clamp(r*m[1] + g*m[2] + b*m[0])

6

पायथन, 379 बाइट्स

from PIL.Image import*
from colorsys import*
def f(H,c,I):
 i=open(I);x,y=i.size;S=1.*c/(x*y);r,g,b=i.split();R=[];G=[];B=[]
 for x,y,z in zip(r.getdata(),g.getdata(),b.getdata()):
  e=255.;h,s,v=rgb_to_hsv(x/e,y/e,z/e);t=hsv_to_rgb(h+H,s,v);H=H+S%1.;x,y,z=[int(x*e)for x in t];R.append(x);G.append(y);B.append(z)
 p=Image.putdata;p(r,R);p(g,G);p(b,B);return merge('RGB',(r,g,b))

यह एक .jpgइनपुट के लिए एक रास्ता लेता है । यह png के साथ काम नहीं करेगा, हालाँकि आप png छवि को लोड r,g,b=i.split();करने के r,g,b=i.split()[:3];लिए बदल सकते हैं ।

यहाँ कुछ चित्र दिए गए हैं:

मूल:

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

ऑफसेट: 0, चक्र: 4

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

मूल:

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

ऑफसेट 0, 1 चक्र:

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

मूल:

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

ऑफसेट 0, 2.5 चक्र:

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


6

जावा (पूर्ण कार्यक्रम), 491 488 बाइट्स (साभार @Geobits)

import java.awt.*;import java.io.*;import static javax.imageio.ImageIO.*;class Q{public static void main(String[]v)throws Exception{File f=new File(v[2]);java.awt.image.BufferedImage b=read(f);for(int i=0,j,h=b.getHeight(),w=b.getWidth();i<h;i++)for(j=0;j<w;){Color c=new Color(b.getRGB(j,i));float[]a=new float[3];c.RGBtoHSB(c.getRed(),c.getGreen(),c.getBlue(),a);b.setRGB(j++,i,c.HSBtoRGB((a[0]+Float.valueOf(v[1])/360+(i*w+j)*Float.valueOf(v[0])/w/h)%1,a[1],a[2]));}write(b,"png",f);}}

Ungolfed

import java.awt.*;
import java.io.*;

import static javax.imageio.ImageIO.*;

class A79200 {
    public static void main(String[] v) throws Exception {
        File file = new File(v[2]);
        java.awt.image.BufferedImage image = read(file);
        for (int i = 0, j, height = image.getHeight(), width = image.getWidth(); i < height; i++)
            for (j = 0; j < width; ) {
                Color color = new Color(image.getRGB(j, i));
                float[] arr = new float[3];
                color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), arr);
                image.setRGB(j++, i, color.HSBtoRGB((arr[0] + Float.valueOf(v[1]) / 360 + (i * width + j) * Float.valueOf(v[0]) / width / height) % 1, arr[1], arr[2]));
            }
        write(image, "png", file);
    }
}

व्याख्या

  • उपयोग: सुंदर सीधा। के साथ संकलित करें java -c Q.java। साथ चलाना java Q <cycles> <offset> <imagepath>। मौजूदा छवि को ओवरराइड करेगा, इसलिए सावधान रहें।

  • मैं पहली बार में केवल एक विधि बनाने जा रहा था, लेकिन मुझे नहीं पता था कि उन पर आयात को कैसे संभालना है, इसलिए मुझे लगा कि मैं पूरा चला जाऊंगा , यह शायद वैसे भी जीतने वाला नहीं है: ^)

परिणाम:

Image 1: 1 cycle, 0 offset

1

Image 1: 1 cycle, 180 offset

2

Image 2: 2 cycles, 60 offset

3

Image 3: 1 cycle, 120 offset

4

Image 4: 1 cycle, 0 offset

5

Image 4: 4 cycles, 0 offset

6

Image 4: 200 cycles, 0 offset

7

Bonus: The Starry Night, 1 cycle, 0 offset

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


1
भविष्य के संदर्भ के लिए, आप विधि-केवल उत्तरों के लिए आयात कर सकते हैं जैसा कि आप सामान्य रूप से करते हैं। बस उन्हें विधि निकाय के बाहर रखें और बाइट्स की गणना करें। यदि आप केवल एक बार ज़रूरत पड़ने पर, कुछ मामलों में कुछ बाइट्स सहेजने के बजाय, आप उन्हें आयात करने के बजाय कक्षाओं को पूरी तरह से योग्य बना सकते हैं।
जियोबिट्स

इसके अलावा, क्या कोई कारण है जिसके java.io.Fileबजाय आप आयात कर रहे हैं java.io.*?
जियोबिट्स

धन्यवाद, जानकर अच्छा लगा। और दूसरा, नहीं, कोई कारण नहीं है। अच्छी बात।
मार्व

क्यों import ** static, सिर्फ नहीं import?
सोलोमन उक्यो

1
ताकि मैं कॉल कर सकूं ImageIO::readऔर ImageIO::writeबिना प्रीपेंड किए ImageIO.: यह 9 बाइट्स ( static .*) जोड़ता है, लेकिन 16 ( ImageIO.दो बार) बचाता है ।
मार्व
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.