22
CSC1401 Manipulating Pictures

CSC1401 Manipulating Pictures. What we have done to date We have modified pictures by writing on top of them Using Turtles and using Graphics Drawing

Embed Size (px)

Citation preview

CSC1401Manipulating Pictures

What we have done to date

We have modified pictures by writing on top of them

Using Turtles and using Graphics

Drawing lines, shapes and text, as well as inserting a picture into another picture

What would be nice to do

Changing colors on the picturesRed-eye reduction

Blending pictures

Doing other fancy Adobe Photoshop-like transformations

But this would be almost impossible to do by simply drawing on top of the existing picture

The Goal

Develop an easier approach to modifying our pictures by changing the pictures themselves rather than writing on top of them

Digital Pictures

Represented by pixelsWith a red, green, and blue value stored for each pixel

Stored in .jpg (JPEG) filesInternational standardWith lossy compression

Lossy means not all data is storedBut what is lost isn’t that important

Compression means made smaller

Other formats for storing digital pictures are GIF and BMP

Manipulating a Picture

To manipulate a picture we need to manipulate the pixels that make up the picture

Change the red, green, or blue values at the pixel

Pixel is a class created at Georgia TechEach pixel object has a red, green, and blue value

Pictures have lots of Pixels

How can we refer to each pixel?pixel1, pixel2, pixel3, pixel4, pixel5, …

Do we really want to name each one?On a 640 x 480 picture, there are 640 x 480 = 307,200 pixels

How do we change a Pixel?Pixel first;

first = stevepicture.getPixel(10,120); // 10 refers to the row and 120 to the column

first.setColor(Color.black); /* The book writes the code as:stevepicture.getPixel(10,100).setColor(Color.black); */

Note that if you have already shown the picture, by invoking: stevepicture.show();

You can cause the picture to be updated by: stevepicture.repaint();

Pictures have lots of Pixels

How do we deal with lots of data of the same type?

Use an array

What is an Array?

Storage for a sequence of items

Of the same type

You can access items by using an indexThe index starts at 0

The first item is at index 0The last item is at index (length – 1)

Arrays know their length (have a public length field)

arrayObj.length

3 7 9 2 1 5

8 3 2 6

0 1 2 3 4 5

0 1 2 3

But how does an array help us?

If we wish to change lots of pictures, we can use a loop!

Recall from Alice

In this example, each time through the loop, the bunny hopped

Note that the index variable changes from 0 to 1 to 2 to … each time through the loop. And we can take advantage of that when working with arrays!

In Java

Use a loop to access an array of pixels

The first time through the loop we access pixelArray[0]

The second time through the loop we access pixelArray[1]

What Data does a Picture Object Have?

A picture object has an array of pixel objects

That it read from the .JPG file

It knows the picture widthpictureObj.getWidth()

It knows the picture heightpictureObj.getHeight()

It knows how to return an array of pixelsPixel[] pixelArray = pictureObj.getPixels()

Pixel Objects

Each pixel has a red, green, and blue value

getRed(), getGreen(), getBlue()setRed(v), setGreen(v), setBlue(v)

Each pixel knows the location it was in the picture object

getX(), getY()

You can also get and set the color at the pixel

getColor(), setColor(color)

Turning all of the pixels in our picture to red – using a loop

Notes:

1) We have created a counter that starts at 0, and goes up to the number of pixels in the picture

2) Each pixel has its color set to red!

3) How would this code have looked had it been written as a method inside of the Picture class?

A note on Color

You can either set the red, green and blue amounts individually, or all together using mypixel.setColor(someColor)

You can create a color object by giving the red, green, and blue values for itColor colorObj = new Color(255,10,125);

Predefined Colors

The Color class has defined class constants for many colors

Color.red, Color.green, Color.blue, Color.black, Color.white, Color.yellow, Color.gray, Color.orange, Color.pink, Color.cyan, Color.magentaOr you can use all uppercase names

Color.RED, Color.BLUE, Color.BLACK, …

Getting and Setting Pixel Colors

To get a pixel’s color as a color objectColor color1 = pixelObj.getColor();

int red = color1.getRed();

int green = color1.getGreen();

int blue = color1.getBlue();

To set a pixel’s color using a new color objectred = 20;

green = 30;

blue = 100;

Color color2 = new Color(red,green,blue);

pixelObj.setColor(color2);

Changing Pixel Colors

There are two ways to change the color of a pixel in a picture

Set the red, green, and blue values individuallypixelObj.setRed(value), pixelObj.setGreen(value), pixelObj.setBlue(value),

Or set the colorpixelObj.setColor(colorObj)

But, you won’t see any change in the pictureUntil you ask it to repaint: pictureObj.repaint();Or you invoke the show method

Summary

Pictures have pixelsYou can change the picture by changing the color of the pixels

Arrays let you store and retrieve values of the same type using an indexYou can ask a picture for it’s width, height, and an array of pixelsYou can get and set the color of a pixel

Assignment

Read Media Computation Chapter 4 – we’ll be covering while loops and for-each loops next week