我正在使用ADB截取Android设备的屏幕截图,并将屏幕截图作为原始字节数据接收 .
我知道通过的原始字节数据格式为rgba
红色偏移0,绿色偏移8,蓝色偏移16,阿尔法偏移24,每个值为1个字节 . 这构成了整个字节数组 .
我试图将这个字节数组转换为C#中的Bitmap,并且它在大多数情况下工作,图像在各方面看起来都是正确的,除了它是通过'蓝色色调'来实现 - 着色关闭 .
以下是我用来转换原始字节数据的代码:
int WriteBitmapFile(string filename, int width, int height, byte[] imageData)
{
using (var stream = new MemoryStream(imageData))
using (var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
bmp.Width,
bmp.Height),
ImageLockMode.WriteOnly,
bmp.PixelFormat);
IntPtr pNative = bmpData.Scan0;
Marshal.Copy(imageData, 0, pNative, imageData.Length);
bmp.UnlockBits(bmpData);
bmp.Save(filename);
}
return 1;
}
我在this post中读到它可能与实际rgba值的字节顺序有关 . 正如你在上面的代码中看到的那样,我尝试将我的bmpData.Scan0转换为int *,它仍然以蓝色色调进行 .
对于我现在能做的事情来说,我正在用自己的大脑来解决这个问题 . 我假设它的红色为蓝色,蓝色为红色,反之亦然 .
我以为我可以操作原始字节数据,以便在将其转换为位图时以正确的字节顺序,但是我不知道我怎么能这样做 .
有什么建议?
2 回答
所以,最后我的解决方案很简单 .
我所要做的就是循环遍历imageData并调整构成像素的字节并重新排序它们,以便它们适合作为BGRA的Windows位图的预期格式 .
显然,我仍然可以在for循环中进行一些小的优化来改变字节,但是它正在工作 .
你有没看过post?你're stating that every ' value'是8个字节,所以1个像素是4x8 = 32个字节?但是你使用32bpp图像格式,因此每像素32位 - > 1像素= 4字节 .
如果你从另一个处理器/网络/获取图像,也要注意小/大端/ ...