如何提供 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 的区别 及 使用示例