Finding Java Image Pixels Information – ARGB (Alpha, Red, Green Blue)

In digital imaging, a pixel(or picture element) is the smallest item of information in an image. Pixels are normally arranged in a 2-dimensional grid, and are often represented using dots or squares. Each pixel is a sample of an original image, where more samples typically provide more-accurate representations of the original. The intensity of each pixel is variable; in color systems, each pixel has typically three or four components such as red, green, and blue, or cyan, magenta, yellow, and black.

The word pixel is based on a contraction of pix (“pictures”) and el (for “element”); similar formations with el for “element” include the words: voxel and texel. [Wikipedia]

In java 2D images, pixels are arranged in 2 dimensional array. If you take an image of dimension 200×300, there will be a total of 60,000 pixels. Each pixel is represented by a 32 bit integer. 32bit (4Bytes) represent 4 different color information. These color information, called ARGB, stand for Alpha, Red, Green and Blue. Each byte out of 4 Bytes of every pixel represents one of these color information.

In the following tutorial, you will learn

  • How to read image from filesystem
  • How to calculate the image height and width
  • How to loop through each pixel and get pixel info
  • Get alpha (transparency) value from the pixel
  • Get Color info (red, green and blue) from the pixel
  • How to do bit manipulation on an integer

package com.kushal.graphics;

/**
 * @Author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modified On: 2009-10-21
 *
 * PrintImageARGBPixels.java
 * Reads an image and prints out it's color and alpha
 * information of individual pixels [Alpha, Red, Green Blue]
 */
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class PrintImageARGBPixels {

	public static void main(String args[]) {
		/**
		 * Read a sample image from the filesystem
		 */
		BufferedImage image = readImage("c:/temp/generalImage.jpg");

		/**
		 * Call the method that prints out ARGB color Information.
		 * ARGB = Alpha, Red, Green and Blue
		 */
		printAllARGBDetails(image);
	}

	public static void printAllARGBDetails(BufferedImage image) {
		int width = image.getWidth();
		int height = image.getHeight();
		System.out.println("Image Dimension: Height-" + height + ", Width-"
				+ width);
		System.out.println("Total Pixels: " + (height * width));
		for (int i = 0; i < width; i++) {
			for (int j = 0; j < height; j++) {

				int pixel = image.getRGB(i, j);
				System.out.println("Pixel Location(" + i + "," + j + ")- ["
						+ getARGBPixelData(pixel) + "]");
			}
		}
	}

	/**
	 * Image Pixels are Arrays of Integers [32 bits/4Bytes]
	 * Consider a 32 pixel as 11111111-00110011-00111110-00011110
	 *
	 * First Byte From Left [11111111]= Alpha
	 * Second Byte From Left[00110011]= Red
	 * Third Byte From Left [00111110]= Green
	 * Fourth Byte From Left[00011110]= Blue
	 *
	 * The following method will do a proper bit shift and
	 * logical AND operation to extract the correct values
	 * of different color/alpha components.
	 *
	 */
	public static String getARGBPixelData(int pixel) {
		String pixelARGBData = "";
		/**
		 * Shift all pixels 24 bits to the right.
		 * Do a logical and with 0x000000FF
		 * i.e. 0000 0000 0000 0000 0000 0000 1111 1111
		 * You will get the alpha value for the pixel
		 */
		int alpha = (pixel >> 24) & 0x000000FF;

		/**
		 * Shift all pixels 16 bits to the right.
		 * Do a logical and with 0x000000FF
		 * i.e. 0000 0000 0000 0000 0000 0000 1111 1111
		 * You will get the red value for the pixel
		 */

		int red = (pixel >> 16) & 0x000000FF;

		/**
		 * Shift all pixels 8 bits to the right.
		 * Do a logical and with 0x000000FF
		 * i.e. 0000 0000 0000 0000 0000 0000 1111 1111
		 * You will get the green value for the pixel
		 */
		int green = (pixel >>8 ) & 0x000000FF;

		/**
		 * Dont do any shift.
		 * Do a logical and with 0x000000FF
		 * i.e. 0000 0000 0000 0000 0000 0000 1111 1111
		 * You will get the blue value for the pixel
		 */
		int blue = (pixel) & 0x000000FF;

		pixelARGBData = "Alpha: " + alpha + ", " + "Red: " + red + ", "
				+ "Green: " + green + ", " + "Blue: " + blue;

		return pixelARGBData;
	}

	/**
	 * This method reads an image from the file
	 * @param fileLocation -- > eg. "C:/testImage.jpg"
	 * @return BufferedImage of the file read
	 */
	public static BufferedImage readImage(String fileLocation) {
		BufferedImage img = null;
		try {
			img = ImageIO.read(new File(fileLocation));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return img;
	}

	/*
	 * SANJAAL CORPS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
	 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
	 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
	 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SANJAAL CORPS SHALL NOT BE LIABLE FOR
	 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
	 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
	 *
	 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
	 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
	 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
	 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
	 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
	 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
	 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SANJAAL CORPS
	 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
	 * HIGH RISK ACTIVITIES.
	 */
}

Sample Image Used In This Program (You can use any of your own).

Output of this program on a sample Image:
Note that I have shortened the output by removing many lines from in between. This is because I took a 122×122 image and there were a total of 14884 pixel info printed on the screen.

The complete  output file is available here.

Image Dimension: Height-122, Width-122
Total Pixels: 14884
Pixel Location(0,0)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,1)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,2)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,3)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,4)- [Alpha: 255, Red: 255, Green: 254, Blue: 255]
Pixel Location(0,5)- [Alpha: 255, Red: 255, Green: 254, Blue: 255]
Pixel Location(0,6)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,7)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,8)- [Alpha: 255, Red: 254, Green: 255, Blue: 255]
Pixel Location(0,9)- [Alpha: 255, Red: 254, Green: 255, Blue: 255]
Pixel Location(0,10)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,11)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,12)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,13)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,14)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,15)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(0,16)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
.
.
.
Pixel Location(90,26)- [Alpha: 255, Red: 216, Green: 217, Blue: 219]
Pixel Location(90,27)- [Alpha: 255, Red: 219, Green: 215, Blue: 216]
Pixel Location(90,28)- [Alpha: 255, Red: 216, Green: 216, Blue: 216]
Pixel Location(90,29)- [Alpha: 255, Red: 210, Green: 214, Blue: 213]
Pixel Location(90,30)- [Alpha: 255, Red: 206, Green: 210, Blue: 209]
Pixel Location(90,31)- [Alpha: 255, Red: 219, Green: 212, Blue: 202]
Pixel Location(90,32)- [Alpha: 255, Red: 235, Green: 205, Blue: 179]
Pixel Location(90,33)- [Alpha: 255, Red: 221, Green: 167, Blue: 121]
Pixel Location(90,34)- [Alpha: 255, Red: 213, Green: 132, Blue: 66]
Pixel Location(90,35)- [Alpha: 255, Red: 220, Green: 130, Blue: 52]
Pixel Location(90,36)- [Alpha: 255, Red: 212, Green: 133, Blue: 56]
Pixel Location(90,37)- [Alpha: 255, Red: 196, Green: 139, Blue: 72]
Pixel Location(90,38)- [Alpha: 255, Red: 185, Green: 161, Blue: 115]
Pixel Location(90,39)- [Alpha: 255, Red: 206, Green: 203, Blue: 160]
Pixel Location(90,40)- [Alpha: 255, Red: 207, Green: 213, Blue: 153]
Pixel Location(90,41)- [Alpha: 255, Red: 174, Green: 189, Blue: 120]
Pixel Location(90,42)- [Alpha: 255, Red: 160, Green: 183, Blue: 113]
Pixel Location(90,43)- [Alpha: 255, Red: 124, Green: 155, Blue: 114]
.
.
.
Pixel Location(121,105)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,106)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,107)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,108)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,109)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,110)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,111)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,112)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,113)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,114)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,115)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,116)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,117)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,118)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,119)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,120)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]
Pixel Location(121,121)- [Alpha: 255, Red: 255, Green: 255, Blue: 255]

