如何提供 AddRange 以获取 C# 中的所有数据?

Posted

技术标签:

【中文标题】如何提供 AddRange 以获取 C# 中的所有数据?【英文标题】:How can I provide AddRange to get all data in C#? 【发布时间】:2021-12-21 21:28:55 【问题描述】:

我正在尝试从字节数组中获取位图图片,但我注意到“数据”中只有三个数据。

我的代码有问题。

我以为我用这个得到了所有数据:

byte[] data = alldata.ToArray();

但它只是获取三个数据。如何获取所有数据?

using AForge.Video.DirectShow;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace dnm2510img

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
        public FilterInfoCollection devices;
        public VideoCaptureDevice camera;
        private void Form1_Load(object sender, EventArgs e)
        
            devices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            foreach (FilterInfo item in devices)
            
                comboBox1.Items.Add(item.Name);
            
            camera = new VideoCaptureDevice();
            comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
        
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        
            try
            
                if (camera.IsRunning == false)
                
                    camera = new VideoCaptureDevice(devices[comboBox1.SelectedIndex].MonikerString);
                    camera.NewFrame += Camera_NewFrame;
                    camera.Start();
                
            
            catch (Exception exc)
            
                MessageBox.Show(exc.Message + "");
            
        
        List<byte> alldata = new List<byte>();
        public void Camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            byte[] maindata = new byte[image.Width*3];
            int count = 0;
            if(btnapplyWasClicked == true)
            
                for (int i = 0; i < image.Height; i++)
                
                    for (int j = 0; j < image.Width; j++)
                    
                        Color color = image.GetPixel(j, i);
                        maindata[count] = color.R;
                        maindata[count + 1] = color.G;
                        maindata[count + 2] = color.B;
                    
                    byte[] processGray = Gray.GrayFilter(maindata,image.Width);
                    alldata.AddRange(processGray);
                       
            
        
        private bool btnapplyWasClicked = false;

        private void btnapply_Click(object sender, EventArgs e)
        
            btnapplyWasClicked = true;
        

这是相关部分:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
        
            byte[] data = alldata.ToArray();
            Bitmap bmp = new Bitmap(640, 360, PixelFormat.Format24bppRgb);
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
            Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
            bmp.UnlockBits(bmpData);
            picfilter.Image = bmp;
        
    

这是 Gray.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dnm0811

    class Gray
    
        public static byte[] GrayFilter(byte[] data, int width)
        
            List<byte> alldataa = new List<byte>();
            for (int i = 0; i < width - 1; i += 3)
            
                int temp = ((data[i] + data[i + 1] + data[i + 2]) / 3);
                data[i] = (byte)temp;
                data[i + 1] = (byte)temp;
                data[i + 2] = (byte)temp;
            
            return data;
        
    

【问题讨论】:

***.com/questions/7350679/… 这对你有帮助吗? 感谢您的回答,但可能是我理解错误,但在无法用这种方式修复之前我尝试了内存流,而我的问题出在开始。我无法使用 addRange 获取所有数据。我刚刚从实时视图中获得了其中三个。@ TimChang 您是否使用调试器查看数据添加到该列表的频率? 我不擅长使用断点。如果我分享最后的代码,你能不能检查一下(Gray.cs)@TimChang ok 显示 Gray.cs 【参考方案1】:
List<byte> alldata = new List<byte>();
        public void Camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        
            // add in here
            if(btnapplyWasClicked == true)
            
                //here try clean alldata ??
                alldata.Clear();
                //....
            
        

【讨论】:

当我这样做时,我只是得到一个黑色的视图。@TimChang btnapplyWasClicked 它仍然是黑色的,但我不知道我用于获取图像的其他代码可能是错误的。我很困惑,但我很感谢你一直在努力。

以上是关于如何提供 AddRange 以获取 C# 中的所有数据?的主要内容,如果未能解决你的问题,请参考以下文章

100个 Unity实用技能☀️ | C#中 Add 和 AddRange 的区别 及 使用示例

100个 Unity实用技能☀️ | C#中 Add 和 AddRange 的区别 及 使用示例

优化 C# 代码片段、ObservableCollection 和 AddRange

如何在 C# 中实现串行端口通信以控制现金存款机 [关闭]

如何以编程方式检索所有查询的查询文本

如何从 c# 文件中获取带有退出代码的字符串消息以提供运行它的 .bat 文件