G.drawimage绘制的大小不正确

我正在创建一个包含文件中较小图像的大位图。 这些图像的大小都是250像素,但其中一个变小,另一个大于250像素。 我只是使用基本的g.drawimage方法,所以我不知道我做错了什么。

string[] imagePaths = Directory.GetFiles(@"C:\Users\admin\Desktop\Images"); ArrayList images = new ArrayList(); foreach (var item in imagePaths) images.Add(new Bitmap(item, true)); Bitmap list = new Bitmap(840, 1188); Graphics g = Graphics.FromImage(list); int size = 0; for (int i = 0; i < images.Count; i++) { g.DrawImage((Bitmap)images[i], new Point(10, (i + 1) * 10 + size)); Bitmap bmp = (Bitmap)images[i]; Console.WriteLine(bmp.Height); Font drawFont = new Font("Arial", 16); size += bmp.Height; g.DrawString(imagePaths[i].Substring(imagePaths[i].LastIndexOf("\\") + 1, imagePaths[i].Length - imagePaths[i].LastIndexOf("\\") - 4), drawFont, Brushes.Black, new Point(bmp.Width + 30, (i + 1) * 10 + size / 4)); } list.Save(@"C:\Users\admin\Desktop\list.png", ImageFormat.Png); 

您没有设置dpi值。 这些在DrawImage中很bitmap.SetResolution(dpix, dpiy) ,因此您需要使用bitmap.SetResolution(dpix, dpiy)设置它们。 当它们在图像中不同时,结果也是如此。 你可以从Graphics对象g获取’正确’的一个,或者决定你想要什么。

快速解决:

  for (int i = 0; i < images.Count; i++) { ((Bitmap)images[i]).SetResolution(g.DpiX, g.DpiY); g.DrawImage((Bitmap)images[i], new Point(10, (i + 1) * 10 + size)); Bitmap bmp = (Bitmap)images[i]; ... } 

请注意,新创建的位图使用屏幕dpi分辨率作为其默认值。 如果你想控制dpi,你也需要将它们设置为list

另请注意,我没有更改您的代码; 简化最后一行应该真正移动到循环的顶部然后使用bmp而不是数组元素。