c# – 生成16位灰度BitmapData并保存到文件

c# – 生成16位灰度BitmapData并保存到文件,第1张

概述我试图从随机数据中生成C#中的16位灰度位图.但是它在Marshal.Copy上崩溃了. 这是我的代码: Bitmap b16bpp; private void GenerateDummy16bitImage() { b16bpp = new Bitmap(IMAGE_WIDTH, IMAGE_HEIGHT, System.Drawing.Imaging.Pixe 我试图从随机数据中生成C#中的16位灰度位图.但是它在Marshal.copy上崩溃了.

这是我的代码:

Bitmap b16bpp;    private voID GenerateDummy16bitimage()    {        b16bpp = new Bitmap(IMAGE_WIDTH,IMAGE_HEIGHT,System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);        var rect = new Rectangle(0,IMAGE_WIDTH,IMAGE_HEIGHT);        var bitmapData = b16bpp.LockBits(rect,ImageLockMode.writeonly,b16bpp.PixelFormat);        // Calculate the number of bytes required and allocate them.        var numberOfBytes = bitmapData.StrIDe * IMAGE_HEIGHT * 2;        var bitmapBytes = new short[numberOfBytes];        // Fill the bitmap bytes with random data.        var random = new Random();        for (int x = 0; x < IMAGE_WIDTH; x++)        {            for (int y = 0; y < IMAGE_HEIGHT; y++)            {                var i = ((y * IMAGE_WIDTH) + x) * 2; // 16bpp                // Generate the next random pixel color value.                var value = (short)random.Next(5);                bitmapBytes[i] = value;         // BLUE                bitmapBytes[i + 1] = value;     // GREEN                bitmapBytes[i + 2] = value;     // RED              //  bitmapBytes[i + 3] = 0xFF;      // Alpha            }        }        // copy the randomized bits to the bitmap pointer.        var ptr = bitmapData.Scan0;        Marshal.copy(bitmapBytes,ptr,numberOfBytes);//crashes here        // Unlock the bitmap,we're all done.        b16bpp.UnlockBits(bitmapData);        b16bpp.Save("random.bmp",ImageFormat.Bmp);        DeBUG.Writeline("saved");    }

例外是:

mscorlib.dll中发生了未处理的“System.AccessViolationException”类型异常

这不是我的代码.我发现它与32位Bitmaps和修改有关.但我想我错过了一些东西,因为我对C#很新.

基本上,我只需要在BitmapData中包含一个short数组.

@R_404_6120@ 我纠正了你的一些错误(大多是错误的大小).但它仍会在b16bpp.Save()上崩溃,因为 GDI+ does not support saving 16bit grayscale images.

Bitmap b16bpp;private voID GenerateDummy16bitimage(){    b16bpp = new Bitmap(IMAGE_WIDTH,System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);    var rect = new Rectangle(0,IMAGE_HEIGHT);    var bitmapData = b16bpp.LockBits(rect,b16bpp.PixelFormat);    // Calculate the number of bytes required and allocate them.    var numberOfBytes = bitmapData.StrIDe * IMAGE_HEIGHT;    var bitmapBytes = new short[IMAGE_WIDTH * IMAGE_HEIGHT];    // Fill the bitmap bytes with random data.    var random = new Random();    for (int x = 0; x < IMAGE_WIDTH; x++)    {        for (int y = 0; y < IMAGE_HEIGHT; y++)        {            var i = ((y * IMAGE_WIDTH) + x); // 16bpp            // Generate the next random pixel color value.            var value = (short)random.Next(5);            bitmapBytes[i] = value;         // GRAY        }    }    // copy the randomized bits to the bitmap pointer.    var ptr = bitmapData.Scan0;    Marshal.copy(bitmapBytes,bitmapBytes.Length);    // Unlock the bitmap,we're all done.    b16bpp.UnlockBits(bitmapData);    b16bpp.Save("random.bmp",ImageFormat.Bmp);    DeBUG.Writeline("saved");}

我的更改说明:

> bitmapData.StrIDe已经是IMAGE_WIDTH * BytesPerPixel所以你不需要乘以2
>当你将bitmapBytes声明为short []时,它必须具有图像的大小(以像素为单位)
>这意味着你也不需要将i乘以2
>因为你有一个灰度图像,它没有蓝色,绿色和红色通道,而是一个16位灰色通道
> Marshal.copy以“数组单位”取长度,而不是以字节为单位

总而言之,您尝试将数组8次复制到位图中.

总结

以上是内存溢出为你收集整理的c# – 生成16位灰度BitmapData并保存到文件全部内容,希望文章能够帮你解决c# – 生成16位灰度BitmapData并保存到文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存