如何将双数组列表转换为位图? [关闭]
Posted
技术标签:
【中文标题】如何将双数组列表转换为位图? [关闭]【英文标题】:How can I convert a list of double array to Bitmap? [closed] 【发布时间】:2022-01-08 14:18:28 【问题描述】:我有一个双数组列表,每个数组都被视为位图中的一行。我想将此列表转换为位图。目前,我必须有两个步骤来做到这一点:
-
将双精度数组列表转换为二维双精度数组。
将二维双精度数组转换为位图。
但是源代码消耗了太多时间。有什么办法可以直接转换吗?感谢您的支持!
double[,] bitmap_doublearray = AddedFunction.CreateRectangularArray(data.ListOfRow);
Bitmap image_ = AddedFunction.ToBitmap(bitmap_doublearray);
public static T[,] CreateRectangularArray<T>(IList<T[]> arrays)
int minorLength = arrays[0].Length;
T[,] ret = new T[arrays.Count, minorLength];
for (int i = 0; i < arrays.Count; i++)
var array = arrays[i];
if (array.Length != minorLength)
throw new ArgumentException
("All arrays must be the same length");
for (int j = 0; j < minorLength; j++)
ret[i, j] = array[j];
return ret;
public static unsafe Bitmap ToBitmap(double[,] rawImage)
double min_color = Form1.setting_info.GetMinColorValue();
double max_color = Form1.setting_info.GetMaxColorValue();
int width = rawImage.GetLength(1);
int height = rawImage.GetLength(0);
Bitmap Image = new Bitmap(width, height);
BitmapData bitmapData = Image.LockBits(
new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb
);
ColorARGB* startingPosition = (ColorARGB*)bitmapData.Scan0;
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++)
double color = rawImage[i, j];
ColorARGB* position = startingPosition + j + i * width;
int rgb;
if (color < min_color)
color = min_color;
else if (color > max_color)
color = max_color;
rgb = (int)((max_color - color) * 255 / (max_color - min_color));
position->A = 255;
position->R = (byte)rgb;
position->G = (byte)rgb;
position->B = (byte)rgb;
Image.UnlockBits(bitmapData);
return Image;
【问题讨论】:
恐怕我迷路了。如何从double
的数组中获取位图?
只需将二维双精度数组的元素转换为ColorARGB类型即可。
那么你是说每个双精度值实际上只是 4 个字节(32 位)的 ARGB 格式的颜色,已存储为双精度值吗?在阅读您的回复之前,我猜它可能是高度图信息(这会导致灰度图像)。这就是为什么此类信息对于使您的问题易于理解的关键。您还应该展示您的尝试,但如果它只是您寻求的优化(并且它 100%)有效,那么它可能更适合 Code Review Stack Exchange 站点。
首先,我通过特定的数学将双元素转换为字节元素。之后,我将二维字节的元素转换为 ColorARGB 类型。
实际上,我需要一个新的解决方案来取代我目前的方式。
【参考方案1】:
您可以通过将像素数组直接复制到位图 Scan0 指针中来创建位图。 为此,您应该将双精度数组转换为 RGB 或 RGBA 字节数组。 (每像素 3-4 个字节)
public static Bitmap CreateFromArray(int w, int h, PixelFormat format, byte[] rgbValues)
var b = new Bitmap(w, h, format);
var boundsRect = new Rectangle(0, 0, w, h);
var bmpData = b.LockBits(boundsRect,
ImageLockMode.WriteOnly,
b.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = b.Height * Math.Abs(bmpData.Stride);
Marshal.Copy(rgbValues, 0, ptr, bytes);
b.UnlockBits(bmpData);
return b;
如果您的数组包含整个位图,您可以像这样重新创建位图:
var bm = Bitmap.FromStream(new MemoryStream(byteArr)) as Bitmap;
【讨论】:
感谢您的推荐。我知道我可以从字节数组转换为位图。但是我的程序的原始数据是数组列表。所以我想知道它执行的时间太长了。 @CongHoanNguyen 我认为“数组列表”不是问题;浮点转换操作更有可能减慢它的速度。double
类型对我来说似乎很奇怪;它从何而来?您不能以更合乎逻辑的格式(如Byte
或Int32
)接收原始数据吗?
我不能。原始数据固定为 Double。
你能把你的一张图片原始数据作为双份发布吗?以上是关于如何将双数组列表转换为位图? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章