This is a stand-alone Java Application that may be used to generate images. Images are generated in real-time using a user-configurable set of color combiners and filters.
Execute by running main class ColorArrayGenerationUI. Also packaged as a runnable JAR.
Using "Ink color selection", you can enter in any HTML color code (sans "#") and update your active ink color. Then, if you click and drag your cursor over the canvas, it will draw that color to the nearest edges of the color grid and immediately regenerate the image with your changes.
Using the "Color combiner selection" section, you can choose any combination of color combiners, and adjust the applied multiplier. When you select multiple combine methods, each point in the grid is generated by randomly choosing one of the combiners.
Available combiners:
Sets the RGB values of the generated color to the average of the respective parents' RGB values. Does not use the multiplier value.
Do you like Sierpinski triangles? This is the color combiner for you! Try it out to see what I mean.
Sets the RGB values of the generated color to the modulus of the sum of the respective parents' RGB values. The modulo is determined by scaling the multiplier from [0, 100] to [0, 255].
For example, with a multiplier value of 10, the modulo is floor((10 * 255)/100) = 25.
Thus, with parent colors (r, g, b): p1 = (r1, g1, b1) and p2 = (r2, g2, b2),
the generated color is equal to: ((r1 + r2) % 25, (g1 + g2) % 25, (b1 + b2) % 25)
Sets the RGB values of the generated color to a scaled average of the respective parents' RGB values. Multiplier affects the degree to which the value average is scaled up or down. A multiplier of 50 is equivalent to the RGB_AVG output.
Sets the RGB values of the generated color to the average of the respective parents' RGB values, with added noise. The degree of noise added or subtracted from each RGB value is proportional to the multiplier value.
Sets each respective RGB value of the generated color to one randomly chosen from the parents. Does not use the multiplier value, however changing the multiplier triggers a recalculation of the random choices.
Using the "Filter selection" section, you can choose any combination of filters, and adjust the applied intensity. When you select multiple filters, each point in the grid is filtered by randomly choosing one of the filters.
Available filters:
In this modern age, I think most of us know what it means to have #nofilter.
At full intensity, produces a binary version of the image. Does this by averaging all RGB values at a given point and mapping it to the nearest absolute color value (0 or 255). This is similar to contrast.
At full intensity, rounds each of the RGB values of a position to the nearest absolute value (0 or 255). This is similar to saturation.
You can re-initialize the canvas edges using the active set of color combiners. By default, the edges of the canvas are initialized using the RGB_AVG combiner, and when you make adjustments to combiners, the canvas edges are not affected. Telling the canvas to re-initialize will recalculate the canvas contents as well as the edges.
Saves the current image to PNG file. Creates a "color-array-out" directory in the same directory as the program is running, and saves the capture to a sub-directory with a UUID name.
Iterates over all possible combiner multipliers, and for each value, saves the canvas to PNG file. Creates a "color-array-out" directory in the same directory as the program is running, and saves the captures to a sub-directory with a UUID name. Each capture is saved as capture-(multiplier).PNG.
- Save capture/clips improvements
- Name your own captures before saving
- Choosing file-types
- Improved visual feedback of status when saving captures and clips
- Save clips saves to animated GIF
- Revamped "Ink color selection" section
- Saving & loading canvas states to/from JSON -> preserve your favorite configurations!
- More combiners and filters
- Process analysis & deeper optimization, to support larger canvases better
- Support arbitrary graphs for creating parent/child color relationships, instead of the hard-set 2D array, with 2 parents per child