Как отобрать картинки с определенным цветом? - C#
Формулировка задачи:
Есть папка с картинками (около 1к).
Как отобрать картинки, где есть красный цвет?
В какую сторону смотреть и реально ли это вообще?
Решение задачи: «Как отобрать картинки с определенным цветом?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Net; using System.Windows.Forms; namespace WindowsFormsApplication360 { public partial class Form1 : Form { private List<ImageInfo> images = new List<ImageInfo>(); private List<ImageInfo> filtered = new List<ImageInfo>(); public Form1() { InitializeComponent(); tbFolder.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); } private void lbColor_Click(object sender, EventArgs e) { var dlg = new ColorDialog() {Color = lbColor.BackColor}; if(dlg.ShowDialog() == DialogResult.OK) { lbColor.BackColor = dlg.Color; filtered = Filter(lbColor.BackColor); lbIndexed.Text = "Indexed: " + images.Count; lbFiltered.Text = "Filtered: " + filtered.Count; flMain.Build(filtered); } } private void btFolder_Click(object sender, EventArgs e) { var dlg = new FolderBrowserDialog(); if(dlg.ShowDialog() == DialogResult.OK) tbFolder.Text = dlg.SelectedPath; } private List<ImageInfo> Index(string path) { var res = new List<ImageInfo>(); foreach(var file in Directory.GetFiles(path, "*", SearchOption.AllDirectories)) switch(Path.GetExtension(file).ToLower()) { case ".png": case ".jpg": case ".bmp": case ".gif": try { res.Add(new ImageInfo(file)); } catch {/*skip*/ } break; } return res; } private List<ImageInfo> Filter(Color c) { var filtered = new List<ImageInfo>(); const float minRate = 0.01f; foreach(var im in images) { if (im.Hist.GetFrequency(c) >= minRate) filtered.Add(im); } return filtered; } private void btIndex_Click(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; images = Index(tbFolder.Text); filtered = Filter(lbColor.BackColor); flMain.Build(filtered); lbIndexed.Text = "Indexed: " + images.Count; lbFiltered.Text = "Filtered: " + filtered.Count; Cursor = Cursors.Default; } private void flMain_PaintItem(object sender, FastTreeNS.PaintItemContentEventArgs e) { var item = filtered[e.Info.ItemIndex]; using (var bmp = new Bitmap(item.FilePath)) e.Graphics.DrawImage(bmp, e.Info.FullRect); } private void flMain_ItemSelectedStateChanged(object sender, FastTreeNS.ItemSelectedStateChangedEventArgs e) { if(e.Selected) { pbMain.ImageLocation = filtered[e.ItemIndex].FilePath; } } } /// <summary> /// Информация о картинке (путь, гистограммы) /// </summary> class ImageInfo { public Hist Hist = new Hist(); public string FilePath { get; private set; } public ImageInfo(string imagePath) { this.FilePath = imagePath; using (var bmp = new Bitmap(imagePath)) using (var thumb = (Bitmap)bmp.GetThumbnailImage(100, 100, null, IntPtr.Zero)) using (var wr = new ImageWrapper(thumb)) foreach(var p in wr) Hist.Add(wr[p]); } } /// <summary> /// Гистограмма цветов /// </summary> class Hist { private int[,,] sum = new int[32, 32, 32]; private int count; public void Add(Color c) { sum[c.R/8, c.G/8, c.B/8]++; count++; } public float GetFrequency(Color c) { return 1f * sum[c.R / 8, c.G / 8, c.B / 8] / count; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д