Diese Herausforderung besteht darin, die Farbtöne in einem Bild schrittweise zu verschieben, um hübsche Bilder wie das folgende zu erstellen:
( original )
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die zwei nicht negative Ganzzahlen und ein Bild in einem beliebigen gängigen Bilddateiformat Ihrer Wahl enthält (Sie können einen Pfad zum Bild oder zu den Rohbilddaten angeben).
Wir nennen die erste Ganzzahl die Zyklen und die zweite Ganzzahl den Offset .
Wir definieren den Gleitkomma- Schritt auch als 360-malige Zyklen geteilt durch die Bildfläche oderstep = 360 * cycles / (image width * image height)
.
Führen Sie für jedes Pixel P im Bild, das sich zeilenweise von links nach rechts und von oben nach unten bewegt (dh in der Lesereihenfolge, wenn die Pixel Buchstaben waren), die folgenden Schritte aus:
Erhöhen Sie den Farbton von P um Versatzgrade (ggf. von 360 auf 0).
Dann erhöht Offset von Schritt .
Speichern, Anzeigen oder Ausgeben des resultierenden Bildes in einem beliebigen gängigen Bilddateiformat.
Durch diesen Vorgang wird der Farbton aller Pixel im Bild inkrementell erhöht, und es werden vollständige Schleifen um den Farbtonregenbogen erstellt , wobei zunächst der Farbton um den Versatz versetzt wird .
Wenn die Anzahl der Zyklen 1 und der Versatz 0 beträgt, wie im obigen Sternennachtbild, haben die oberen und unteren Pixelreihen praktisch keine Farbtonverschiebung, dazwischen liegt jedoch ein vollständiger Farbzyklus.
Einzelheiten
Bei Zyklen kann es sich um eine beliebige nicht negative Ganzzahl handeln. Sie können jedoch davon ausgehen, dass der Offset zwischen 0 und einschließlich 359 liegt.
Wenn die Anzahl der Zyklen 0 ist, wird der Farbton jedes Pixels im Bild genau um einen Versatz verschoben, da der Schritt ebenfalls 0 sein muss. (In diesem Fall ändert sich das Bild überhaupt nicht, wenn der Versatz 0 ist.)
Sie können davon ausgehen, dass Zyklen und Offset bei Bedarf als Gleitkommazahlen eingegeben werden (dh
1.0
anstelle von1
). (Mir ist klar, dass es sich überhaupt nicht um ganze Zahlen handeln muss. Das macht die Herausforderung nur einfacher.)"Farbton" bezieht sich auf die in HSL / HSV-Farbmodellen übliche RGB-Farbraumversion .
Beispiele
Original:
Zyklen = 1, Offset = 0:
Zyklen = 1, Offset = 180:
Original:
Zyklen = 2, Versatz = 60:
Original:
(Danke ArtOfCode .)
Zyklen = 1, Offset = 120:
Original:
(Danke Türknauf .)
Zyklen = 1, Offset = 0:
Zyklen = 4, Offset = 0:
Zyklen = 200, Offset = 0:
Zyklen = 30000, Versatz = 0:
(Diese Bilder sind möglicherweise nicht pixelgenau, da sie imgur komprimiert wurden.)
Wertung
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist höher gestimmte Antwort.
Antworten, die ihre eigenen cool aussehenden Testbilder posten, werden mehr Brownie-Punkte von mir bekommen.
quelle
Antworten:
Pyth, 86 Bytes, volles Programm
Pyth hat keine eingebauten Farbraumkonvertierungen - das ist der wahre Deal.
Nimmt Eingaben im folgenden Format auf stdin vor:
Das Ausgabebild wird geschrieben
o.png
.Dies funktioniert, indem der Farbwürfel um seine Diagonale gedreht und dann alle Werte außerhalb des Bereichs geklemmt werden.
Ist
a
der Winkel, um den gedreht werden soll, undr, g, b
ist die Eingabefarbe, berechnen wir die neue Farber', g', b'
durch:quelle
Python, 379 Bytes
Dies nimmt einen Weg zu a
.jpg
als Eingabe. Es wird nicht mit png arbeiten, obwohl Sie ändern können ,r,g,b=i.split();
umr,g,b=i.split()[:3];
ein PNG - Bild zu laden.Hier sind einige Bilder:
Original:
Offset: 0, Zyklen: 4
Original:
Offset 0, 1 Zyklus:
Original:
Offset 0, 2,5 Zyklen:
quelle
Java (Volles Programm),
491488 Bytes (Danke @Geobits)Ungolfed
Erläuterung
Verbrauch: Ziemlich unkompliziert. Kompilieren mit
java -c Q.java
. Laufen Sie mitjava Q <cycles> <offset> <imagepath>
. Überschreibt das vorhandene Image, seien Sie also vorsichtig.Anfangs wollte ich nur eine Methode als Lösung entwickeln, aber ich wusste nicht genau, wie ich mit Importen umgehen sollte, also dachte ich mir, ich würde voll auf Java setzen , das wird wahrscheinlich sowieso nicht gewinnen: ^)
Ergebnisse:
Image 1: 1 cycle, 0 offset
Image 1: 1 cycle, 180 offset
Image 2: 2 cycles, 60 offset
Image 3: 1 cycle, 120 offset
Image 4: 1 cycle, 0 offset
Image 4: 4 cycles, 0 offset
Image 4: 200 cycles, 0 offset
Bonus: The Starry Night, 1 cycle, 0 offset
quelle
java.io.File
anstattjava.io.*
?import
**static
nicht nur **import
?ImageIO::read
undImageIO::write
ohne VoranstellenImageIO.
: Das addiert 9 Bytes (static .*
), spart aber 16 (ImageIO.
zweimal).