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

将位图数据提取到字节数组

羊慈
2023-03-14

比方说,我有一个字节数组,包含没有标题的原始位图数据。
但是位图数据有点奇怪,我不太确定,但是如果宽度是NPOT(不是二次方),位图数据似乎没有正确对齐

我使用以下代码从此类位图数据构造bmp:

public Bitmap GetBitmap(byte[] bitmapData, int width, int height)
{
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format16bppRgb555);
    Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
    BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
    unsafe
    {
        byte* ptr = (byte*)bmpData.Scan0;
        for (int i = 0; i < bitmapData.Length; i++)
        {
            *ptr = bitmapData[i];
            ptr++;

            if (width % 2 != 0)
            {
                if ((i + 1) % (width * 2) == 0 && (i + 1) * 2 % width < width - 1)
                {
                    ptr += 2;
                }
            }
        }
    }

    bitmap.UnlockBits(bmpData);
    return bitmap;
}

到目前为止,代码运行良好。但由于某些原因,我需要实现“导入位图”,这意味着我需要从位图实例中获取“奇怪”的位图数据。

我该怎么做?

共有1个答案

穆俊哲
2023-03-14

最后,我想出了如何做到这一点。

我决定首先通过Marshal将数据复制到字节数组中。复制,然后将其复制到另一个字节数组,如果宽度为NPOT,则跳过某个点:

public byte[] ImportBitmap(Bitmap bitmap)
{
    int width  = bitmap.Width, height = bitmap.Height;

    var bmpArea = new Rectangle(0, 0, width, height);
    var bmpData = bitmap.LockBits(bmpArea, ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb555);
    var data = new byte[bmpData.Stride * Height];

    Marshal.Copy(bmpData.Scan0, data, 0, data.Length);
    bitmap.UnlockBits(bmpData);
    bitmap.Dispose(); // bitmap is no longer required

    var destination = new List<byte>();
    int leapPoint = width * 2;
    for (int i = 0; i < data.Length; i++)
    {
        if (width % 2 != 0)
        {
            // Skip at some point
            if (i == leapPoint)
            {
                // Skip 2 bytes since it's 16 bit pixel
                i += 1;
                leapPoint += (width * 2) + 2;
                continue;
            }
        }

        destination.Add(data[i]);
    }

    return destination.ToArray();
}
 类似资料:
  • 我正在使用ADB拍摄android设备的屏幕截图,并将屏幕截图作为原始字节数据接收。 我知道通过的原始字节数据是rgba格式的 红色偏移量为0,绿色偏移量为8,蓝色偏移量为16,Alpha偏移量为24,每个值为1字节。这构成了整个字节数组。 我正在尝试将这个字节数组转换为C#中的位图,它在大多数情况下都工作正常,图像在各个方面看起来都是正确的,除了它带有一个“蓝色色调”——颜色是关闭的。 以下是我

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

  • 问题内容: 我有以下字节片,我需要从中提取位并将它们放置在[] int中,因为我打算稍后再获取各个位值。我很难弄清楚该怎么做。 下面是我的代码 我需要的是一点点-> 我试过了 我尝试使用BigEndian将字节片转换为Uint16,然后尝试使用,但由于错误而失败 看到了很多示例,这些示例使用函数来简单地输出数字的位表示形式,但这对我没有用,因为我需要一个int切片来进一步访问位值。 我需要在这里使

  • 我有一段代码,可以使用ImageIO将字节数组转换为BuffereImage。 但我发现,对于某些jpeg图像,每次都会抛出CMM异常。 这是堆栈跟踪: 我在Google上搜索了一个解决方案,发现了一个帖子承认了这个问题,并建议在ImageIO失败的情况下使用JAI。但我有疑问,因为这篇帖子是4年前的,我似乎找不到太多关于JAI的信息,这让我相信这不是理想的解决方案。有没有其他方法可以在没有Ima

  • 问题内容: 通过这种方式获得字节数组- 现在我如何从字节数组重建此灰度图像? 我对ARGB,RGB或灰度图像了解不多。我试过了- 当我绘制此图像时,它不是黑白的,而是橙色和灰色的东西。 问题答案: 如果我向您解释如何从ARGB / RGB 2灰度转换,希望对您有所帮助,因为它有太多未知的函数和类:P ARGB为32位/像素,因此每个通道为8位。Alpha通道是不透明度,因此与透明度相反,因此0是透

  • 问题内容: 我想将多维字节数组保存到SQL Server数据库。 我知道如何保存一个字节数组,这是图像到数据库的转换。为此,我使用的数据类型是。但是现在我想存储另一个字节数组,它是多维字节数组,它具有带有x,y值的二维。 我在互联网上搜索过,在这里,据说是使用格式。我只想知道是否将多维数组保存在数据类型数据列中,这些值会被更改吗?是否可以再次将数据接收为多维数组? 问题答案: 是的,您将能够不更改