【问题标题】:ImageIO.write not writing image into folderImageIO.write 不将图像写入文件夹
【发布时间】:2022-08-16 03:25:51
【问题描述】:

我正在做一个项目,我试图将 jpg 图像的所有像素存储在一个数组中,然后使用该数组将原始图像的副本写入不同的文件夹中。但是,我似乎无法将副本写入文件夹。我知道这个问题与我创建的图像的副本有关,因为如果我使用原始图像作为 ImageIO.write 中的参数,则写作效果很好,但我仍然不完全确定问题出在哪里.有谁知道我可能会遇到什么样的错误,以及我能做些什么来解决它? (对于额外的上下文,我知道可以不使用数组来实现读/写,但我想使用数组来实现这一点) 参考代码:

package com.company;

import java.io.File;
import java.util.Scanner;
import java.util.concurrent.*;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class filereader {
  public static void main(String[] args) throws IOException {
    int width = 1536;
    int height = 2048;
    BufferedImage image = null;
    BufferedImage newimage = null;
    int[][] newarray = new int[height][width];
    File f = null;
    File g = null;
    try {
      System.out.println(\"Insert your file\");
      Scanner scanney = new Scanner(System.in);
      String arg1 = scanney.next();
      f = new File(arg1);  
      image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      image = ImageIO.read(f);
      for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
          newarray[i][j] = image.getRGB(j, i);
        }
      }
    } catch (IOException e) {
      System.out.println(\"Error:\" + e);
    }
    try {
      newimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      System.out.println(newimage.getType());
      for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
          int newimagestuff = newarray[i][j];
          newimage.setRGB(j, i, newimagestuff);
        }
      }
      int i = 0;
      g = new File(\"C:\\\\Users\\\\user1\\\\Documents\\\\File Reading\\\\Outputest.jpg\");
      ImageIO.write(newimage,\"jpg\", g);
      System.out.println(newimage);
      System.out.println(image);
    } catch (IOException e) {
      System.out.println(\"Error:\" + e);
    }
  }
}
  • 需要注意的一件重要事情是,ImageIO.write(..) 将返回一个boolean,指示写入是否成功。在您的情况下,它将返回false。这是因为默认的 JPEG 插件不支持带有 alpha 分量(RGB一个)。而是使用TYPE_INT_RGB,代码应该可以工作。
  • 最后,我想指出的是,逐像素复制图像文件效率不高,并且在 JPEG 压缩的情况下会降低质量。相反,直接复制文件而不解码会更快/更有效/更好的质量。 ???

标签: java javax.imageio


【解决方案1】:

您的代码有几个问题:

  • 您创建了两个新的 BufferedImages - 第一个完全没用,因为您在下一行用ImageIO.read() 的结果覆盖它。

  • 您创建的第二个 BufferedImage 具有 BufferedImage.TYPE_INT_ARGB 类型,这可能是错误的,因为 JPG 图像没有 alpha 通道(即类型中的“A”)。您宁愿使用image 的类型与ImageIO 一起读入。

  • 另外,当您始终可以读取完整的行时-如果它必须是用于中间存储的二维数组-甚至是一次完整的图像-如果单维图像就足够了,为什么还要逐个像素地复制。您可以为此使用public int[] getRGB​(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) 和匹配的setRGB 方法。

【讨论】:

    【解决方案2】:

    我认为转义文件路径中的空间可能会有所帮助。像那样:

          g = new File("C:\\Users\\user1\\Documents\\File\ Reading\\Outputest.jpg");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多