c# - 将 RAW 字节数据转换为位图

标签 c# android image-processing bitmap

我正在使用 ADB 截取 Android 设备的屏幕截图并将屏幕截图作为原始字节数据接收。

我知道通过的原始字节数据的格式是 rgba

红色偏移0,绿色偏移8,蓝色偏移16,Alpha偏移24,每个值都是1个字节。这构成了整个字节数组。

我正在尝试将此字节数组转换为 C# 中的位图,它在大多数情况下都可以正常工作,图像在各个方面看起来都是正确的,除了它带有“蓝色色调”——着色已关闭。

以下是我用来转换原始字节数据的代码:

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* 并且它仍然呈现蓝色色调。

我正在绞尽脑汁想知道我现在可以做些什么来让这张图片显示正确的颜色。我假设它将红色读为蓝色,将蓝色读为红色,反之亦然。

我认为我可以操纵原始字节数据,以便在将其转换为位图时它具有正确的字节顺序,但是我不确定我该怎么做。

有什么建议吗?

最佳答案

所以,最后我的解决方案很简单。

int WriteBitmapFile(string filename, int width, int height, byte[] imageData)
    {
        byte[] newData = new byte[imageData.Length];

        for(int x = 0; x < imageData.Length; x+= 4)
        {
            byte[] pixel = new byte[4];
            Array.Copy(imageData, x, pixel, 0, 4);

            byte r = pixel[0];
            byte g = pixel[1];
            byte b = pixel[2];
            byte a = pixel[3];

            byte[] newPixel = new byte[] { b, g, r, a };

            Array.Copy(newPixel, 0, newData, x, 4);
        }

        imageData = newData;

        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;
    }

我所要做的就是遍历 imageData 并调整构成像素的字节并重新排序它们,以便它们适合 Windows 位图的预期格式,即 BGRA。

显然,我仍然可以在移动字节的 for 循环中进行一些小的优化,但它正在工作。

关于c# - 将 RAW 字节数据转换为位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39910710/

相关文章:

android - 如何将新的 map 或行添加到sharedpreferences文件

java - 在文件夹中保存图像时出现问题

c# - 从存储库向 UI 报告进度的好方法是什么

c# - wb.DownloadFileAsync 抛出 "WebClient does not support concurrent I/O operations."异常

c# - Entity Framework 急切加载和延迟加载

java - 将我的 Android 应用程序导出到 iPhone?

android - 如何取消android中未显示的通知

image-processing - OPENCV怪异错误

c++ - 在不使用缓冲区的情况下对 2 个图像进行操作(加法、减法等)

c# - Microsoft.Jet.OLEDB.4.0 的替代方案,用于对 MDB 文件进行 64 位 Access