C# 将int数组转换为位图

C# 将int数组转换为位图,c#,bitmap,C#,Bitmap,我正在尝试将整数数组转换为位图。我有一个范围为[0-4095]的整数数组,我想将它们显示在位图中,然后让用户在位图中选择一个区域,复制该区域,然后取回整数 我有用于剪切位图区域的代码,但我在生成值高达4095的位图以及从位图中获取值高达4095时遇到问题 public Bitmap InttoBitmap(int[] array) { unsafe { int[] pixels = new int[array.Length]; for (int i

我正在尝试将整数数组转换为位图。我有一个范围为[0-4095]的整数数组,我想将它们显示在位图中,然后让用户在位图中选择一个区域,复制该区域,然后取回整数

我有用于剪切位图区域的代码,但我在生成值高达4095的位图以及从位图中获取值高达4095时遇到问题

public Bitmap InttoBitmap(int[] array)
{
    unsafe
    {
        int[] pixels = new int[array.Length];
        for (int i = 0; i < keepWidth * keepHeight; i++)
        {
            pixels[i] = array[i] * 64;
        }
        IntPtr pixptr = Marshal.AllocHGlobal(keepWidth * keepHeight * 2);
        Marshal.Copy(pixels, 0, pixptr, keepWidth * keepHeight);
        Bitmap bitmap = new Bitmap(keepWidth, keepHeight, 2 * keepWidth, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale, pixptr);

        return bitmap;
    }
}
它说:

System.AccessViolationException:'尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”

更新:

 double Average_intensity2(Bitmap bmp)
    {

        double[,] image;
        double answer = 0;
        image = imageToByteArray(bmp);
        double l = 0;

        for (int y = 0; y < bmp.Height; y++)
        {
            for (int x = 0; x < bmp.Width; x++)
            {
                answer = answer + image[y,x];

                l++;
            }
        }
        answer = answer / l;
        return answer;
    }
双平均亮度2(位图bmp)
{
双[,]像;
双答案=0;
图像=图像字节数组(bmp);
双l=0;
对于(int y=0;y
此答案应更正引发的
系统.AccessViolationException

使用指定的字节数从进程的非托管内存分配内存

假设
keepWidth=10
keepHeight=10

您需要为
10*10=100
32位整数分配足够的空间,即
10*10*4=400
字节

但是,您只分配
10*10*2=200
字节。然后,您尝试将100个32位整数(400字节)复制到200字节的空间中

本例将从
int[]
开始,其中数组中的每个项目表示位图中的单个RGB像素。然后它将获取
位图
,并返回包含像素数据的
int[]

我不是这方面的专家,绝对不是。我使用了来自的代码的答案来了解如何从
位图
位图
函数)获取像素数据

使用系统;
使用系统图;
使用System.Runtime.InteropServices;
名称空间示例
{
班级计划
{
静态void Main(字符串[]参数)
{
IntPtr bitmapData=IntPtr.Zero;//在此处声明它并将其传递给IntsToBitmap,因为它需要被释放。
尝试
{
int[]像素=新的int[32*32];//32x32位图。
对于(int i=0;i
看起来您希望直接使用位图数据。是否锁定/解锁位图?你知道
int
是32位,而16bpp是
ushort
对吧?我不明白你认为那代码会做什么。您正在尝试创建图像文件吗?在UI中显示什么?WinForm?UWP?网页。我建议从一本图形书或教程开始。您可能会重复使用
Format16bppGrayScale
,这在.Net中不起作用。如果它确实是灰度图像,您可以将其向下移动,显示简化的8bpp灰度图像以选择区域,然后在原始数据中查找相应的块。等待不起作用。很抱歉。我没有得到任何错误,所以我认为它是。但当我盖上相机时,视频应该变成黑色,但事实并非如此。输入的值为0,但位图仍为白色。这意味着它不起作用。如果您使用的是
PixelFormat.Format32bppArgb
,那么值0将是透明的。您需要使用0xFF000000(-16777216)来获得黑色像素。或者使用
PixelFormat.Format32bppRgb
。确定,以便将我的4080值转换为蓝色。但是,我可以遮住相机,然后变黑。但是当我把位图转换回一个整数值时,我得到了85,我认为是蓝色的。我是新手,但是你能在位图中存储一个大于255的数字吗?因为到目前为止,我尝试过的东西似乎都不管用。恐怕我也不是专家,但只要像素格式超过每像素8位,我不明白为什么不行。似乎您的代码没有将
位图
转换为
int[]
的代码已经发布了?我已经添加了一个完整往返的例子,我从
位图中得到的整数都是4080。希望能有帮助。我添加了位图到double[]转换的代码
 double Average_intensity2(Bitmap bmp)
    {

        double[,] image;
        double answer = 0;
        image = imageToByteArray(bmp);
        double l = 0;

        for (int y = 0; y < bmp.Height; y++)
        {
            for (int x = 0; x < bmp.Width; x++)
            {
                answer = answer + image[y,x];

                l++;
            }
        }
        answer = answer / l;
        return answer;
    }