C#将多幅图像绘制到picturebox中,无需平铺

C#将多幅图像绘制到picturebox中,无需平铺,c#,picturebox,drawimage,C#,Picturebox,Drawimage,我正在尝试使用点将多个(20个或更多小图像)绘制到一个图片框中,但是当我这样做时,它会复制图片框每一行的顶行。 我到处都找遍了,也试过很多次,但是我想不出有谁能帮我指出正确的方向吗 我想要实现的是: 图像1图像2图像3图像4图像1 图像2图像4图像1图像3图像3 图像4图像7图像2图像1图像6 图像3图像7图像3图像7图像6 然而,我得到的是: 图像1图像2图像3图像4图像1 图像1图像2图像3图像4图像1 图像1图像2图像3图像4图像1 图像1图像2图像3图像4图像1 (当然没有数字) 这是我

我正在尝试使用点将多个(20个或更多小图像)绘制到一个图片框中,但是当我这样做时,它会复制图片框每一行的顶行。 我到处都找遍了,也试过很多次,但是我想不出有谁能帮我指出正确的方向吗

我想要实现的是:

  • 图像1图像2图像3图像4图像1
  • 图像2图像4图像1图像3图像3
  • 图像4图像7图像2图像1图像6
  • 图像3图像7图像3图像7图像6
  • 然而,我得到的是:

  • 图像1图像2图像3图像4图像1
  • 图像1图像2图像3图像4图像1
  • 图像1图像2图像3图像4图像1
  • 图像1图像2图像3图像4图像1
  • (当然没有数字) 这是我正在使用的代码

    private void Form_Load(object sender, EventArgs e)
    {
        Image[] Files = new Image[7]; 
        Bitmap a = new Bitmap(@"C:\icons\icon1.png");
        Files[0] = new Bitmap(a, 80, 80);
        image1 = Files[0];
        Bitmap b = new Bitmap(@"C:\icons\icon2.png");
        Files[1] = new Bitmap(b, 80, 80);
        image2 = Files[1];
        Bitmap c = new Bitmap(@"C:\icons\icon3.png");
        Files[2] = new Bitmap(c, 80, 80);
        image3 = Files[2];
        Bitmap d = new Bitmap(@"C:\icons\icon4.png");
        Files[3] = new Bitmap(d, 80, 80);
        image4 = Files[3];
        Bitmap h = new Bitmap(@"C:\icons\icon5.png");
        Files[4] = new Bitmap(h, 80, 80);
        image5 = Files[4];
        Bitmap f = new Bitmap(@"C:\icons\icon6.png");
        Files[5] = new Bitmap(f, 80, 80);
        image6 = Files[5];
        Bitmap g = new Bitmap(@"C:\icons\icon7.png");
        Files[6] = new Bitmap(g, 80, 80);
        image7 = Files[6];
    
        pictureBox1.BackgroundImage = CombineBitmap(Files);
    }
    
    public static System.Drawing.Bitmap CombineBitmap(Image[] files)
        {
            List<System.Drawing.Bitmap> images = new List<System.Drawing.Bitmap>();
            System.Drawing.Bitmap finalImage = null;
    
            try
            {
                int width = 0;
                int height = 0;
    
                foreach (Image image in files)
                {
                    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);
    
                    width += bitmap.Width;
                    height = bitmap.Height > height ? bitmap.Height : height;
    
                    images.Add(bitmap);
                }
    
                finalImage = new System.Drawing.Bitmap(width, height);
    
                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(finalImage))
                {
                    g.Clear(System.Drawing.Color.Gray); // Change this to whatever you want the background color to be, you may set this to Color.Transparent as well
    
                    int offset = 15;
                    Point p1 = new Point(0, 0);
                    Point p2 = new Point(80, 0);
                    Point p3 = new Point(160, 0);
                    Point p4 = new Point(240, 0);
                    Point p5 = new Point(320, 0);
    
                    Point p6 = new Point(0, 80);
                    Point p7 = new Point(80, 80);
                    Point p8 = new Point(160, 80);
                    Point p9 = new Point(240, 80);
                    Point p10 = new Point(320, 80);
    
                    Point p11 = new Point(0, 160);
                    Point p12 = new Point(80, 160);
                    Point p13 = new Point(160, 160);
                    Point p14 = new Point(240, 160);
                    Point p15 = new Point(320, 160);
    
                    Point p16 = new Point(0, 240);
                    Point p17 = new Point(80, 240);
                    Point p18 = new Point(160, 240);
                    Point p19 = new Point(240, 240);
                    Point p20 = new Point(320, 240);
    
    
                    g.DrawImage(image1, p1);
                    g.DrawImage(image2, p2);
                    g.DrawImage(image3, p3);
                    g.DrawImage(image4, p4);
                    g.DrawImage(image1, p5);
    
    
                    g.DrawImage(image2, p6);
                    g.DrawImage(image4, p7);
                    g.DrawImage(image1, p8);
                    g.DrawImage(image3, p9);
                    g.DrawImage(image3, p10);
    
                    g.DrawImage(image4, p11);
                    g.DrawImage(image7, p12);
                    g.DrawImage(image2, p13);
                    g.DrawImage(image1, p14);
                    g.DrawImage(image6, p15);
    
                    g.DrawImage(image3, p16);
                    g.DrawImage(image7, p17);
                    g.DrawImage(image3, p18);
                    g.DrawImage(image7, p19);
                    g.DrawImage(image6, p20);
    
                   }
    
                return finalImage;
            }
            catch (Exception ex)
            {
                if (finalImage != null)
                    finalImage.Dispose();
    
                throw ex;
            }
            finally
            {
    
                foreach (System.Drawing.Bitmap image in images)
                {
                    image.Dispose();
                }
            }
        }
    
    private void Form\u加载(对象发送方,事件参数e)
    {
    Image[]Files=新图像[7];
    位图a=新位图(@“C:\icons\icon1.png”);
    文件[0]=新位图(a、80、80);
    image1=文件[0];
    位图b=新位图(@“C:\icons\icon2.png”);
    文件[1]=新位图(b,80,80);
    image2=文件[1];
    位图c=新位图(@“c:\icons\icon3.png”);
    文件[2]=新位图(c,80,80);
    image3=文件[2];
    位图d=新位图(@“C:\icons\icon4.png”);
    文件[3]=新位图(d,80,80);
    image4=文件[3];
    位图h=新位图(@“C:\icons\icon5.png”);
    文件[4]=新位图(h,80,80);
    image5=文件[4];
    位图f=新位图(@“C:\icons\icon6.png”);
    文件[5]=新位图(f,80,80);
    image6=文件[5];
    位图g=新位图(@“C:\icons\icon7.png”);
    文件[6]=新位图(g,80,80);
    image7=文件[6];
    pictureBox1.BackgroundImage=CombineBitmap(文件);
    }
    公共静态System.Drawing.Bitmap组合位图映射(图像[]文件)
    {
    列表图像=新列表();
    System.Drawing.Bitmap finalImage=null;
    尝试
    {
    整数宽度=0;
    整数高度=0;
    foreach(文件中的图像)
    {
    System.Drawing.Bitmap Bitmap=新的System.Drawing.Bitmap(图像);
    宽度+=位图宽度;
    高度=位图。高度>高度?位图。高度:高度;
    添加(位图);
    }
    finalImage=新系统.绘图.位图(宽度,高度);
    使用(System.Drawing.Graphics g=System.Drawing.Graphics.FromImage(最终图像))
    {
    g、 清除(System.Drawing.Color.Gray);//将其更改为您想要的背景色,也可以将其设置为Color.Transparent
    整数偏移=15;
    点p1=新点(0,0);
    点p2=新点(80,0);
    点p3=新点(160,0);
    点p4=新点(240,0);
    点p5=新点(320,0);
    点p6=新点(0,80);
    p7点=新点(80,80);
    p8点=新点(160,80);
    p9点=新点(240,80);
    点p10=新点(320,80);
    点p11=新点(0,160);
    点p12=新点(80160);
    点p13=新点(160160);
    点p14=新点(240160);
    点p15=新点(320160);
    点p16=新点(0240);
    点p17=新点(80240);
    点p18=新点(160240);
    点p19=新点(240240);
    点p20=新点(320240);
    g、 DrawImage(图像1,p1);
    g、 DrawImage(图2,p2);
    g、 DrawImage(图3,p3);
    g、 DrawImage(图4,p4);
    g、 DrawImage(图1,p5);
    g、 DrawImage(图2,p6);
    g、 DrawImage(图4,第7页);
    g、 DrawImage(图1,第8页);
    g、 DrawImage(图3,第9页);
    g、 DrawImage(图3,第10页);
    g、 DrawImage(图4,第11页);
    g、 DrawImage(图7,第12页);
    g、 DrawImage(图2,第13页);
    g、 DrawImage(图1,第14页);
    g、 DrawImage(图6,第15页);
    g、 DrawImage(图3,第16页);
    g、 DrawImage(图7,第17页);
    g、 DrawImage(图3,第18页);
    g、 DrawImage(图7,第19页);
    g、 DrawImage(图6,第20页);
    }
    返回最终授权;
    }
    捕获(例外情况除外)
    {
    if(finalImage!=null)
    finalImage.Dispose();
    掷骰子;
    }
    最后
    {
    foreach(图像中的System.Drawing.Bitmap图像)
    {
    image.Dispose();
    }
    }
    }
    
    您的
    finalImage
    位图太小,只允许一行图像。PictureBox控件然后平铺一行图像,以提供您看到的图像

    您正在以宽80像素、高80像素的块绘制图像。因此,位图的宽度应足以容纳
    80*numColumns
    像素,高度应足以容纳
    80*numRows
    像素

    由于您有5列4行,请使用以下命令:

    finalImage = new System.Drawing.Bitmap(400, 320);
    

    哇,真不敢相信我看得太多了。谢谢,太快了!有时我们看不见森林,看不见树木:)