【发布时间】: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