teaching machines

CS1: Lecture 27 – BufferedImage

November 4, 2019 by . Filed under cs1, fall 2019, lectures.

Dear students,

In homeworks 4 and 5, we work with images. Loops are a natural companion to images, which are large collections of indexed data that we are not even tempted to process without loops. The general pattern of visiting all pixels of an image is this:

for (int r = 0; r < image.getHeight(); ++r) {
  for (int c = 0; c < image.getWidth(); ++c) {
    // Retrieve the color at the current pixel, or set it.
    int packedColor = image.getRGB(c, r);
    image.setRGB(c, r, ...);
  }
}

We’ll use nested loops and get some practice with the BufferedImage class using these exercises:

TODO

Here’s your TODO list to complete before we meet again:

See you next class!

Sincerely,

P.S. It’s time for a haiku!

Then: Who does your hair?
Now: Who does your Photoshop?
Later: Are you real?

P.P.S. Here’s the code we wrote together in class…

ChannelSwap.java

package lecture1104.cs145;

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

public class ChannelSwap {
  public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File("/Users/johnch/Desktop/skittles.jpg"));
    for (int r = 0; r < image.getHeight(); ++r) {
      for (int c = 0; c < image.getWidth(); ++c) {
        int packedColor = image.getRGB(c, r);
        Color color = new Color(packedColor);
        Color reorderedColor = new Color(color.getGreen(), color.getGreen(), color.getGreen());
        int packedReorderedColor = reorderedColor.getRGB();
        image.setRGB(c, r, packedReorderedColor);
      }
    }

    ImageIO.write(image, "jpg", new File("/Users/johnch/Desktop/out2.jpg"));
  }
}

Hulk.java

package lecture1104.cs145;

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

public class Hulk {
  public static void main(String[] args) throws IOException {
    BufferedImage original = ImageIO.read(new File("/Users/johnch/Desktop/hulk.jpg"));
    BufferedImage invisible = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for (int r = 0; r < original.getHeight(); ++r) {
      for (int c = 0; c < original.getWidth(); ++c) {
        int packedColor = original.getRGB(c, r);
        Color color = new Color(packedColor);
        if (color.getGreen() > 50 && color.getRed() < 100 && color.getBlue() < 100) {
          color = new Color(color.getRed(), color.getGreen(), color.getBlue(), 10);
        }
        invisible.setRGB(c, r, color.getRGB());
      }
    }

    System.out.println("HELP!!!!");

    ImageIO.write(invisible, "png", new File("/Users/johnch/Desktop/hulkplease.png"));
  }
}

TwoFace.java

package lecture1104.cs145;

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

public class TwoFace {
  public static void main(String[] args) throws IOException {
    BufferedImage left = ImageIO.read(new File("/Users/johnch/Desktop/harvey_dent.jpg"));
    BufferedImage right = ImageIO.read(new File("/Users/johnch/Desktop/full_villain.jpg"));
    BufferedImage split = new BufferedImage(left.getWidth(), left.getHeight(), BufferedImage.TYPE_INT_RGB);

    for (int r = 0; r < left.getHeight(); ++r) {
      for (int c = 0; c < left.getWidth(); ++c) {
        if (c < left.getWidth() / 2) {
          split.setRGB(c, r, left.getRGB(c, r));
        } else {
          split.setRGB(c, r, right.getRGB(c, r));
        }
      }
    }

    ImageIO.write(split, "jpg", new File("/Users/johnch/Desktop/split.jpg"));
  }
}

Xor.java

package lecture1104.cs145;

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

public class Xor {
  public static void main(String[] args) throws IOException {
    BufferedImage texture = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);

    for (int r = 0; r < texture.getHeight(); ++r) {
      for (int c = 0; c < texture.getWidth(); ++c) {
        texture.setRGB(c, r, new Color(c ^ r, c, r).getRGB());
      }
    }

    ImageIO.write(texture, "png", new File("/Users/johnch/Desktop/xor.png"));
  }
}

GreenScreen.java

package lecture1104.cs148;

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

public class GreenScreen {
  public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File("/Users/johnch/Desktop/raccoon.jpg"));
    BufferedImage cleared = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for (int r = 0; r < image.getHeight(); r++) {
      for (int c = 0; c < image.getWidth(); c++) {
        Color color = new Color(image.getRGB(c, r));
        if (color.getGreen() > 20 && color.getRed() < 100 && color.getBlue() < 100) {
          color = new Color(color.getRed(), color.getGreen(), color.getBlue(), 0);
        }
        cleared.setRGB(c, r, color.getRGB());
      }
    }

    ImageIO.write(cleared, "png", new File("/Users/johnch/Desktop/cleared.png"));
  }
}

Swap.java

package lecture1104.cs148;

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

public class Swap {
  public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File("/Users/johnch/Desktop/peacock.jpg"));

    for (int r = 0; r < image.getHeight(); r++) {
      for (int c = 0; c < image.getWidth(); c++) {
        Color color = new Color(image.getRGB(c, r));
        Color swappedColor = new Color(color.getGreen(), color.getBlue(), color.getRed());
        image.setRGB(c, r, swappedColor.getRGB());
      }
    }

    ImageIO.write(image, "jpg", new File("/Users/johnch/Desktop/out2.jpg"));
  }
}

TwoFace.java

package lecture1104.cs148;

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

public class TwoFace {
  public static void main(String[] args) throws IOException {
    BufferedImage left = ImageIO.read(new File("/Users/johnch/Desktop/harvey_dent.jpg"));
    BufferedImage right = ImageIO.read(new File("/Users/johnch/Desktop/full_villain.jpg"));
    BufferedImage split = new BufferedImage(left.getWidth(), left.getHeight(), BufferedImage.TYPE_INT_RGB);

    for (int r = 0; r < left.getHeight(); r++) {
      for (int c = 0; c < left.getWidth(); c++) {
        if (c < left.getWidth() / 2) {
          split.setRGB(c, r, left.getRGB(c, r));
        } else {
          split.setRGB(c, r, right.getRGB(c, r));
        }
      }
    }

    ImageIO.write(split, "jpg", new File("/Users/johnch/Desktop/twoface.jpg"));
  }
}

Xor.java

package lecture1104.cs148;

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

public class Xor {
  public static void main(String[] args) throws IOException {
    BufferedImage texture = new BufferedImage(500, 710, BufferedImage.TYPE_INT_RGB);

    for (int r = 0; r < texture.getHeight(); r++) {
      for (int c = 0; c < texture.getWidth(); c++) {
        texture.setRGB(c, r, new Color((c ^ r) % 256, c % 256, r % 256).getRGB());
      }
    }

    ImageIO.write(texture, "png", new File("/Users/johnch/Desktop/xor.png"));
  }
}