我想使用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图像中,则实际上是首选,因为我稍后将对其进行一些简历。
答案 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
在输出重定向中丢失或修改了某些图像数据,并且您无法从输出字符串中恢复原始数据。