使用Java从文件中读取图像,并将其保存到其他文件中

时间:2018-03-18 09:13:49

标签: java javax.imageio

我正在尝试执行上述操作,但每次都会出现以下错误java.io.FileNotFoundException: file:\C:\Users\User\Desktop\Scrap\main\out\production\resources\ProfilePic\xas.png (The filename, directory name, or volume label syntax is incorrect)

以下是我用来做这个的功能

  private URL url = this.getClass().getResource("/ProfilePic");
  public final String PICTURE_DIRECTORY  = url.toString();


 public String createNewPicture (String path, String newPictureName) {
    int width = 12;
    int height = 12;
    BufferedImage bf = null;
    File f = null;
    String dst = PICTURE_DIRECTORY +"/"+newPictureName+".png";
    try{
        f = new File("F://a.jpg");
        bf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        bf = ImageIO.read(f);
        System.out.println("read file successfully");


    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    try {
        dst = PICTURE_DIRECTORY +"/"+newPictureName+".png";
        new File (PICTURE_DIRECTORY, newPictureName+".png");
        f = new File(dst);
       ImageIO.write(bf, "png", f);
        //System.out.println("asaas " +dst);
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
    }

    return dst;
}

有人可以帮帮我吗?花了几个小时试图解决这个问题,但卡住了。谢谢!

1 个答案:

答案 0 :(得分:0)

您需要的信息可在错误消息中找到:

java.io.FileNotFoundException: file:\C:\Users\User\Desktop\Scrap\main\out\production\resources\ProfilePic\xas.png (The filename, directory name, or volume label syntax is incorrect)

您的代码中存在问题:

private URL url = this.getClass().getResource("/ProfilePic");
public final String PICTURE_DIRECTORY  = url.toString();

在您的案例中,网址包含协议"file"。网址类' toString()只返回完整的网址,包括协议。 您现在拥有包含PICTURE_DIRECTORY的变量"file:/C:/..."。这不是任何Windows操作系统上的有效路径。

如果你真的想写一个资源(不推荐),你可以这样做:

public final String PICTURE_DIRECTORY  = toFile(url).getAbsolutePath(); 

static private File toFile(final URL url) {
    try {
        return new File(url.toURI());
    }
    catch (URISyntaxException e) {
        throw new IllegalArgumentException(e);
    }
}

但请注意,Class..getResource(..)返回的资源并不总是文件。它也可以是JAR中的一个条目(您无法写入,与写入文件的方式相同)。

更好的方法可能是使用相对于用户主目录或其他已配置目录的目录。

最后,正如我在评论中提到的,使用ImageIO复制(图像)文件通常是错误的解决方案。相反,请使用Files.copy(...),如Copying a File or Directory教程。