How to capture a screenshot using Java and save it to a file?

A screenshot, screen capture, or screen dump is an image taken by the computer to record the visible items displayed on the monitor or another visual output device. Usually this is a digital image taken by the host operating system or software running on the computer device, but it can also be a capture made by a camera or a device intercepting the video output of the computer.

Screenshots, screen dumps, or screen captures can be used to demonstrate a program, a particular problem a user might be having or generally when computer output needs to be shown to others or archived, or to simply show off what you do on your computer to others. [Wikipedia]

The following java program demonstrates how to use Robot class from java.awt package to capture screenshots and save the image thus captured to disk.

package com.kushal.utils;

/**
 * @author Kushal Paudyal
 * JavaScreenCaptureUtil.java
 * 
 * This utility captures the screenshot and saves
 * the captured image to disk.
 */
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.imageio.ImageIO;

public class JavaScreenCaptureUtil {

	public static void main(String args[]) throws Exception {

		/**
		 * This class (Robot.java) is used to generate native system input events for the 
		 * purposes of test automation, self-running demos, and other 
		 * applications where control of the mouse and keyboard is needed. 
		 * The primary purpose of Robot is to facilitate automated testing 
		 * of Java platform implementations. 
		 */
		Robot robot = new Robot();
		
		/**
		 * Get the current screen dimensions.
		 */
		Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
		int width = (int) d.getWidth();
		int height = (int) d.getHeight();
		
		
		/**
		 * Delay the robot for 5 seconds (5000 ms) allowing you to switch to proper
		 * screen/window whose screenshot is to be taken.
		 * 
		 * You can change the delay time as required.
		 */
		robot.delay(5000);
		
		/**
		 * Create a screen capture of the active window and then create a buffered image
		 * to be saved to disk.
		 */
		Image image = robot.createScreenCapture(new Rectangle(0, 0, width,
				height));

		BufferedImage bi = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = bi.createGraphics();
		g.drawImage(image, 0, 0, width, height, null);

		/**
		 * Filename where to save the file to.
		 * I am appending formatted timestamp to the filename.
		 */
		String fileNameToSaveTo = "C:/temp/screenCapture_"
				+ createTimeStampStr() + ".PNG";
		
		/**
		 * Write the captured image to a file.
		 * I am using PNG format. You can choose PNG, JPG, GIF.
		 */
		writeImage(bi, fileNameToSaveTo, "PNG");

		System.out.println("Screen Captured Successfully and Saved to:n"+fileNameToSaveTo);

	}

