Как отобрать картинки с определенным цветом? - C#

Узнай цену своей работы

Формулировка задачи:

Есть папка с картинками (около 1к). Как отобрать картинки, где есть красный цвет? В какую сторону смотреть и реально ли это вообще?

Решение задачи: «Как отобрать картинки с определенным цветом?»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Net;
  6. using System.Windows.Forms;
  7.  
  8. namespace WindowsFormsApplication360
  9. {
  10.     public partial class Form1 : Form
  11.     {
  12.         private List<ImageInfo> images = new List<ImageInfo>();
  13.         private List<ImageInfo> filtered = new List<ImageInfo>();
  14.  
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.             tbFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
  19.         }
  20.  
  21.         private void lbColor_Click(object sender, EventArgs e)
  22.         {
  23.             var dlg = new ColorDialog() {Color = lbColor.BackColor};
  24.             if(dlg.ShowDialog() == DialogResult.OK)
  25.             {
  26.                 lbColor.BackColor = dlg.Color;
  27.                 filtered = Filter(lbColor.BackColor);
  28.                 lbIndexed.Text = "Indexed: " + images.Count;
  29.                 lbFiltered.Text = "Filtered: " + filtered.Count;
  30.                 flMain.Build(filtered);
  31.             }
  32.         }
  33.  
  34.         private void btFolder_Click(object sender, EventArgs e)
  35.         {
  36.             var dlg = new FolderBrowserDialog();
  37.             if(dlg.ShowDialog() == DialogResult.OK)
  38.                 tbFolder.Text = dlg.SelectedPath;
  39.         }
  40.  
  41.         private List<ImageInfo> Index(string path)
  42.         {
  43.             var res = new List<ImageInfo>();
  44.             foreach(var file in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
  45.             switch(Path.GetExtension(file).ToLower())
  46.             {
  47.                 case ".png":
  48.                 case ".jpg":
  49.                 case ".bmp":
  50.                 case ".gif":
  51.                     try
  52.                     {
  53.                         res.Add(new ImageInfo(file));
  54.                     }
  55.                     catch {/*skip*/ }
  56.                     break;
  57.             }
  58.             return res;
  59.         }
  60.  
  61.  
  62.         private List<ImageInfo> Filter(Color c)
  63.         {
  64.             var filtered = new List<ImageInfo>();
  65.             const float minRate = 0.01f;
  66.             foreach(var im in images)
  67.             {
  68.                 if (im.Hist.GetFrequency(c) >= minRate)
  69.                     filtered.Add(im);
  70.             }
  71.  
  72.             return filtered;
  73.         }
  74.  
  75.         private void btIndex_Click(object sender, EventArgs e)
  76.         {
  77.             Cursor = Cursors.WaitCursor;
  78.             images = Index(tbFolder.Text);
  79.             filtered = Filter(lbColor.BackColor);
  80.             flMain.Build(filtered);
  81.             lbIndexed.Text = "Indexed: " + images.Count;
  82.             lbFiltered.Text = "Filtered: " + filtered.Count;
  83.             Cursor = Cursors.Default;
  84.         }
  85.  
  86.         private void flMain_PaintItem(object sender, FastTreeNS.PaintItemContentEventArgs e)
  87.         {
  88.             var item = filtered[e.Info.ItemIndex];
  89.             using (var bmp = new Bitmap(item.FilePath))
  90.                 e.Graphics.DrawImage(bmp, e.Info.FullRect);
  91.         }
  92.  
  93.         private void flMain_ItemSelectedStateChanged(object sender, FastTreeNS.ItemSelectedStateChangedEventArgs e)
  94.         {
  95.             if(e.Selected)
  96.             {
  97.                 pbMain.ImageLocation = filtered[e.ItemIndex].FilePath;
  98.             }
  99.         }
  100.     }
  101.  
  102.     /// <summary>
  103.     /// Информация о картинке (путь, гистограммы)
  104.     /// </summary>
  105.     class ImageInfo
  106.     {
  107.         public Hist Hist = new Hist();
  108.         public string FilePath { get; private set; }
  109.  
  110.         public ImageInfo(string imagePath)
  111.         {
  112.             this.FilePath = imagePath;
  113.  
  114.             using (var bmp = new Bitmap(imagePath))
  115.             using (var thumb = (Bitmap)bmp.GetThumbnailImage(100, 100, null, IntPtr.Zero))
  116.             using (var wr = new ImageWrapper(thumb))
  117.             foreach(var p in wr)
  118.                 Hist.Add(wr[p]);
  119.         }
  120.     }
  121.  
  122.     /// <summary>
  123.     /// Гистограмма цветов
  124.     /// </summary>
  125.     class Hist
  126.     {
  127.         private int[,,] sum = new int[32, 32, 32];
  128.         private int count;
  129.  
  130.         public void Add(Color c)
  131.         {
  132.             sum[c.R/8, c.G/8, c.B/8]++;
  133.             count++;
  134.         }
  135.  
  136.         public float GetFrequency(Color c)
  137.         {
  138.             return 1f * sum[c.R / 8, c.G / 8, c.B / 8] / count;
  139.         }
  140.     }
  141. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы