23
5
This challenge is about gradually shifting hues in an image to make pretty pictures like this:
(original)
Challenge
Write a program or function that takes in two non-negative integers and an image in any common image file format of your choosing (you can take a path to the image or the raw image data).
We'll call the first integer the cycles and the second integer the offset.
We'll also define floating-point step as 360 times cycles divided by the area of the image, or step = 360 * cycles / (image width * image height)
.
For each pixel P in the image, moving one row at a time, left-to-right, top-to-bottom (i.e. in reading order if the pixels were letters), do the following:
Increase the hue of P by offset degrees (looping around from 360 to 0 if necessary).
Then increase offset by step.
Save, display, or output raw the resulting image in any common image file format.
This procedure incrementally increases the hue of all the pixels in the image, making cycles full loops around the hue rainbow, starting by initially offsetting the hue by offset.
When cycles is 1 and offset is 0, as in the Starry Night image above, the top and bottom rows of pixels have practically no hue shift but in between there's a full color cycle.
Details
Cycles can be any non-negative integer but you may assume that offset is from 0 to 359 inclusive.
When cycles is 0, every pixel in the image will have its hue shifted by exactly offset since step must be 0 too. (In this case if offset is 0 then the image doesn't change at all.)
You may assume cycles and offset are input as floats if desired (i.e.
1.0
instead of1
). (I realize they needn't be integers at all, it just makes the challenge simpler.)"Hue" refers to the RGB color space version, common in HSL/HSV color models.
Examples
Original:
Cycles = 1, offset = 0:
Cycles = 1, offset = 180:
Original:
Cycles = 2, offset = 60:
Original:
(Thanks ArtOfCode.)
Cycles = 1, offset = 120:
Original:
(Thanks Doorknob.)
Cycles = 1, offset = 0:
Cycles = 4, offset = 0:
Cycles = 200, offset = 0:
Cycles = 30000, offset = 0:
(These images may not be pixel perfect due to imgur compressing them.)
Scoring
The shortest code in bytes wins. Tiebreaker is higher voted answer.
Answers that post their own cool looking test images will get more brownie points from me.
6This looks like Doorknob is smoking some pot. – Denker – 2016-05-03T00:52:43.417
I presume an array of integers as return value would be included in "or output raw"? – Marv – 2016-05-03T01:12:46.517
2
@Marv No. I mean the raw bytes of the image (in your chosen common format, say ppm) can be piped direct to stdout.
– Calvin's Hobbies – 2016-05-03T01:14:58.6102Do outputs have to be identical to your examples? I'm getting slightly different images. – James – 2016-05-03T02:37:18.137
1@DrGreenEggsandHamDJ If you can't visually tell a difference then it's probably fine. Pixel perfection is not required (imgur may have lossily compressed my images anyway). – Calvin's Hobbies – 2016-05-03T03:29:37.107