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
代替数组元素..
我正在创建一个大位图,其中包含来自文件的一些较小图像。图像的大小均为 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
代替数组元素..