gpt4 book ai didi

c# - 从原始字节创建位图对象

转载 作者:行者123 更新时间:2023-11-30 15:01:32 24 4
gpt4 key购买 nike

我正在尝试从原始字节创建位图对象,我的 PixelFormatRGB 每个样本 8 位,即每个像素 3 个字节。现在为此,我的步幅将是宽度的 3 倍。

但是 Bitmap 类总是在寻找步长值的 4 倍数。请帮我解决这个问题。如果我给出 4 的乘数,图像就无法正常显示。

Bitmap im = new Bitmap(MyOBJ.PixelData.Columns, MyOBJ.PixelData.Rows, (MyOBJ.PixelData.Columns*3),
System.Drawing.Imaging.PixelFormat.Format24bppRgb, Marshal.UnsafeAddrOfPinnedArrayElement(images[imageIndex], 0));

最佳答案

我写了一个简短的示例,它将填充数组的每一行以使其适应所需的格式。它将创建一个 2x2 棋盘位图。

byte[] bytes =
{
255, 255, 255,
0, 0, 0,
0, 0, 0,
255, 255, 255,
};
var columns = 2;
var rows = 2;
var stride = columns*4;
var newbytes = PadLines(bytes, rows, columns);
var im = new Bitmap(columns, rows, stride,
PixelFormat.Format24bppRgb,
Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0));

PadLines 方法写在下面。我尝试通过使用 Buffer.BlockCopy 来优化它,以防您的位图很大。

static byte[] PadLines(byte[] bytes, int rows, int columns)
{
//The old and new offsets could be passed through parameters,
//but I hardcoded them here as a sample.
var currentStride = columns*3;
var newStride = columns*4;
var newBytes = new byte[newStride*rows];
for (var i = 0; i < rows; i++)
Buffer.BlockCopy(bytes, currentStride*i, newBytes, newStride * i, currentStride);
return newBytes;
}

关于c# - 从原始字节创建位图对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com