【问题标题】:G.drawimage draws with incorrect sizeG.drawimage 以不正确的尺寸绘制
【发布时间】:2018-02-26 14:04:49
【问题描述】:

我正在创建一个包含文件中一些较小图像的大位图。图像的大小均为 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);

【问题讨论】:

  • 您确定它们的原始尺寸吗?尝试用 Paint 打开它们,通过左下角的 x,y 看到确切的大小
  • 是的,它们都是 250 像素。其中之一大 40 kb
  • 我需要更多信息来查看问题所在。您认为相关的所有代码就足够了。
  • 您的问题解决了吗?

标签: c# bitmap drawimage


【解决方案1】:

您没有设置 dpi 值。这些在DrawImage 中很荣幸,因此您需要使用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 代替数组元素..

【讨论】:

  • 在新制作的图像上绘画时,您只需使用Rectangle 而不是Point,并为其指定绘画图像的尺寸,即可解决dpi 问题。它会将图像“调整大小”为给定大小,而不是应用 dpi。
  • 是的。但是计算 Rectangle 并不比设置统一的 dpi 值更容易,是吗?
  • 没什么可计算的;矩形不是从 4 个坐标初始化的,它是由原点和尺寸组成的。您需要做的就是提供与其他两个参数相同的原点值以及图像宽度和高度。
  • 也就是说,您以 dpi 为中心的答案具有解释为什么出错的附加价值。但它的缺点是它会更改绘制图像对象的属性以进行处理步骤,而该处理步骤不应以任何方式影响该对象..
  • 源对象并没有真正改变,除非你存储它。必须根据 OP 的需要以某种方式确定 Rectangle 的大小。控制结果大小的两种有效方法。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多