如何将双数组列表转换为位图? [关闭]

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 类型对我来说似乎很奇怪;它从何而来?您不能以更合乎逻辑的格式(如ByteInt32)接收原始数据吗? 我不能。原始数据固定为 Double。 你能把你的一张图片原始数据作为双份发布吗?

以上是关于如何将双数组列表转换为位图? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将位图读取为 GLubyte 数组? [关闭]

VB.net 如何将数据转换为位图(Bitmap)所需要的byte()数组?急!!!!

如何将图像,Pdf,Docx和Doc文件转换为位图[关闭]

将位图数组转换为 YUV(420 平面)?

如何将字节数组转换为位图实例 (.NET)?

如何将字节数组中的图像文件数据转换为位图?