G.drawimage 绘图尺寸不正确

G.drawimage draws with incorrect size

我正在创建一个大位图,其中包含来自文件的一些较小图像。图像的大小均为 250px,但其中一个变得更小,另一个变得大于 250px。我只是在使用基本的 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) 来设置它们。当它们在图像中不同时,结果也会不同。您可以从 Graphics 对象 g 中获得 'correct' 一个或决定您想要什么。

快速修复:

        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 代替数组元素..