1 /* 2 * A program to paint an abstract gradient in the vertical direction. 3 */ 4 5 package npw; 6 7 import painter.SPainter; 8 import shapes.SRectangle; 9 import javax.imageio.ImageIO; 10 import javax.swing.*; 11 import javax.swing.filechooser.FileNameExtensionFilter; 12 import java.awt.*; 13 import java.awt.geom.Point2D; 14 import java.awt.image.BufferedImage; 15 import java.io.File; 16 import java.io.FilenameFilter; 17 import java.io.IOException; 18 import java.util.Random; 19 20 import static javax.swing.SwingUtilities.invokeLater; 21 22 public class Invention2 { 23 //----- Fields / Global Vars and Objects ----- 24 private String path = pathBuilder(); 25 private BufferedImage image = randomlyGetImageFromPath(path); 26 private int height = image.getHeight(); 27 private int width = image.getWidth(); 28 private SPainter painter = new SPainter( "Invention 2", width, height ); 29 //Changing this stretches picture 30 private double pixelSize = 1; 31 private SRectangle rectanglePixel = new SRectangle( pixelSize,pixelSize ); 32 33 //----- Constructors ----- 34 private Invention2() throws IOException { 35 paintTheRows(); 36 } 37 //----- Methods / Functions ----- 38 public static void main(String[] args) { 39 invokeLater( () -> { 40 try { 41 new Invention2(); 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } 45 } ); 46 } 47 48 private String pathBuilder(){ 49 String separator = System.getProperty("file.separator"); 50 String home = null; 51 52 //Make Program Compatible With Windows (I use windows :P ) 53 if(System.getProperty("os.name").startsWith("Windows")) { 54 home = System.getProperty("user.dir"); 55 } 56 else if(System.getProperty("os.name").startsWith("Windows 10")) { 57 home = System.getProperty("user.dir"); 58 } 59 else { 60 home = System.getProperty("user.home"); 61 } 62 String path = home + separator + "CS1Files" + separator + "data" + separator; 63 return path; 64 } 65 private BufferedImage randomlyGetImageFromPath(String path) throws IOException { 66 67 Random rgen = new Random(); 68 File dataFolder = new File(path); 69 70 // Randomly choose any image from the folder (Scan for Jpg and PNG); 71 FilenameFilter filter = (dir, name) -> { 72 String lowercaseName = name.toLowerCase(); 73 if (lowercaseName.endsWith(".jpg") ) { 74 return true; 75 } 76 else if (lowercaseName.endsWith(".png")){ 77 return true; 78 } 79 else if(lowercaseName.endsWith(".jpeg")) { 80 return true; 81 } 82 else { 83 return false; 84 } 85 }; 86 File[] listOfFiles = dataFolder.listFiles(filter); 87 File randomPicture = listOfFiles[rgen.nextInt(listOfFiles.length)]; 88 return ImageIO.read(randomPicture); 89 } 90 private Color getPixelColor(int x, int y) { 91 int rgb = image.getRGB( x, y ); 92 int red = (rgb & 0x00ff0000) >> 16; 93 int green = (rgb & 0x0000ff00) >> 8; 94 int blue = (rgb & 0x000000ff); 95 Color PixelColor = new Color( red, green, blue ); 96 return PixelColor; 97 } 98 private void paintOnePixel(int workingPixel, int workingRow){ 99 Color pixelColor = getPixelColor( workingPixel, workingRow); 100 painter.setColor( pixelColor ); 101 //Changing this may make pictures generate faster 102 painter.mrt( 1 ); 103 painter.paint( rectanglePixel ); 104 } 105 private void paintOneRow(int workingRow){ 106 int pixelIterator = 0; 107 while (pixelIterator < image.getWidth()) { 108 paintOnePixel( pixelIterator, workingRow); 109 pixelIterator = pixelIterator +1; 110 } 111 } 112 private void paintTheRows(){ 113 int rowCount = 0; 114 // Starts Off From Corner of Canvas 115 painter.moveTo( new Point2D.Double( 0, 0 ) ); 116 for (int rowIterator = 0; rowIterator < image.getHeight(); rowIterator++) { 117 paintOneRow( rowIterator); 118 rowCount = rowCount + 1; 119 //System.out.println( "DEBUG: Row Count: " + rowCount ); 120 // Makes a new Row 121 painter.moveTo( new Point2D.Double( 0, rowIterator )); 122 123 if (rowCount == image.getHeight()) { 124 break; 125 } 126 } 127 } 128 } 129