当前位置: 首页 > 知识库问答 >
问题:

将原始字节数据转换为位图

况博容
2023-03-14

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

我知道通过的原始html" target="_blank">字节数据是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;
    }

我在这篇文章中读到,这可能和实际rgba值的字节顺序有关。正如您在上面的代码中所看到的,我尝试转换我的bmpData。扫描0到int*并且它仍然带有蓝色色调。

我正在绞尽脑汁想我现在能做些什么来让这张图片有正确的颜色。我假设它的读数是红色为蓝色,蓝色为红色,反之亦然。

我想我可以操纵原始字节数据,以便在将其转换为位图时按正确的字节顺序排列,但我不确定如何才能做到这一点。

有什么建议吗?

共有2个答案

范稳
2023-03-14

你看过这篇文章了吗?你说每个“值”是8字节,那么1个像素是4x8=32字节?但您使用的是32bpp图像格式,因此每像素32位-

如果您从另一个处理器/网络/获取图像,请注意小/大端...

慕凌龙
2023-03-14

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

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循环中进行一些小的优化,以移动字节,但它正在工作。

 类似资料:
  • 我正在收听现场电话,并能够获得原始的PCM字节。我还可以通过java的音频api来收听这些字节。这些都在一个小程序上工作。 现在,我希望能够将电话呼叫的原始PCM字节转换为WAV字节,以便直接将其写入ServletOutputStream。这将允许浏览器实际监听电话。 有人知道我如何能够将一些原始PCM字节[]转换为WAV字节[]吗? 我看到的例子都与将一个文件转换为另一个文件有关。 java p

  • 我有一个文件包。crd。伊滕是这样的 我需要将其导入到以下格式的excel文件中。 我试过这个代码,但不起作用 请帮忙

  • 问题内容: 当我对字节的调用全部为0 后查看缓冲区时,从相机返回的位图是不可变的……但这无关紧要,因为它正在执行复制操作。 此代码可能有什么问题? 问题答案: 尝试这样:

  • 我在Java中有一个tiff图像的INT[2048][2048]原始数据数组。我想把那个数组转换回BufferedImage。我该如何进行?

  • 问题内容: 是否可以将字符串转换为字节数组,然后在Java或Android中将其转换回原始字符串? 我的目标是将一些字符串发送到微控制器(Arduino)并将其存储到EEPROM(仅1 KB)中。我尝试使用MD5哈希,但它似乎只是一种单向加密。我该怎么办? 问题答案: 我建议使用字符串的成员,但 使用显式编码 : 通过使用一种显式编码(以及一种支持所有Unicode的编码),您可以避免仅调用等问题

  • 问题内容: 我有一个必须解析的二进制文件,并且正在使用Python。有没有办法占用4个字节并将其转换为单个精度浮点数? 问题答案: