如何以编程方式从颜色数组创建 24bpp 位图?

发布于 2024-09-06 00:59:14 字数 1076 浏览 2 评论 0原文

我正在尝试以编程方式从包含颜色数据的数组创建位图。使用下面的代码,当在图片框中显示时,我会并排获得 3 个重复的扭曲图像。有人能告诉我哪里出了问题吗?

    public Bitmap CreateBM(int[,] imgdat)
    {
        Bitmap bitm = new Bitmap(imgdat.GetUpperBound(1) + 1, imgdat.GetUpperBound(0) + 1, PixelFormat.Format24bppRgb);
        BitmapData bitmapdat = bitm.LockBits(new Rectangle(0, 0, bitm.Width, bitm.Height), ImageLockMode.ReadWrite, bitm.PixelFormat);
        int stride = bitmapdat.Stride;

        byte[] bytes = new byte[stride * bitm.Height];
        for (int r = 0; r < bitm.Height; r++)
        {
            for (int c = 0; c < bitm.Width; c++)
            {
                Color color = Color.FromArgb(imgdat[r, c]);
                bytes[(r * bitm.Width) + c * 3] = color.B;
                bytes[(r * bitm.Width) + c * 3 + 1] = color.G;
                bytes[(r * bitm.Width) + c * 3 + 2] = color.R;
            }
        }


        System.IntPtr scan0 = bitmapdat.Scan0;
        Marshal.Copy(bytes, 0, scan0, stride * bitm.Height);
        bitm.UnlockBits(bitmapdat);

        return bitm;
    }
}

I am trying to programatically create a bitmap from an array that contains color data. With the code below, I get 3 duplicate distorted images side by side when displayed in a picturebox. Can somebody tell me where it's going wrong?

    public Bitmap CreateBM(int[,] imgdat)
    {
        Bitmap bitm = new Bitmap(imgdat.GetUpperBound(1) + 1, imgdat.GetUpperBound(0) + 1, PixelFormat.Format24bppRgb);
        BitmapData bitmapdat = bitm.LockBits(new Rectangle(0, 0, bitm.Width, bitm.Height), ImageLockMode.ReadWrite, bitm.PixelFormat);
        int stride = bitmapdat.Stride;

        byte[] bytes = new byte[stride * bitm.Height];
        for (int r = 0; r < bitm.Height; r++)
        {
            for (int c = 0; c < bitm.Width; c++)
            {
                Color color = Color.FromArgb(imgdat[r, c]);
                bytes[(r * bitm.Width) + c * 3] = color.B;
                bytes[(r * bitm.Width) + c * 3 + 1] = color.G;
                bytes[(r * bitm.Width) + c * 3 + 2] = color.R;
            }
        }


        System.IntPtr scan0 = bitmapdat.Scan0;
        Marshal.Copy(bytes, 0, scan0, stride * bitm.Height);
        bitm.UnlockBits(bitmapdat);

        return bitm;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蹲墙角沉默 2024-09-13 00:59:14

您希望每行将索引增加 stride,而不是仅仅增加 bitm.Width

bytes[(r * stride) + c * 3] = color.B;
bytes[(r * stride) + c * 3 + 1] = color.G;
bytes[(r * stride) + c * 3 + 2] = color.R;

You want to increase the index by stride every row instead of just by bitm.Width.

bytes[(r * stride) + c * 3] = color.B;
bytes[(r * stride) + c * 3 + 1] = color.G;
bytes[(r * stride) + c * 3 + 2] = color.R;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文