Search code examples
javajpegpixelpixelate

How can I pixelate a jpg with java?


I'm trying to pixelate a JPEG with Java 6 and not having much luck. It needs to be with Java - not an image manipulation program like Photoshop, and it needs to come out looking old school - like this:

Pixelated Image

Can anybody help me?


Solution

  • Using the java.awt.image (javadoc) and javax.imageio (javadoc) APIs, you can easily loop through the image's pixels and perform the pixelation yourself.

    Example code follows. You will need at least these imports: javax.imageio.ImageIO, java.awt.image.BufferedImage, java.awt.image.Raster, java.awt.image.WritableRaster, and java.io.File.

    Example:

    // How big should the pixelations be?
    final int PIX_SIZE = 10;
    
    // Read the file as an Image
    img = ImageIO.read(new File("image.jpg"));
    
    // Get the raster data (array of pixels)
    Raster src = img.getData();
    
    // Create an identically-sized output raster
    WritableRaster dest = src.createCompatibleWritableRaster();
    
    // Loop through every PIX_SIZE pixels, in both x and y directions
    for(int y = 0; y < src.getHeight(); y += PIX_SIZE) {
        for(int x = 0; x < src.getWidth(); x += PIX_SIZE) {
    
            // Copy the pixel
            double[] pixel = new double[3];
            pixel = src.getPixel(x, y, pixel);
    
            // "Paste" the pixel onto the surrounding PIX_SIZE by PIX_SIZE neighbors
            // Also make sure that our loop never goes outside the bounds of the image
            for(int yd = y; (yd < y + PIX_SIZE) && (yd < dest.getHeight()); yd++) {
                for(int xd = x; (xd < x + PIX_SIZE) && (xd < dest.getWidth()); xd++) {
                    dest.setPixel(xd, yd, pixel);
                }
            }
        }
    }
    
    // Save the raster back to the Image
    img.setData(dest);
    
    // Write the new file
    ImageIO.write(img, "jpg", new File("image-pixelated.jpg"));
    

    Edit: I thought I should mention -- the double[] pixel is, as far as I can tell, just the RGB color values. For example, when I dumped a single pixel, it looked like {204.0, 197.0, 189.0}, a light tan color.