无法在 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_RGB
或 TYPE_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);
}
我需要做的是我有一个输入图像文件,我需要将其更改为用户参数。例如,如果用户想让它变暗 %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_RGB
或 TYPE_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);
}