c#-如何在垂直方向上合并图像?

问题描述 投票:0回答:1

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

        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

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

c# image bitmap captcha
1个回答
0
投票

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

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

  • 将所有图像的分辨率设置为相同的值。这会影响绘制的大小,因此可能会使位置混乱]
  • 完成Graphics对象后将其关闭,因此在尝试保存任何内容之前,所有更改都已确认完成。
  • 请注意,在我调整后的代码中,images只是一个List<Bitmap>,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);
© www.soinside.com 2019 - 2024. All rights reserved.