JavaFX ImageIO.write() 不保存修改后的 BufferedImage
JavaFX ImageIO.write() doesn't save modified BufferedImage
我正在尝试创建一个允许用户修改图片然后保存的应用程序。我在保存部分遇到了问题。
这是旋转图片的方法:
public void process(ImageView imageView) {
if(imageView.getImage() != null){
BufferedImage img;
img = Home.img;
double rads = Math.toRadians(90);
double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
int w = img.getWidth();
int h = img.getHeight();
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
int x = w / 2;
int y = h / 2;
at.rotate(rads, x, y);
g2d.setTransform(at);
g2d.drawImage(img, 0, 0,null);
g2d.dispose();
imageView.setImage(convertToFxImage(rotated));
Home.img = rotated;
}
}
它在 Home
控制器 class 的 imageView 中设置图像,并为修改后的图像设置一个静态字段。然后我尝试将其保存在 Home
class:
中
savAs.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
File dir = fileChooser.showSaveDialog(opButton.getScene().getWindow());
if (dir != null) {
try {
ImageIO.write(img, dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3), dir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
出于某种原因,这不起作用。没有 IOException
被抛出,但它不创建任何文件。当我尝试在不修改图像的情况下保存时,它起作用了。知道为什么吗?
您调用的 ImageIO
中的方法在下面指定,它 returns 您忽略的布尔状态代码:
public static boolean write(RenderedImage im,
String formatName,
File output) throws IOException
您没有包含文件的详细信息,因此无法判断您是否传入了有效的 formatName
,它是从输出文件名的最后三个字符派生的。请注意,formatName
并不总是 3 个字符,应该是小写 - 因此“FILE.JPG”和“FILE.JPEG”都可能无法保存。
如果您认为文件扩展名正确并且受您使用的 BufferedImage.TYPE_INT_ARGB
格式支持,请尝试更改为使用小写格式,然后检查结果:
String format = dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3).toLowerCase();
boolean ok = ImageIO.write(img, format, dir);
if (!ok)
throw new RuntimeException("Failed to write "+format+" to " + dir.getAbsolutePath());
如果 BufferedImage
格式与文件扩展名不兼容,请尝试使用 new BufferedImage(... , BufferedImage.TYPE_INT_RGB)
或其他格式类型(例如 PNG)。
我正在尝试创建一个允许用户修改图片然后保存的应用程序。我在保存部分遇到了问题。
这是旋转图片的方法:
public void process(ImageView imageView) {
if(imageView.getImage() != null){
BufferedImage img;
img = Home.img;
double rads = Math.toRadians(90);
double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
int w = img.getWidth();
int h = img.getHeight();
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
int x = w / 2;
int y = h / 2;
at.rotate(rads, x, y);
g2d.setTransform(at);
g2d.drawImage(img, 0, 0,null);
g2d.dispose();
imageView.setImage(convertToFxImage(rotated));
Home.img = rotated;
}
}
它在 Home
控制器 class 的 imageView 中设置图像,并为修改后的图像设置一个静态字段。然后我尝试将其保存在 Home
class:
savAs.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
File dir = fileChooser.showSaveDialog(opButton.getScene().getWindow());
if (dir != null) {
try {
ImageIO.write(img, dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3), dir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
出于某种原因,这不起作用。没有 IOException
被抛出,但它不创建任何文件。当我尝试在不修改图像的情况下保存时,它起作用了。知道为什么吗?
您调用的 ImageIO
中的方法在下面指定,它 returns 您忽略的布尔状态代码:
public static boolean write(RenderedImage im,
String formatName,
File output) throws IOException
您没有包含文件的详细信息,因此无法判断您是否传入了有效的 formatName
,它是从输出文件名的最后三个字符派生的。请注意,formatName
并不总是 3 个字符,应该是小写 - 因此“FILE.JPG”和“FILE.JPEG”都可能无法保存。
如果您认为文件扩展名正确并且受您使用的 BufferedImage.TYPE_INT_ARGB
格式支持,请尝试更改为使用小写格式,然后检查结果:
String format = dir.getAbsolutePath().substring(dir.getAbsolutePath().length() - 3).toLowerCase();
boolean ok = ImageIO.write(img, format, dir);
if (!ok)
throw new RuntimeException("Failed to write "+format+" to " + dir.getAbsolutePath());
如果 BufferedImage
格式与文件扩展名不兼容,请尝试使用 new BufferedImage(... , BufferedImage.TYPE_INT_RGB)
或其他格式类型(例如 PNG)。