【问题标题】:Extracting Bitmap Data to an array of byte将位图数据提取到字节数组
【发布时间】:2016-09-05 13:46:47
【问题描述】:

假设我有一个字节数组,其中包含没有标题的原始位图数据。
但是位图数据有点奇怪,我不太确定,但如果宽度为 NPOT(不是 2 的幂),位图数据似乎没有正确对齐

我使用以下代码从此类位图数据构造 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;
}

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

我该怎么做?

【问题讨论】:

    标签: c# image image-processing bitmap


    【解决方案1】:

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

    我决定先通过Marshal.Copy 将数据复制到一个字节数组中,然后将其复制到另一个字节数组中,如果宽度为 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 2012-07-28
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多