Search code examples
javarasterjavax.imageior-raster

Need to illuminate 20-pixels from top, bottom, right and left of an image and then I need to compare pixel values


I need to determinate whether the given image is blank or it has the same pixel values please find the below code. here I want to set a tolerance. I don't want to pass top, bottom, left and right 20 pixels to this logic. please help!

for (String pic : Finallist) {
    BufferedImage image = ImageIO.read(new File(pic));
    final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    final int width = image.getWidth();
    final int height = image.getHeight();
    final boolean hasAlphaChannel = image.getAlphaRaster() != null;
    boolean blankImage=true;
    int[][] result = new int[height][width];
    if (hasAlphaChannel) {
        final int pixelLength = 4;
        for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
            int argb = 0;
            argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
            argb += ((int) pixels[pixel + 1] & 0xff); // blue
            argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
            result[row][col] = argb;
            if(result[row][col]!=result[0][0]) {
                blankImage=false;
            }
            col++;

            if (col == width) {
                col = 0;
                row++;
            }
        }
    } else {
        final int pixelLength = 3;
        for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
            int argb = 0;
            argb += -16777216; // 255 alpha
            argb += ((int) pixels[pixel] & 0xff); // blue
            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
            result[row][col] = argb;
            if(result[row][col]!=result[0][0]) {
                blankImage=false;
            }
            col++;

            if (col == width) {
                col = 0;
                row++;
            }            
        }
    }

    if(blankImage==true) {
        try {
            System.out.println("Blank image found and its deleted");
            File f = new File(pic);
            f.delete();
        } catch(Exception e) {
            System.out.println("Exception"+e);
        }
    }else {
        FinalListWithOutBlank.add(pic);
    }
}

I want every thing on the air!! so that my code performance will not be in the pain.. I just want to skip those pixel to reach out into this logic..


Solution

  • Copy the desired area of interest into another image with

    BufferedImage imageForEvaluation = image.getSubimage(x, y, width, height);
    

    and use this image for your logic.