无法在 Java 中创建图像文件

Can't create an image file in Java

我需要做的是我有一个输入图像文件,我需要将其更改为用户参数。例如,如果用户想让它变暗 %30,首先我获取所有像素及其 RGB 值并将它们存储在二维数组中。下面给出了示例数组。

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

之后我覆盖了 RGB 值(在我们的例子中,如果 RGB 值是 10:10:10,新值将是 7:7:7)。从那时起一切都很好。但是现在我在使用我的新信息数组创建 output.jpg 文件时遇到了一些困难。当我 运行 我的函数时,它不会创建任何 output.jpg 文件。这是我的功能。

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);
        }
    }

我不明白这是什么问题,为什么我无法使用此功能获得更暗的图像。 (我知道总是有更简单和基本的方法来做到这一点,但这是一个多线程任务,我必须按照我解释的那样去做。)如果有人帮助我,我将不胜感激。

正如@HaraldK 所说,在我的函数中我使用 BufferedImage.TYPE_INT_ARGB 作为参数。但是由于我没有 alpha 值,所以我只是将其更改为 BufferedImage.TYPE_INT_RGB。修改下面给出的功能,它可以正常工作。

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);
        }
    }

ImageIO.write(...) 方法 return a boolean 指示是否安装了可以以给定格式写入图像的插件。检查此值是一种很好的做法。虽然始终安装了 JPEG 插件,但在 Java 的最新版本中,JPEG 插件不再支持带有 alpha 通道的图像。反正其他大部分软件都不支持4通道RGBA JPEG,所以损失不大...

您只需将 BufferedImage.TYPE_INT_ARGB 更改为没有 alpha 的类型,例如 BufferedImage.TYPE_INT_RGBTYPE_3BYTE_BGR,一切都会正常进行。无论如何,你似乎没有使用 alpha 通道。

重要变化:

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);
}