Получить значение RGB изображения и, возможно, переместить файл изображения в C # - PullRequest
2 голосов
/ 13 ноября 2011

Я смотрю на проект в C #, который просматривает файл изображения, еще не уверенный в расширении, и отмечает значение RGB, и, если оно слишком темное, перемещает его в другую папку, чтобы я мог посмотреть позже

Так вот, это в виде блока

Загрузка нескольких изображений из каталога> Проверьте значение RGB каждого файла> если он слишком темный>, переместите в другую папку. если не игнорировать (оставить в оригинальной папке)

Я знаю основы, такие как получение файлов из каталога, но проверяя значение 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;
    }

Как я могу определить трехступенчатую?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

Если вы хотите прочитать каждый пиксель изображения, оно должно быть преобразовано в растровое изображение. Затем вы можете использовать метод GetPixel. Но этот процесс очень медленный и требует много ресурсов процессора. Если вы это сделаете, вам действительно нужно выполнить какой-то тест раньше.

        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
                    }
                }
            }
        }
0 голосов
/ 13 ноября 2011

Я думаю, вам нужно немного почитать о RGB. С каждым пикселем будет связано значение красного, зеленого и синего, и я думаю, вы ищете способ получить некоторую оценку яркости «среднего» пикселя? Если это так, вам нужно перебрать все пиксели. При этом рассчитайте яркость каждого пикселя. «Яркость» каждого пикселя можно рассчитать несколькими способами, вы можете просто сделать (R + G + B) / 3 или попытаться имитировать, что человеческий глаз не одинаково чувствителен к R, G и B.

Тогда вам придется решить, как использовать вашу «яркость» пикселя. Значит, Медиана, что-то еще? Это зависит от того, что вы хотите сделать ..

Обновление : Прочитав больше ваших комментариев, я все еще не совсем уверен, что вы подразумеваете под «светлым» или «темным». Также кажется, что ваша терминология немного запутана, вы продолжаете говорить о значении RGB для всего изображения, но значения RGB в изображении относятся к значениям отдельных пикселей.

Я считаю, что эта страница может помочь вам делать то, что вы хотите: http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx

Также, несколько бесплатных чтений для понимания RGB:

http://en.wikipedia.org/wiki/Luma_(video)

http://en.wikipedia.org/wiki/RGB_color_space

...