【发布时间】: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;
}
}
}
【问题讨论】:
-
感谢您的回答,但可能是我理解错误,但在无法用这种方式修复之前我尝试了内存流,而我的问题出在开始。我无法使用 addRange 获取所有数据。我刚刚从实时视图中获得了其中三个。@ TimChang
-
您是否使用调试器查看数据添加到该列表的频率?
-
我不擅长使用断点。如果我分享最后的代码,你能不能检查一下(Gray.cs)@TimChang
-
ok 显示 Gray.cs
标签: c# arrays image-processing bitmap