	/**
	 * This method writes a buffered image to a file
	 * 
	 * @param img -- > BufferedImage
	 * @param fileLocation --> e.g. "C:/testImage.jpg"
	 * @param extension --> e.g. "jpg","gif","png"
	 */
	public static void writeImage(BufferedImage img, String fileLocation,
			String extension) {
		try {
			BufferedImage bi = img;
			File outputfile = new File(fileLocation);
			ImageIO.write(bi, extension, outputfile);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @return String representation of timestamp 
	 * in the format of yyyyMMdd_hhmmss (e.g. 20100426_111612)
	 * @throws Exception
	 */
	public static String createTimeStampStr() throws Exception {
		Calendar mycalendar = Calendar.getInstance();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_hhmmss");
		String timeStamp = formatter.format(mycalendar.getTime());

		return timeStamp;

	}

       /*
	 * SANJAAL CORPS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
	 * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
	 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
	 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SANJAAL CORPS SHALL NOT BE
	 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
	 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
	 * 
	 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
	 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
	 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
	 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
	 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
	 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
	 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SANJAAL CORPS
	 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
	 * HIGH RISK ACTIVITIES.
	 */

}

Java 2D Graphics Example Tutorial On Paint, Gradient and Stroke

Java 2D is an API for drawing two-dimensional graphics using the Java programming language. Every Java 2D drawing operation can ultimately be treated as filling a shape using a paint and compositing the result onto the screen. The following example will demonstrate:

  • — How to define JAVA 2D Shape
  • — How to define Gradient Paint
  • — How to set Graphics paint
  • — How to relocate the java 2D frame for redrawing
  • — How to set the strokes in the Graphics
  • — How to fill shapes with color or gradient

You will also be learning

  • — How to center your GUI on the screen automatically.

package com.kushal.graphics;
/**
 * Java 2D Graphics Example Tutorial On Paint, Gradient and Stroke
 * @author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modified On 10th August 2009
 */

import java.awt.*;
import java.awt.geom.*;

import javax.swing.JFrame;

public class JavaPaintAndStroke extends JFrame {

	private static final long serialVersionUID = 7944800805864455013L;

	public static void main(String[] args) {
		JavaPaintAndStroke paintFrame = new JavaPaintAndStroke();
		paintFrame.setTitle("Sanjaal.com/java - GUI Tutorial");
		paintFrame.setSize(350, 200);
		paintFrame.setVisible(true);
		paintFrame.centerTheGUIFrame(paintFrame);

	}

	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		double x = 20, y = 60, w = 80, h = 80;
		/** Defining a rectangle and a gradient **/
		Rectangle2D r = new Rectangle2D.Double(x, y, w, h);
		GradientPaint gp = new GradientPaint(75, 75, Color.red, 95, 95,
				Color.green, true);

		/**
		 * Filling the rectangle with a gradient paint
		 */
		g2.setPaint(gp);
		g2.fill(r);

		/**
		 * Shifting the frame to the right by 100
		 * Then using Stroke With a Solid Color
		 *
		 * setFrame method below sets the location and size of
		 * the outer bounds of this Rectangle2D to the
		 * specified rectangular values.
		 *
		 * x, y locations
		 * w, h width and height of new Rectangle frame
		 */
		r.setFrame(x + 100, y, w, h);
		g2.setPaint(Color.red);
		g2.setStroke(new BasicStroke(8));
		g2.draw(r);

		/**
		 * Shifting the original rectangle frame to the right by 200
		 * Then using a Stroke With a Gradient Color
		 */
		r.setFrame(x + 200, y, w, h);
		g2.setPaint(gp);
		g2.draw(r);
	}

	/**
	 * This method is used to center the GUI
	 * @param frame - Frame that needs to be centered.
	 */
	public void centerTheGUIFrame(JFrame frame) {
		int widthWindow = frame.getWidth();
		int heightWindow = frame.getHeight();

		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int X = (screen.width / 2) - (widthWindow / 2); // Center horizontally.
		int Y = (screen.height / 2) - (heightWindow / 2); // Center vertically.

		frame.setBounds(X, Y, widthWindow, heightWindow);

	}
}


==========================
The following is the output of this program.