2017-01-05 3 views
0

В моей команде терминала adb shell screencap -p | sed 's/\r$//' > screen.png это работа, за исключением моего экрана андроида.Как использовать stdout сохранить изображение в Rust?

Я знаю, может использовать adb pull, но я хочу знать, как использовать stdout путь сохранить изображение в Rust? Итак, я пробую этот код, купить не могу открыть изображение. Там может быть проблемой при кодировании, но я не знаю, как исправить их

let output = Command::new("adb") 
      .arg("shell") 
      .arg("screencap -p") 
      .output() 
      .expect("failed to execute process"); 

    let byte_string = String::from_utf8_lossy(&output.stdout).replace("\r\n","\n"); 


    let byte_string = String::from_utf8_lossy(&output.stdout); 
    let mut buffer = try!(File::create("foo.png")); 

    try!(buffer.write(&byte_string.as_bytes())); 
+0

Пожалуйста, отредактируйте ваш вопрос, чтобы * включить ошибку *, которую вы получаете. – Shepmaster

ответ

1

данные изображения является двоичным, а не строка Unicode. Поэтому вам нужно распечатать &[u8], а не UTF-8 String.

let out = std::io::stdout(); 
out.write_all(slice)?; 
out.flush()?; 

flush необходимо, поскольку write_all непосредственно следует при выходе из программы не может доставить байты в основной дескриптор файла.

Поскольку ржавчина не имеет строковой обработки для массивов u8, вам необходимо вручную отменить манипуляцию adb, итерации по байтам и проверки того, является ли текущий \ r, а следующий - \ n, а затем пропустить текущий.

+0

Как OP выполнит замену '\ r', которую они хотят сделать? – Shepmaster

+0

, который просто пропускает последний байт, кажется – the8472

Смежные вопросы