C# 将int数组转换为位图
我正在尝试将整数数组转换为位图。我有一个范围为[0-4095]的整数数组,我想将它们显示在位图中,然后让用户在位图中选择一个区域,复制该区域,然后取回整数 我有用于剪切位图区域的代码,但我在生成值高达4095的位图以及从位图中获取值高达4095时遇到问题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
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;
}