⚙️

[Rust] Noxのスクリーンショットを保存する

2023/02/09に公開

環境

  • Windows 10
  • cargo 1.67.0
  • rustc 1.67.0
  • Nox 7.0.3.8000-7.1.2700221010

概要

タイトルの通りですが、Noxで表示されている画面をPNG形式で出力します。

コード

use std::fs;
use std::io::{BufWriter, Write};
use std::process::Command;

fn main() {
    if cfg!(target_os = "windows") {
        let output = Command::new("cmd")
            .current_dir("C:\\Program Files\\Nox\\bin") // FIXME Noxのbinファイルパス
            .args(&["/C", "nox_adb exec-out screencap -p"])
            .output()
            .expect("failed");
        let mut buf = BufWriter::new(fs::File::create("output.png").unwrap());
        buf.write_all(&output.stdout).unwrap();
    }
}

つまづいた点

nox_adb shell screencap -p だとファイルが破損する

不要なCRLF変換が行われるためです。
Pythonで同じようなことをやる場合に以下のようにしてました。

pipe = Popen("nox_adb shell screencap -p",
             cwd="C:/Program Files/Nox/bin",
             stdout=PIPE,
             shell=True)
buf = np.frombuffer(pipe.stdout.read().replace(b'\r\n', b'\n'), np.uint8)
return cv2.imdecode(buf, cv2.IMREAD_COLOR)

exec-outを使用することで無駄な変換処理が不要になりました。(Pythonの方も直しますw)

Next Challenge

今回はファイル出力をしましたが、OpenCVなどに読み込ませる場合、
一度ファイルに出力するという処理を挟まないでも、バイナリをそのまま利用して処理ができると思うので挑戦していきます。

Discussion