Java 没有创建图像文件(使用 ImageIO)
Java not creating Image file (Using ImageIO)
我接到了一项任务,我必须从辅助内存中读取两张图像,并且必须将它们存储在两个单独的矩阵中。然后我必须将这些矩阵相乘并将结果矩阵转换回图像并将其存储在 HDD 中。这是代码:
package ISI;
import java.io.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import javax.imageio.ImageIO;
import javax.swing.*;
class ImageMultiplication {
BufferedImage img1, img2;
File f1, f2;
int matrix1[][], matrix2[][], matrix3[][];
int w,h;
ImageMultiplication() {
img1 = img2 = null;
f1 = f2 = null;
w = 500;
h = 400;
}
void readImages() throws IOException {
f1 = new File("image1.jpg");
f2 = new File("image2.jpg");
img1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img1 = ImageIO.read(f1);
img2 = ImageIO.read(f2);
System.out.println("\nReading of images complete");
}
void convertToMatrix() {
int [] array1 = new int[w*h];
matrix1 = new int[h][w];
int [] array2 = new int[w*h];
matrix2 = new int[w][h];
matrix3 = new int[h][h];
try {
img1.getRGB(0, 0, w, h, array1, 0, w);
img2.getRGB(0, 0, w, h, array2, 0, w);
}
catch(Exception e) {
System.out.println("\nInterrupted");
}
int count=0;
for(int i=0;i<h;i++) {
for(int j=0;j<w;j++) {
if(count == array1.length)
break;
matrix1[i][j] = array1[count];
count++;
}
}
count=0;
for(int i=0;i<w;i++) {
for(int j=0;j<h;j++) {
if(count == array2.length)
break;
matrix2[i][j]=array2[count];
count++;
}
}
int sum = 0, c, d, k;
for (c = 0; c < h; c++) {
for (d = 0; d < h; d++) {
for (k = 0; k < w; k++)
sum = sum + matrix1[c][k] * matrix2[k][d];
matrix3[c][d] = sum;
sum = 0;
}
}
/* Comment snippet 1
for(int i = 0; i<h; i++) {
for(int j = 0; j<h; j++)
System.out.print(" "+matrix3[i][j]);
System.out.println();
}
*/
}
void convertMatrixToImage() {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
try {
for(int i=0; i<h; i++) {
for(int j=0; j<h; j++) {
int a = matrix3[i][j];
Color newColor = new Color(a,a,a);
image.setRGB(j,i,newColor.getRGB());
}
}
ImageIO.write(image, "jpg", new File("Output.jpg"));
}
catch(Exception e) {}
System.out.println(image.toString());
System.out.println("\nThe output image has been generated!");
}
public static void main(String [] args) throws IOException {
ImageMultiplication i = new ImageMultiplication();
i.readImages();
i.convertToMatrix();
i.convertMatrixToImage();
}
}
文件执行没有问题。
See
问题是,但是,目录中没有创建或写入图像文件 (void convertMatrixToImage()
)。如果我取消注释 (comment snippet 1
),我会在控制台 window 上得到一个 2D 矩阵作为输出,其中每个索引显示一个数值,我假设它是像素化的 RGB 值。但是没有任何图像文件被创建的迹象。有人可以帮帮我吗?
注意:我试过将数组转换为字节数组,然后写入图像文件,我也尝试过其他方法,但似乎没有任何效果。我什至在 Windows 上试过了,但它也有同样的问题。 Output.jpg 无处是 created/written。
当我 运行 你修改代码打印 Exception
时,我得到...
java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
at java.awt.Color.testColorValueRange(Color.java:310)
at java.awt.Color.<init>(Color.java:395)
at java.awt.Color.<init>(Color.java:369)
at javaapplication194.ImageMultiplication.convertMatrixToImage(JavaApplication194.java:102)
at javaapplication194.ImageMultiplication.main(JavaApplication194.java:118)
老实说,我不知道这个 "really" 是什么意思,但我知道它与 "color"
有关
所以我回顾了一下对话代码...
try {
for (int i = 0; i < h; i++) {
for (int j = 0; j < h; j++) {
int a = matrix3[i][j];
Color newColor = new Color(a, a, a);
image.setRGB(j, i, newColor.getRGB());
}
}
ImageIO.write(image, "jpg", new File("Output.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
并注意到...
int a = matrix3[i][j];
Color newColor = new Color(a, a, a);
image.setRGB(j, i, newColor.getRGB());
出于多种原因,这对我来说似乎很奇怪...
- 您使用
getRGB
将颜色作为打包的 int
值
- 你试着用这个包装好的
int
做出新的颜色
- 您使用
getRGB
到 return 一个基于压缩 int
的颜色的压缩 int
所有这些似乎都是错误的和不必要的,你已经有了一个打包的 int
RGB 值,为什么不直接使用
int a = matrix3[i][j];
//Color newColor = new Color(a, a, a);
image.setRGB(j, i, a);
添加这个,错误消失并创建图像
我接到了一项任务,我必须从辅助内存中读取两张图像,并且必须将它们存储在两个单独的矩阵中。然后我必须将这些矩阵相乘并将结果矩阵转换回图像并将其存储在 HDD 中。这是代码:
package ISI;
import java.io.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import javax.imageio.ImageIO;
import javax.swing.*;
class ImageMultiplication {
BufferedImage img1, img2;
File f1, f2;
int matrix1[][], matrix2[][], matrix3[][];
int w,h;
ImageMultiplication() {
img1 = img2 = null;
f1 = f2 = null;
w = 500;
h = 400;
}
void readImages() throws IOException {
f1 = new File("image1.jpg");
f2 = new File("image2.jpg");
img1 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
img1 = ImageIO.read(f1);
img2 = ImageIO.read(f2);
System.out.println("\nReading of images complete");
}
void convertToMatrix() {
int [] array1 = new int[w*h];
matrix1 = new int[h][w];
int [] array2 = new int[w*h];
matrix2 = new int[w][h];
matrix3 = new int[h][h];
try {
img1.getRGB(0, 0, w, h, array1, 0, w);
img2.getRGB(0, 0, w, h, array2, 0, w);
}
catch(Exception e) {
System.out.println("\nInterrupted");
}
int count=0;
for(int i=0;i<h;i++) {
for(int j=0;j<w;j++) {
if(count == array1.length)
break;
matrix1[i][j] = array1[count];
count++;
}
}
count=0;
for(int i=0;i<w;i++) {
for(int j=0;j<h;j++) {
if(count == array2.length)
break;
matrix2[i][j]=array2[count];
count++;
}
}
int sum = 0, c, d, k;
for (c = 0; c < h; c++) {
for (d = 0; d < h; d++) {
for (k = 0; k < w; k++)
sum = sum + matrix1[c][k] * matrix2[k][d];
matrix3[c][d] = sum;
sum = 0;
}
}
/* Comment snippet 1
for(int i = 0; i<h; i++) {
for(int j = 0; j<h; j++)
System.out.print(" "+matrix3[i][j]);
System.out.println();
}
*/
}
void convertMatrixToImage() {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
try {
for(int i=0; i<h; i++) {
for(int j=0; j<h; j++) {
int a = matrix3[i][j];
Color newColor = new Color(a,a,a);
image.setRGB(j,i,newColor.getRGB());
}
}
ImageIO.write(image, "jpg", new File("Output.jpg"));
}
catch(Exception e) {}
System.out.println(image.toString());
System.out.println("\nThe output image has been generated!");
}
public static void main(String [] args) throws IOException {
ImageMultiplication i = new ImageMultiplication();
i.readImages();
i.convertToMatrix();
i.convertMatrixToImage();
}
}
文件执行没有问题。
See
问题是,但是,目录中没有创建或写入图像文件 (void convertMatrixToImage()
)。如果我取消注释 (comment snippet 1
),我会在控制台 window 上得到一个 2D 矩阵作为输出,其中每个索引显示一个数值,我假设它是像素化的 RGB 值。但是没有任何图像文件被创建的迹象。有人可以帮帮我吗?
注意:我试过将数组转换为字节数组,然后写入图像文件,我也尝试过其他方法,但似乎没有任何效果。我什至在 Windows 上试过了,但它也有同样的问题。 Output.jpg 无处是 created/written。
当我 运行 你修改代码打印 Exception
时,我得到...
java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
at java.awt.Color.testColorValueRange(Color.java:310)
at java.awt.Color.<init>(Color.java:395)
at java.awt.Color.<init>(Color.java:369)
at javaapplication194.ImageMultiplication.convertMatrixToImage(JavaApplication194.java:102)
at javaapplication194.ImageMultiplication.main(JavaApplication194.java:118)
老实说,我不知道这个 "really" 是什么意思,但我知道它与 "color"
有关所以我回顾了一下对话代码...
try {
for (int i = 0; i < h; i++) {
for (int j = 0; j < h; j++) {
int a = matrix3[i][j];
Color newColor = new Color(a, a, a);
image.setRGB(j, i, newColor.getRGB());
}
}
ImageIO.write(image, "jpg", new File("Output.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
并注意到...
int a = matrix3[i][j];
Color newColor = new Color(a, a, a);
image.setRGB(j, i, newColor.getRGB());
出于多种原因,这对我来说似乎很奇怪...
- 您使用
getRGB
将颜色作为打包的int
值 - 你试着用这个包装好的
int
做出新的颜色
- 您使用
getRGB
到 return 一个基于压缩int
的颜色的压缩
int
所有这些似乎都是错误的和不必要的,你已经有了一个打包的 int
RGB 值,为什么不直接使用
int a = matrix3[i][j];
//Color newColor = new Color(a, a, a);
image.setRGB(j, i, a);
添加这个,错误消失并创建图像