71951


C#で打ち込んだひらがな一字一字を暗号の画像に置き換えるアプリを作っています。

そこで、画像を指定個数（今回は10個）横に連結させたら２列目につなげていくようにしたいです。

[code]

    public partial class Form1 : Form
    {
        Bitmap ArrangeImage(string[] paths)
        {
            List<Image> images = new List<Image>();
            foreach(var path in paths)
            {
                images.Add(Image.FromFile(path));
            }
            int maxHieght = images.Max(x => x.Height);
    
            List<Rectangle> rects = new List<Rectangle>();
            int px = 0;
            foreach (var img in images)
            {
                int newHeight = img.Height * maxHieght / img.Height;
                int newWidth = img.Width * maxHieght / img.Height;
                rects.Add(new Rectangle(px, 0, newWidth, newHeight));
                px += newWidth;
            }
            int width = rects.Sum(x => x.Width);
    
            Bitmap bmp = new Bitmap(width, maxHieght);
            Graphics g = Graphics.FromImage(bmp);
    
            for (int i = 0; i < rects.Count; i++)
            {
                g.DrawImage(images[i], rects[i]);
            }
            g.Dispose();
            foreach (var img in images)
            {
                img.Dispose();
            }
            return bmp;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> paths = new List<string>();
    
           for(int i = 0; i < 20; i++){
            paths.Add(textBox1.Text);
            paths.Add(textBox2.Text);
            paths.Add(textBox3.Text);
     }
            try
            {
                Bitmap bmp = ArrangeImage(paths.ToArray());
                bmp.Save(@"D:\output.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                bmp.Dispose();
            }
            catch
            {
                MessageBox.Show("失敗しました");
            }
        }
    }
    
    
[/code]

<https://lets-csharp.com/arrange-images/>から引用

つまり、１列目に右に画像を10個連結させたら11個目からは２列目に右に連結させていきたいです。

どうしたらいいのでしょうか？

ご教授願います。


CC BY-SA 4.0
2020-11-14T13:42:16.547
71950
2020-11-14T16:07:19.263
42724
question
c#
C#で画像を横に指定個数横に連結させたら改行して２列目に横に連結させたい。


横の指定個数を`columns`として何処かから指定して、以下のような感じで途中の処理を改造すれば出来ると思われます。  
`//`でコメントした部分が追加・変更した点です。

**ビルドも動作確認もしていないので、試してみてください。**

[code]

    List<int> rowwidths = new List<int>();               // ここから
    int rows = (images.Count + (columns - 1)) / columns; //    2次元に配置するための前処理
    int curcol = 0;                                      //
    int py = 0;                                          // ここまで追加
    List<Rectangle> rects = new List<Rectangle>();
    int px = 0;
    foreach (var img in images)
    {
        int newHeight = img.Height * maxHieght / img.Height;
        int newWidth = img.Width * maxHieght / img.Height;
        rects.Add(new Rectangle(px, py, newWidth, newHeight)); // 0 -> py に変更
        px += newWidth;
        if (++curcol >= columns) // ここから
        {                        //    次の行へ移行する処理
            rowwidths.Add(px);   //
            px = 0;              //
            curcol = 0;          //
            py += maxHieght;     //
        }                        // ここまで追加
    }
    if (px != 0)                 // ここから
    {                            //    最後の行の横幅が追加されていない時の処理
        rowwidths.Add(px);       //
    }                            // ここまで追加
    
    int width = rowwidths.Max();   // 最大の横幅値を取得
    int height = rows * maxHieght; // 縦サイズは計算で算出
    
    Bitmap bmp = new Bitmap(width, hieght); // maxHeight -> height に変更
    
[/code]


CC BY-SA 4.0
2020-11-14T16:02:11.273
71951
2020-11-14T16:07:19.263
2020-11-14T16:07:19.263
26370
26370
71950
answer