前提・実現したいこと
visual studio2019を使用しc#を使ってプログラムを作成しています(C#は初心者です)。form画面で色を選択するボタンを7個設置してそれぞれカラーダイアログに繋げており、出力ボタンを押すとフォルダに1~7色を使用した組み合わせが重複しない画像127個を出力するプログラムがなかなかできません。また、ファイル名を使用した色にあわせるようにしたいです。コードを記入しますので助言のほどよろしくお願いいたします。
発生している問題・エラーメッセージ
ファイルが実現したいようにできない、127通りの画像を出力できない。
該当のソースコード
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Drawing.Imaging; using System.Diagnostics; using static System.Console; using System.Text.RegularExpressions; namespace WindowsFormsApp1 { public partial class PLTIG : Form { public PLTIG() { InitializeComponent(); } /// <summary> /// 初期ロード /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { this.Text = "PlayListTypeImageGenerator"; FrNm.Text = Properties.Settings.Default.FrNm; Gl1.BackColor = Properties.Settings.Default.P1; PG1.BackColor = Properties.Settings.Default.P2; PR1.BackColor = Properties.Settings.Default.P3; ETY1.BackColor = Properties.Settings.Default.P4; ETMR1.BackColor = Properties.Settings.Default.P5; ETWR1.BackColor = Properties.Settings.Default.P6; EThR1.BackColor = Properties.Settings.Default.P7; Rectwidth.Text = Properties.Settings.Default.width; Rectheight.Text = Properties.Settings.Default.height; } private void FDS_Click(object sender, EventArgs e) { DialogResult dr = folderBrowserDialog1.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { FrNm.Text = folderBrowserDialog1.SelectedPath; FrNm.ReadOnly = true; } } private void btnCC_Click(object sender, EventArgs e) { DialogResult dr = colorDialog1.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { Gl1.BackColor = colorDialog1.Color; G.ReadOnly = true; } } private void textBox1_TextChanged(object sender, EventArgs e) { } private void btnCC2_Click(object sender, EventArgs e) { DialogResult dr = colorDialog2.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { PG1.BackColor = colorDialog2.Color; PGl.ReadOnly = true; } } private void btnCC3_Click(object sender, EventArgs e) { DialogResult dr = colorDialog3.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { PR1.BackColor = colorDialog3.Color; PRe.ReadOnly = true; } } private void btnCC4_Click(object sender, EventArgs e) { DialogResult dr = colorDialog4.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { ETY1.BackColor = colorDialog4.Color; ETYRe.ReadOnly = true; } } private void btnCC5_Click(object sender, EventArgs e) { DialogResult dr = colorDialog5.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { ETMR1.BackColor = colorDialog5.Color; ETMRe.ReadOnly = true; } } private void btnCC6_Click(object sender, EventArgs e) { DialogResult dr = colorDialog6.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { ETWR1.BackColor = colorDialog6.Color; ETWRe.ReadOnly = true; } } private void btnCC7_Click(object sender, EventArgs e) { DialogResult dr = colorDialog7.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { EThR1.BackColor = colorDialog7.Color; EThRe.ReadOnly = true; } } /// <summary> /// 重複しない組み合わせを作るための関数 /// </summary> public static class Combination { public static IEnumerable<T[]> Enumerate<T>(IEnumerable<T> items,int k ,bool withRepetition) { if (k == 1) { foreach (var item in items) yield return new T[] { item }; yield break; } foreach (var item in items) { var leftside = new T[] { item }; // item よりも前のものを除く (順列と組み合わせの違い) // 重複を許さないので、unusedから item そのものも取り除く var unused = withRepetition ? items : items.SkipWhile(e => !e.Equals(item)).Skip(1).ToList(); var list = Enumerate(unused, k-1 , withRepetition); foreach (var rightside in list) { yield return leftside.Concat(rightside).ToArray(); } } } } public void SaveControlImage( string file) { //描画先とするImageオブジェクトを作成する using (var canvas = new Bitmap((int)Rectwidth.Value, (int)Rectheight.Value)) { float w = (float)Rectwidth.Value; float h = (float)Rectheight.Value; //ImageオブジェクトのGraphicsオブジェクトを作成する var g = Graphics.FromImage(canvas); //Brushオブジェクトの作成 SolidBrush f = new SolidBrush(Gl1.BackColor); SolidBrush se = new SolidBrush(PG1.BackColor); SolidBrush th = new SolidBrush(PR1.BackColor); SolidBrush fr = new SolidBrush(ETY1.BackColor); SolidBrush fif = new SolidBrush(ETMR1.BackColor); SolidBrush sixth = new SolidBrush(ETWR1.BackColor); SolidBrush sevth = new SolidBrush(EThR1.BackColor); var Crck = new List<SolidBrush>(); Crck.Add(f); Crck.Add(se); Crck.Add(th); Crck.Add(fr); Crck.Add(fif); Crck.Add(sixth); Crck.Add(sevth); var CrCom = new Dictionary<SolidBrush, string>(); CrCom.Add(f, "Gl"); CrCom.Add(se, "PG"); CrCom.Add(th, "PR"); CrCom.Add(fr, "ETY"); CrCom.Add(fif, "ETMR"); CrCom.Add(sixth, "ETWR"); CrCom.Add(sevth, "EThR"); int n = 7; for (int k = 1; k < n + 1; k++) { var combinations = Combination.Enumerate(Crck, k, withRepetition: false); foreach ( var elem in combinations) { for (int j = 0; j < elem.Count(); j++) { g.FillRectangle(elem[j], j * (w/k) , 0, w / (j+1), h); } canvas.Save(file, System.Drawing.Imaging.ImageFormat.Png); } } f.Dispose(); se.Dispose(); th.Dispose(); fr.Dispose(); fif.Dispose(); sixth.Dispose(); sevth.Dispose(); g.Dispose(); } } public void Output_Click(object sender, EventArgs e) { int i = 1; while (i < 128) { var di = new DirectoryInfo(Environment.CurrentDirectory); var tagName = ""; var max = di.GetFiles(tagName + "_???.txt") // パターンに一致するファイルを取得する .Select(fi => Regex.Match(fi.Name, @"(?i)_(\d{3}).txt$")) // ファイルの中で数値のものを探す .Where(m => m.Success) // 該当するファイルだけに絞り込む .Select(m => Int32.Parse(m.Groups[1].Value)) // 数値を取得する .DefaultIfEmpty(0) // 1つも該当しなかった場合は 0 とする .Max(); // 最大値を取得する var fileName = String.Format("{0}_{1:d3}.png", tagName, max + 1); SaveControlImage(Path.Combine(FrNm.Text, fileName)); i++; } }
試したこと
組み合わせを重複しないプログラムの作成
ファイル名を組み合わせた色にあわせるようにdictionaryを使って作れないか摸索
補足情報(FW/ツールのバージョンなど)
visual studio2019。
・プロジェクトの種類(Windowsフォームアプリ、WPFアプリ、ASP.NET Webアプリ等)
・フレームワークのバージョン(.NET Framework X.X、.NET Core X.X等)
を質問を編集して追記してください。
具体的に何が判らなくて作れないんですか?コードだけ見てあなたの判らない点を知るのは無理(判るとしても、時間の無駄)なので、技術的に解決できない点、どういうインプットに対してどういうアウトプットになるか等、具体的に説明してください。
[2. 質問をする前に自分で何がわからないのかを把握しましょう]
https://teratail.com/help/question-tips#questionTips2
> ファイル名を使用した色にあわせる
とか言われても,具体的にどういう名前を付ければいいのかさっぱりわからない.
(任意の色の名前をどうやって表すのか?)
7色使うやつとかだとめちゃくちゃ長いファイル名になる?
1~7色を使用した組み合わせが重複しない127個の組み合わせとはどのようなものなのでしょう。
[[1], [2], [3], [4], [5], [6], [7]]で7個、[[1,2], [1,3], [1.4], [1,5], [1,6], [1,7]]で6個、合計13個、、、、(以下続く)
とか、組み合わせの仕方を決めてそれを実装する必要があると思いますがその辺りはできているのでしょうか。
ひとつの方法として7ビットのビットマップで1~127まで回せば自然、できてしまう気もしますが。
回答2件
あなたの回答
tips
プレビュー