将图像转换为字节,然后写入新文件

时间:2014-12-09 23:37:08

标签: rust

我正在尝试将转换为字节向量的图像并将这些字节写入新文件。第一部分是工作,我的代码正在编译,但是创建的新文件最终为空(没有写入任何内容)。我错过了什么?

是否有更简洁的方式将Vec<u8>转换为&[u8]以便可以编写?我现在这样做的方式似乎有点荒谬......

use std::os;
use std::io::BufferedReader;
use std::io::File;
use std::io::BufferedWriter;

fn get_file_buffer(path_str: String) -> Vec<u8> {
    let path = Path::new(path_str.as_bytes());
    let file = File::open(&path);
    let mut reader = BufferedReader::new(file);
    match reader.read_to_end() {
        Ok(x) => x,
        Err(_) => vec![0],
    }
}

fn main() {
    let file = get_file_buffer(os::args()[1].clone());

    let mut new_file = File::create(&Path::new("foo.png")).unwrap();
    let mut writer = BufferedWriter::new(new_file);

    writer.write(String::from_utf8(file).unwrap().as_bytes()).unwrap();
    writer.flush().unwrap();
}

1 个答案:

答案 0 :(得分:4)

给定Vec<T>,您可以通过两种方式获得&[T]

  • 参考其解除引用,即&*file;这是有效的,因为Vec<T>实现了Deref<[T]>,因此*file实际上是[T]类型(尽管这样做而不借用它,即&*file,这是不合法的)。

  • 调用as_slice()方法。

正如BufWriter docs所说的那样,“删除写入时将写出缓冲区”,因此writer.flush().unwrap()并非严格必要,仅用于明确处理错误。

但至于你所描述的行为,我大部分都没有观察到。只要您没有遇到任何I / O错误,不使用String舞蹈的版本就可以正常工作,而如果输入数据不合法,那么String舞会会导致恐慌。 (如果你正在处理图像,它可能不会)。在这种情况下,String::from_utf8会返回None,因此会解除恐慌。