Home > Software engineering >  Can't create an image file in Java
Can't create an image file in Java

Time:11-15

What I need to do is I have a input image file and I need to change it as user's parameters. For example if user wants to make it 0 darker, first I get all pixels with their RGB values and store them in an 2D array. Sample array given below.

114 121 140     //Pixel 1
114 121 140     //Pixel 2
114 121 140     //Pixel 3
     .
     .
     .
50 57 83        //Pixel 2073601

After that I overwrite that RGB values (in our case if RGB values are 10:10:10, new values will be 7:7:7). Everything from that point is ok. But now I'm facing some difficulties about creating my output.jpg file using my new array of information. When I run my function, it does not creates any output.jpg file. Here is my function.

public static void createFinalImage(int height, int width, String[][] rgbArray, String outputFile) {
        BufferedImage img;
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        File f;

        for (int y = 0; y < height; y  ) {
            for (int x = 0; x < width; x  ) {
                String[] data = rgbArray[y][x].split(" ");
                int red = Integer.parseInt(data[0]);
                int green = Integer.parseInt(data[1]);
                int blue = Integer.parseInt(data[2]);

                int rgb = new Color(red,green,blue).getRGB();
                img.setRGB(x,y,rgb);
            }
        }
        try
        {
            f = new File(outputFile);
            ImageIO.write(img, "jpg", f);
        }
        catch(IOException e)
        {
            System.out.println("Error: "   e);
        }
    }

I cant understand what is the problem and why I cant get darker image using this function. (I know there is always easier and basic ways to do it but this is an multithreading assignment and I must do it like I explained.) If anyone help me, I would be appreciated.

CodePudding user response:

The ImageIO.write(...) methods return a boolean indicating whether or not there is a plugin installed that can write the image in the given format. It's good practice to check this value. While there is always a JPEG plugin installed, in recent versions of Java the JPEG plugin no longer supports images with alpha channel. Most other software don't support 4 channel RGBA JPEGs anyway, so it's not a big loss...

All you need is to change BufferedImage.TYPE_INT_ARGB to a type without alpha, like BufferedImage.TYPE_INT_RGB or TYPE_3BYTE_BGR, and things will work. You don't seem to use the alpha channel anyway.

The important changes:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

for (int y = 0; y < height; y  ) {
    for (int x = 0; x < width; x  ) {
       // Manipulate pixels
    }
}

try {
    File f = new File(outputFile);
    if (!ImageIO.write(img, "JPEG", f)) {
        System.err.println("No plugin to write "   img   " in JPEG format to "   f);
    }
}
catch (IOException e) {
    System.out.println("Error: "   e);
}

CodePudding user response:

As @HaraldK said, in my function I was using BufferedImage.TYPE_INT_ARGB as parameter. But since I have no alpha value, I just changed it as BufferedImage.TYPE_INT_RGB. Modified function given below and it works as normal.

public static void createFinalImage(int height, int width, String[][] rgbArray, String outputFile) {
        BufferedImage img;
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        File f;

        for (int y = 0; y < height; y  ) {
            for (int x = 0; x < width; x  ) {
                String[] data = rgbArray[y][x].split(" ");
                int red = Integer.parseInt(data[0]);
                int green = Integer.parseInt(data[1]);
                int blue = Integer.parseInt(data[2]);

                int rgb = new Color(red,green,blue).getRGB();
                img.setRGB(x,y,rgb);
            }
        }
        try
        {
            f = new File(outputFile);
            ImageIO.write(img, "jpg", f);
        }
        catch(IOException e)
        {
            System.out.println("Error: "   e);
        }
    }
  • Related