【问题标题】:How can I provide AddRange to get all data in C#?如何提供 AddRange 以获取 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;
        }
    }
}

【问题讨论】:

  • stackoverflow.com/questions/7350679/… 这对你有帮助吗?
  • 感谢您的回答,但可能是我理解错误,但在无法用这种方式修复之前我尝试了内存流,而我的问题出在开始。我无法使用 addRange 获取所有数据。我刚刚从实时视图中获得了其中三个。@ TimChang
  • 您是否使用调试器查看数据添加到该列表的频率?
  • 我不擅长使用断点。如果我分享最后的代码,你能不能检查一下(Gray.cs)@TimChang
  • ok 显示 Gray.cs

标签: c# arrays image-processing bitmap


【解决方案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
  • 它仍然是黑色的,但我不知道我用于获取图像的其他代码可能是错误的。我很困惑,但我很感谢你一直在努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多