Invention2.java
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