C# 图像Ushort数组到位图格式已映射
我有一个Ushort图像数据数组作为输入。这里收集了其他输入,例如“宽度、高度”。ushort数组还包含我想要使用的最小值和最大值,它们存储在“io_current”中 我想返回格式化的8ppined位图,我有此代码,但我做错了什么C# 图像Ushort数组到位图格式已映射,c#,arrays,image-processing,bitmap,bitmapimage,C#,Arrays,Image Processing,Bitmap,Bitmapimage,我有一个Ushort图像数据数组作为输入。这里收集了其他输入,例如“宽度、高度”。ushort数组还包含我想要使用的最小值和最大值,它们存储在“io_current”中 我想返回格式化的8ppined位图,我有此代码,但我做错了什么 private Bitmap CreateBitmap(ushort[,] pixels16) { int width = pixels16.GetLength(1); int height = pixels16.Ge
private Bitmap CreateBitmap(ushort[,] pixels16)
{
int width = pixels16.GetLength(1);
int height = pixels16.GetLength(0);
Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, width, height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
// This 'unsafe' part of the code populates the bitmap bmp with data stored in pixel16.
// It does so using pointers, and therefore the need for 'unsafe'.
unsafe
{
//int pixelSize = 4;
int i, j; //, j1; //, i1;
byte b;
ushort sVal;
double lPixval;
//The array has max and min constraints
int distance = io_current.MaximumValue - io_current.MinimumValue;
for (i = 0; i < bmd.Height; ++i)
{
byte* row = (byte*)bmd.Scan0 + (i * bmd.Stride);
//i1 = i * bmd.Height;
for (j = 0; j < bmd.Width; ++j)
{
sVal = (ushort)(pixels16[i, j]);
lPixval = ((sVal - io_current.MinimumValue) * 255) / distance; // Convert to a 255 value range
//lPixval = ((sVal - io_current.MinimumValue) / distance) * 255;
//lPixval = 255 - lPixval; //invert the value
if (lPixval > 255) lPixval = 255;
if (lPixval < 0) lPixval = 0;
b = (byte)(lPixval);
//j1 = j * pixelSize; //Pixelsize is one
row[j] = b; // Just one in 8bpp
//Not necessary for format8bppindexed
//row[j1] = b; // Red
//row[j1 + 1] = b; // Green
//row[j1 + 2] = b; // Blue
//row[j1 + 3] = 255; //No Alpha channel in 24bit
}
}
}
bmp.UnlockBits(bmd);
return bmp;
}
private Bitmap CreateBitmap(ushort[,]像素16)
{
int width=pixels16.GetLength(1);
整数高度=像素16.GetLength(0);
位图bmp=新位图(宽度、高度、系统、绘图、成像、像素格式、Format8Bppined);
BitmapData bmd=bmp.LockBits(新矩形(0,0,宽度,高度),
System.Drawing.Imaging.ImageLockMode.ReadOnly,bmp.PixelFormat);
//代码的“不安全”部分使用存储在pixel16中的数据填充位图bmp。
//它使用指针来实现,因此需要“不安全”。
不安全的
{
//int pixelSize=4;
int i,j;//,j1;//,i1;
字节b;
乌肖特·斯瓦尔;
双lPixval;
//阵列具有最大和最小约束
int距离=io_电流.最大值-io_电流.最小值;
对于(i=0;i255)lPixval=255;
如果(lPixval<0)lPixval=0;
b=(字节)(lPixval);
//j1=j*pixelSize;//pixelSize为一
行[j]=b;//8bpp中只有一行
//不必为Format8AppIndexed设置索引
//行[j1]=b;//红色
//行[j1+1]=b;//绿色
//行[j1+2]=b;//蓝色
//行[j1+3]=255;//24位中没有Alpha通道
}
}
}
解锁位(bmd);
返回bmp;
}
我的屏幕是黑色的,或者是单色的。基本上没有返回可用的数据。显然,从评论中可以看出。我试图将其从24位位图代码转换过来,并认为这很容易。8bpindex是一种非常无用的像素格式,渲染成本很高。它可以追溯到20世纪90年代初,当时视频适配器仍然非常原始,没有足够的RAM。他们使用调色板在一定程度上提高了颜色的逼真度。这是你忘记的。不用麻烦了,我用的是一个RGE,有些过滤器只接受8bpp格式。请参阅:在另一个项目中:它使用24位图,然后使用以下行将其转换为8pp:result=a rge.Imaging.Filters.Grayscale.CommonAlgorithms.BT709.Apply(image);然后使用该“值”进行处理。所以我可以这么做。但这似乎需要更多的时间和处理。看一看:看一看a博客创建者对你评论的回应。。我不确定这是主观的还是什么: