C# 获取图像的RGB值并可能在C中移动图像文件#

C# 获取图像的RGB值并可能在C中移动图像文件#,c#,file-io,rgb,C#,File Io,Rgb,我正在看一个C#项目,它查看一个图像文件,但不确定扩展名,并记录RGB值,如果它太暗,则将其移动到另一个文件夹中,以便我稍后查看 这里是块形式的 从目录加载多个图像>检查每个文件的RGB值>如果太暗>移动到其他文件夹。如果不忽略(保留在原始文件夹中) 我知道一些基本知识,比如从dir获取文件,但检查整张图片的RGB值,然后移动它或忽略它,我被难住了 我有以下代码: private void button1_Click(object sender, EventArgs e) {

我正在看一个C#项目,它查看一个图像文件,但不确定扩展名,并记录RGB值,如果它太暗,则将其移动到另一个文件夹中,以便我稍后查看

这里是块形式的

从目录加载多个图像>检查每个文件的RGB值>如果太暗>移动到其他文件夹。如果不忽略(保留在原始文件夹中)

我知道一些基本知识,比如从dir获取文件,但检查整张图片的RGB值,然后移动它或忽略它,我被难住了

我有以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
        CompareImages(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "checked"), 127.0, new string[] {"*.jpg", "*.png"});
    }

    private void CompareImages(string sourceFolder, string disposedImgFolder, double threshold, string[] extensions)
    {
        if (Directory.Exists(sourceFolder))
        {
            DirectoryInfo dir = new DirectoryInfo(sourceFolder);
            List<FileInfo> pictures = new List<FileInfo>();

            foreach (string ext in extensions)
            {
                FileInfo[] fi = dir.GetFiles(ext);
                pictures.AddRange(fi);
            }


            Directory.CreateDirectory(disposedImgFolder);

            int j = 0;

            if (pictures.Count > 0)
            {
                for (int i = 0; i < pictures.Count; i++)
                {
                    Image img = null;
                    Bitmap bmp = null;

                    try
                    {

                        img = Image.FromFile(pictures[i].FullName);
                        bmp = new Bitmap(img);
                        img.Dispose();

                        double avg = GetAveragePixelValue(bmp);

                        bmp.Dispose();


                        if (avg < threshold)
                        {
                            string dest = Path.Combine(disposedImgFolder, pictures[i].Name);

                            if (File.Exists(dest) == false)
                            {
                                pictures[i].MoveTo(dest);
                                j++;
                            }
                            else
                            {

                            }
                        }
                        else
                        {

                        }
                    }
                    catch
                    {
                        if (img != null)
                            img.Dispose();
                        if (bmp != null)
                            bmp.Dispose();
                    }
                }

                MessageBox.Show("Done, " + j.ToString() + " files moved.");
            }
        }
    }

    private unsafe double GetAveragePixelValue(Bitmap bmp)
    {
        BitmapData bmData = null;

        try
        {
            bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

            int stride = bmData.Stride;
            IntPtr scan0 = bmData.Scan0;
            int w = bmData.Width;
            int h = bmData.Height;

            double sum = 0;
            long pixels = bmp.Width * bmp.Height;

            byte* p = (byte*)scan0.ToPointer();

            for (int y = 0; y < h; y++)
            {
                p = (byte*)scan0.ToPointer();
                p += y * stride;

                for (int x = 0; x < w; x++)
                {

                    double i = ((double)p[0] + p[1] + p[2]) / 3.0;
                    sum += i;


                    p += 4;
                }

            }

            bmp.UnlockBits(bmData);

            double result = sum / (double)pixels;

            return result;
        }
        catch
        {
            try
            {
                bmp.UnlockBits(bmData);
            }
            catch
            {

            }
        }

        return -1;
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
比较图像(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),“checked”),127.0,新字符串[]{“*.jpg”,“*.png”});
}
私有void CompareImages(字符串sourceFolder、字符串disposedImgFolder、双阈值、字符串[]扩展名)
{
if(Directory.Exists(sourceFolder))
{
DirectoryInfo dir=新的DirectoryInfo(sourceFolder);
列表图片=新列表();
foreach(扩展名中的字符串扩展名)
{
FileInfo[]fi=dir.GetFiles(ext);
图片。添加范围(fi);
}
Directory.CreateDirectory(disposedImgFolder);
int j=0;
如果(pictures.Count>0)
{
对于(int i=0;i

如何定义threashold?

我想您需要了解一下RGB。每个像素都有一个红色、绿色和蓝色的值,我猜你在寻找一种方法来测量“平均”像素的亮度?如果是这样,您需要在所有像素上循环。执行此操作时,计算每个像素的亮度。每个像素的“亮度”可以用几种方法计算,你可以简单地做(R+G+B)/3,或者你可以试着模拟人眼对R、G和B不一样敏感

然后你必须决定如何使用像素的“亮度”。你是说,中位数,还有别的吗?这取决于你想做什么

更新:在阅读了您的更多评论后,我仍然不确定您所说的“亮”或“暗”是什么意思。您的术语似乎有点混乱,您一直在谈论整个图像的RGB值,但图像中的RGB值指的是单个像素值

我相信这一页可以帮助你做你想做的事情:

另外,一些免费阅读,以了解RGB:

)


我想你需要了解一下RGB。每个像素都有一个红色、绿色和蓝色的值,我猜你在寻找一种方法来测量“平均”像素的亮度?如果是这样,您需要在所有像素上循环。执行此操作时,计算每个像素的亮度。每个像素的“亮度”可以用几种方法计算,你可以简单地做(R+G+B)/3,或者你可以试着模拟人眼对R、G和B不一样敏感

然后你必须决定如何使用像素的“亮度”。你是说,中位数,还有别的吗?这取决于你想做什么

更新:在阅读了您的更多评论后,我仍然不确定您所说的“亮”或“暗”是什么意思。信息技术
        using (var m = new MemoryStream())
        {
            using (var img = Image.FromFile(args[0]))
            {
                img.Save(m, ImageFormat.Bmp);
            }

            m.Position = 0;

            using (var bitmap = (Bitmap)Bitmap.FromStream(m))
            {
                for (var x = 0; x < bitmap.Width; x++)
                {
                    for (var y = 0; y < bitmap.Height; y++)
                    {
                        var color = bitmap.GetPixel(x, y);

                        // TODO: Do what ever you want
                    }
                }
            }
        }