![](/img/trans.png)
[英]Unable to save BufferedImage from applet using ImageIO.write
[英]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
controller 類的 imageView 中設置圖像,並將 static 字段設置為修改后的圖像。 然后我嘗試將它保存在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
中的方法在下面指定,它返回您忽略的 boolean 狀態代碼:
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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.