// SquiggleDraw // // A processing sketch by Gregg Wygonik // // https://github.com/gwygonik/SquiggleDraw // // Contributions import controlP5.*; import processing.svg.*; ControlP5 gui; PShape s; PShape liner; PImage p1; PImage p2; int ystep = 160; int ymult = 6; int xstep = 3; float xsmooth = 128.0; int imageScaleUp = 3; float r = 0.0; float a = 0.0; int strokeWidth = 1; float startx,starty; int b,oldb; int maxB = 255; int minB = 0; boolean isRunning = true; boolean isRecording = false; boolean needsReload = true; boolean invert = false; String imageName = "Rachel-Carson.jpg"; void setup() { size(100,100); loadMainImage(imageName); createSecondaryImage(); gui = new ControlP5(this); gui.addSlider("sldLines").setSize(130,30).setCaptionLabel("Number of Lines").setPosition(10,20).setRange(10,200).setValue(120).setColorCaptionLabel(color(0)); gui.getController("sldLines").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addToggle("tglInvert").setCaptionLabel("Invert Colors").setPosition(10,80).setValue(false).setMode(ControlP5.SWITCH).setColorCaptionLabel(color(0)); gui.getController("tglInvert").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("sldAmplitude").setSize(130,30).setCaptionLabel("Squiggle Strength").setPosition(10,140).setRange(0,20).setValue(13).setColorCaptionLabel(color(0)); gui.getController("sldAmplitude").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("sldXSpacing").setSize(130,30).setCaptionLabel("Detail").setPosition(10,200).setRange(1,30).setValue(28).setColorCaptionLabel(color(0)); gui.getController("sldXSpacing").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("sldXFrequency").setSize(130,30).setCaptionLabel("Frequency").setPosition(10,260).setRange(5.0,256.0).setValue(128.0).setColorCaptionLabel(color(0)); gui.getController("sldXFrequency").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("sldImgScale").setSize(130,30).setCaptionLabel("Resolution Scale").setPosition(10,320).setRange(1,3).setValue(3).setColorCaptionLabel(color(0)); gui.getController("sldImgScale").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("lineWidth").setSize(130,30).setCaptionLabel("Line Width").setPosition(10,380).setRange(1,10).setValue(5).setColorCaptionLabel(color(0)); gui.getController("lineWidth").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("minBrightness").setSize(130,30).setCaptionLabel("Black Point").setPosition(10,440).setRange(0,255).setValue(0).setColorCaptionLabel(color(0)); gui.getController("minBrightness").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addSlider("maxBrightness").setSize(130,30).setCaptionLabel("White Point").setPosition(10,500).setRange(0,255).setValue(255).setColorCaptionLabel(color(0)); gui.getController("maxBrightness").getCaptionLabel().align(ControlP5.LEFT, ControlP5.TOP_OUTSIDE); gui.addBang("bangLoad").setSize(130,30).setCaptionLabel("Load image").setPosition(10,600).setColorCaptionLabel(color(255)); gui.getController("bangLoad").getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER); gui.addBang("bangSave").setSize(130,30).setCaptionLabel("Save SVG").setPosition(10,660).setColorCaptionLabel(color(255)); gui.getController("bangSave").getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER); smooth(); background(255); shapeMode(CORNER); } void loadMainImage(String inImageName) { p1 = loadImage(inImageName); int tempheight = p1.height; if (tempheight < 720) tempheight = 720; surface.setSize(p1.width + 150, tempheight); // filter image p1.filter(GRAY); p1.filter(BLUR,2); if (invert) { p1.filter(INVERT); } } void createSecondaryImage() { p2 = createImage(p1.width*imageScaleUp,p1.height*imageScaleUp,ALPHA); p2.copy(p1,0,0,p1.width,p1.height,0,0,p1.width*imageScaleUp,p1.height*imageScaleUp); } void draw() { if (isRunning) { if (isRecording) { beginRecord(SVG, "squiggleImage_" + millis() + ".svg"); } createPic(); if (isRecording) { endRecord(); } isRunning = false; isRecording = false; createPic(); } } void createPic() { if (needsReload) { loadMainImage(imageName); createSecondaryImage(); needsReload = false; } stroke(0); noFill(); strokeWeight(strokeWidth); startx = 0.0; starty = 0.0; s = createShape(GROUP); for (int y=0;y