Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

1. Read the image data file “original.txt” into your program, (file contains the

ID: 3805932 • Letter: 1

Question

1. Read the image data file “original.txt” into your program, (file contains the following numbers):

1122333444

0011223334

0000011223

5000000001

5550000000

5555550000

5555555555

then output another file with the image data converted to ASCII symbols that represent the darkness of each pixel.

a. You must create a class called “Image” to represent the image

b. This class should accept image data in the form of a 2-dimentional integer matrix. **This class should not import Scanner, System.io, File, etc. (after all this data matrix might come from another source, another object, who knows). **

c. You should create a second class, called “pictureOutput” that handles file and console input and output, along with conversion of data to a Java array that can be passed to Image. -In addition to reading in a data file and converting it to a Java array, pictureOutput should also be able to accept an Image object and write its contents to disk. -In addition to simply writing the raw data, pictureOutput should be able to convert that data to ASCII art, and write the ASCII version of the image to disk. Use the following to handle this conversion:

0 = “space”

1 = .

2 = :

3 = o

4 = O

5 = $

2. Create a utility Object – similar to Math – called “pictureEdit” that contains methods for working with and manipulating images

a. pictureEdit must accept Image objects as method parameters as its primary means of receiving image data. No passing arrays! Use proper object-oriented style!

b. pictureEdit must also implement at least two methods in some way related to manipulating images. This may include:

i. Rotating the image 90 degrees or 180 degrees

ii. Flipping the image vertically or horizontally or diagonally

iii. Cropping the image

1. I imagine something like crop(myImage, 0, 1,2,0) which would remove 0 rows from the top, 1 from the left, 2 from the bottom, and 0 from the left. Your call on specifics, though. iv. Adding a border to the image 1. surround (myImage, 5, 2) would add a border of “darkness” value 5 that is 2 “pixels” wide around the entire image. Your call on specifics, though. v. Whatever else you feel like doing: image compression, combining two images together, darkening or lightening the image by changing the values of the “pixels”, or whatever you feel like doing. It’s up to you;

c. pictureEdit must contain at least one method that is declared using the “static” keyword, (much as Math.sqrt() is declared statically) and you must demonstrate proper use of it in main().

3. All 3 objects must be contained in a package called “EasyPicture”

4. In this package, you must also include a class called “picTest” that contains main() and demonstrates the successful completions of the requirements of this assignment. The code in main() should: a. Read in the data from “original.txt” b. Create a Java array from that data c. Create an Image object from that array d. Convert that Image object to ASCII art e. Write the ASCII version to disk f. Perform at least 2 manipulations on that image i. (Please only perform these manipulations on the data found in “original.txt”, and not on Images that have already been manipulated.)

Explanation / Answer

We need to create a package ascii which includes three classes,

The image data file is contained in "original.txt" and it needs to be converted to a 2d matrix for storing and manipulating easily.

First,lets create the image class.

import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

import java.io.ByteArrayInputStream;

public class Image
{
public static void main(String args[])throws IOException
{
BufferedImage img = null;
File f = null;

// read image
try
{
f = new File("original.txt");
img = ImageIO.read(f);
}
catch(IOException e)
{
System.out.println(e);
}

// get image's width and height
int width = img.getWidth();
int height = img.getHeight();
  

int [][] array = new int [20][20]; // image array


// write image to new ascii file
try
{
f = new File("G:\Out.jpg");
ImageIO.write(array, "ascii.txt", f);
}
catch(IOException e)
{
System.out.println(e);
}
}
}

We need to create an Image object from the array and convert that Image object to ASCII art e.

Then we write the ASCII version to disk f. All this is done in the main function.

pictureOutput.class

class pictureOutput

{

public String convert(final BufferedImage image) {

pictureEdit.class

class pictureEdit

import java.awt.image.BufferedImage;

{

javaxt.io.Image image = new javaxt.io.Image("/ascii.jpg");

//rotate image
image.rotate(90);
image.rotateCounterClockwise();
image.rotateClockwise();

//flip image

int width = image.getWidth();
int height = image.getHeight();
image.setCorners(30, 90, //UL
width-60, 0, //UR
width+20, height-50, //LR
80, height); //LL

//resize image i.e height and width

image.setWidth(200); //set width, adjusts height to maintain aspect ratio
image.setHeight(50); //set height, adjusts width to maintain aspect ratio
image.resize(75, 150); //set width and height to whatever you want

//crop image

System.out.println("Cropped Image Dimension: "+SubImgage.getWidth()+"x"+SubImgage.getHeight());

}

public class picTest

{

public static void main(String[] args)

{

final BufferedImage image = ImageIO.read(f);

}

private char returnStrPos(double g)//takes the grayscale value as parameter

else

{

str='#';

public String convert(final BufferedImage image) {

StringBuilder sb = new StringBuilder((image.getWidth() + 1) * image.getHeight()); for (int y = 0; y < image.getHeight(); y++) { if (sb.length() != 0) sb.append(" "); for (int x = 0; x < image.getWidth(); x++) { Color pixelColor = new Color(image.getRGB(x, y)); double gValue = (double) pixelColor.getRed() * 0.2989 + (double) pixelColor.getBlue() * 0.5870 + (double) pixelColor.getGreen() * 0.1140; final char s = negative ? returnStrNeg(gValue) : returnStrPos(gValue); sb.append(s); } } return sb.toString(); }

pictureEdit.class

class pictureEdit

import java.awt.image.BufferedImage;

import java.io.File; import java.io.IOException; import javax.imageio.ImageIO;

{

javaxt.io.Image image = new javaxt.io.Image("/ascii.jpg");

//rotate image
image.rotate(90);
image.rotateCounterClockwise();
image.rotateClockwise();

//flip image

int width = image.getWidth();
int height = image.getHeight();
image.setCorners(30, 90, //UL
width-60, 0, //UR
width+20, height-50, //LR
80, height); //LL

//resize image i.e height and width

image.setWidth(200); //set width, adjusts height to maintain aspect ratio
image.setHeight(50); //set height, adjusts width to maintain aspect ratio
image.resize(75, 150); //set width and height to whatever you want

//crop image

BufferedImage SubImgage = originalImgage.getSubimage(image,0,1,2);

System.out.println("Cropped Image Dimension: "+SubImgage.getWidth()+"x"+SubImgage.getHeight());

File outputfile = new File("croppedImage.jpg"); ImageIO.write(SubImgage, "jpg", finalimage); }

}

}

public class picTest

{

public static void main(String[] args)

{

final BufferedImage image = ImageIO.read(f);

if (image == null) throw new IllegalArgumentException(f + " is not a valid image."); final String ascii = new ASCII().convert(image); final JTextArea textArea = new JTextArea(ascii, image.getHeight(), image.getWidth());
  for(int i =0; i<256; i++)          {              System.out.println( i + ". " + (char)i);          }  

}

private char returnStrPos(double g)//takes the grayscale value as parameter

{ final char str; if (g =0) { str = ' space'; } else if (g=1) { str = '.'; } else if (g =2) { str = ':'; } else if (g =3) { str = 'o'; } else if (g =4) { str = 'O'; } else if (g =5) { str = '$'; }

else

{

str='#';

} return str; // return the character }