通过C#从adb加载屏幕截图

时间:2018-11-06 05:47:22

标签: c# adb emgucv

我想使用adb将截图截取到c#中,而不一直将文件保存到文件系统中。 我正在使用SharpAdbClient与设备交谈。 我在Windows平台上。

这是我到目前为止所得到的:

AdbServer server = new AdbServer();
StartServerResult result = server.StartServer(@"path\to\adb.exe", restartServerIfNewer: false);
DeviceData device = AdbClient.Instance.GetDevices().First();
ConsoleOutputReceiver receiver = new ConsoleOutputReceiver();
AdbClient.Instance.ExecuteRemoteCommand("screencap -p", device, receiver);
string str_image = receiver.ToString().Replace("\r\r", "");
byte[] bytes = Encoding.ASCII.GetBytes(str_image);
Image image = Image.FromStream(new MemoryStream(bytes));

我可以成功加载两个str_image并创建字节数组,但是在尝试将其加载到Image时始终显示System.ArgumentException。

我也尝试将数据保存到文件中,但是文件已损坏。 我尝试将“ \ r \ r”和“ \ r \ n”都替换为相同的结果。

任何人都对如何加载此文件有一些见识? 如果可以将其加载到Emgu图像中,则实际上是首选,因为我稍后将对其进行一些简历。

1 个答案:

答案 0 :(得分:0)

一个可能的原因是字符串中的nonprintable ASCII characters

看下面的代码

string str_image = File.ReadAllText("test.png");
byte[] bytes = Encoding.ASCII.GetBytes(str_image);

byte[] actualBytes = File.ReadAllBytes("test.png"); 

str_image显示在以下屏幕截图中,请注意,有一些不可打印的字符(显示为问号)。

first eight bytes of a PNG file始终

  

137 80 78 71 13 10 26 10

当您以字符串形式读取控制台输出,然后使用ASCII对该字符串进行编码时,第一个字节变为63(0x3F),这是问号的ASCII代码。

还要注意,两个字节数组的大小差异很大(7828/7378)。

另一件事是您要替换“ \ r \ r”,而实际上Windows中的换行符是“ \ r \ n”。

因此,我的结论是,ConsoleOutputReceiver在输出重定向中丢失或修改了某些图像数据,并且您无法从输出字符串中恢复原始数据。

enter image description here