无法在 Java 中创建图像文件

Posted

技术标签:

【中文标题】无法在 Java 中创建图像文件【英文标题】:Can't create an image file in Java 【发布时间】:2021-12-26 14:51:23 【问题描述】:

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

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

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

【问题讨论】:

您是否尝试过调试?您从数据中获得的每个像素的rgb 值是多少? 您是否尝试过提供绝对文件名?我的猜测是它正在创建文件,而不是您期望的位置。 ImageIO.write(...) 返回一个boolean 指示是否安装了可以以给定格式写入图像的插件。总有一个 JPEG 插件安装,但在最近的 Java 版本中,它不使用 alpha 通道编写图像。最有可能的是,您只需将BufferedImage.TYPE_INT_ARGB 更改为BufferedImage.TYPE_INT_RGB,一切都会奏效。无论如何,您似乎没有使用 alpha 通道。 @HaraldK 太棒了!谢谢你给的信息。现在可以了。 添加为下面的答案。 【参考方案1】:

正如@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);
        
    

【讨论】:

【参考方案2】:

ImageIO.write(...) 方法返回一个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);

【讨论】:

以上是关于无法在 Java 中创建图像文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中创建图像文件夹资源

如何在 C++ 中创建 CMYK 模式图像?

Firebase 存储 - 将图像上传到 Firebase 存储并在实时数据库中创建指向该图像的链接

图像处理 gem 在 GCS 中创建调整大小的文件

如何在内部存储中创建文件夹并保存捕获的图像

从内存中的 url 下载图像并在内存中创建 zip 存档以发送到浏览器