【问题标题】:c# - how to merge images in vertical?c# - 如何垂直合并图像?
【发布时间】:2020-07-14 18:00:13
【问题描述】:

我有此代码,但不起作用。我正在尝试从包含验证码的网站中提取图像。

        var width = Images.First().Image.Width; //all images in list have the same width so i take the first
        var height = 0;
        for (int i = 104; i < 140; i++) //the list has 300 images. I have to get 36 that contains the captcha separated into pieces
        {
            height += Images[i].Image.Height; 
        }
        var bitmap2 = new Bitmap(width, height);
        var g = Graphics.FromImage(bitmap2);

        height = 0;
        for (int i = 104; i < 140; i++)  
        {
            Image image = Images[i].Image;
            g.DrawImage(image, 0, height);
            height += image.Height;
        }

        bitmap2.Save(@"C:\Users\user\Desktop\test\test.png", ImageFormat.Png);

使用此代码,我得到以下结果:

image

我不知道为什么它的质量很差。我认为它正在重复记录在结果位图中的图像

【问题讨论】:

  • g.DrawImage 确实支持“GraphicUnits”。 docs.microsoft.com/en-us/dotnet/api/…与其他使用的单位有区别吗?
  • @SvenBardos 来测试这个我必须设置一个我不知道如何设置的 point[] 数组,但我认为图形单元没有区别
  • 另一个想法:是g.DrawImage(image, 0, height -1); ?因为从 0/0 绘制高度,例如10 会给你一个来自 0/0;x/9 的图像当然对于第一次迭代高度应该用 1 初始化
  • @SvenBardos 已经尝试过 height-1 结果是一样的
  • 总是在您的图形对象周围放置一个using,以便在您尝试保存图像之前正确关闭它。

标签: c# image bitmap captcha


【解决方案1】:

我可以在代码中看到一些次优的东西,但老实说,没有一个东西可以给出这样的结果。遇到此类问题的唯一方法是,如果您弄乱原始后端并执行将数据解释为图像的方式的操作。

代码中唯一需要修复的两件事似乎是:

  • 将所有图像的分辨率设置为相同的值。这会影响它们被绘制的大小,从而会打乱定位
  • 在完成Graphics 对象后关闭它,以便在尝试保存任何内容之前确认所有更改都已完成。

请注意,在我调整后的代码中,images 只是一个 List&lt;Bitmap&gt;,而 for 循环只是遍历它们。您从未指定您的 Images 集合是什么类型,这对我来说更容易测试。

Int32 width = Images.First().Width;
Int32 height = 0;
for (Int32 i = 0; i < Images.Count; i++)
{
    height += Images[i].Height;
}
Bitmap bitmap2 = new Bitmap(width, height);
bitmap2.SetResolution(72, 72); // <-- Set explicit resolution on bitmap2
// Always put Graphics objects in a 'using' block.
using (Graphics g = Graphics.FromImage(bitmap2))
{
    height = 0;
    for (Int32 i = 0; i < Images.Count; i++)
    {
        Bitmap image = Images[i];
        image.SetResolution(72, 72); // <-- Set resolution equal to bitmap2
        g.DrawImage(image, 0, height);
        height += image.Height;
    }
}
bitmap2.Save(@"C:\Users\user\Desktop\test\test.png", ImageFormat.Png);

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多