【问题标题】:How can i create one image from two?如何从两个图像中创建一个图像?
【发布时间】:2013-09-23 12:37:01
【问题描述】:

我想创建两个将并排的新图像。 如果我有 4 张图片,那么可以在里面制作 4 张图片的新图片。 不是一个在另一个上,而是 2 个图像,一个靠近另一个,或者如果是 4 个图像,那么每个图像也靠近另一个。

到目前为止,我所做的是从两个图像中提取像素:

private void GetPixels(string File1, string File2)
        {
            Bitmap bmp1 = new Bitmap(File1);
            Bitmap bmp2 = new Bitmap(File2);

            for (int i = 0; i < bmp1.Width; i++)
            {
                for (int j = 0; j < bmp1.Height; j++)
                {
                    Color pixel = bmp1.GetPixel(i, j);
                }
            }
            for (int x = 0; x < bmp2.Width; x++)
            {
                for (int y = 0; y < bmp2.Height; y++)
                {
                    Color pixel = bmp1.GetPixel(x, y);
                }
            }
        }

我想创建一个新的位图,它的大小足以存储另外两个位图。 如何计算新位图的正确大小,使其包含另外两个位图?

我如何将像素添加到新位图?

编辑**

将其添加到命名空间下的Form1的顶层,就可以了。 现在我试着像这样使用它:

private void CreateNewImage()
        {
            for (int i = 0; i < imagesRainUrls.Count; i++)
            {
                //Use it
                //Double the same image
                Bitmap doubledBitmap =  imagesRainUrls[i].DoubleBitmap();
                //Append new image
                Bitmap appendedBitmap = imagesRainUrls.AppendBitmap(imagesSatelliteUrls[i]);
            }
        }

imagesRainUrls 是图像列表,imagesSatelliteUrls 是图像列表。

我遇到的错误:

错误 1 ​​'string' 不包含 'DoubleBitmap' 的定义,并且最佳扩展方法重载 'DownloadImages.BitmapExtensions.DoubleBitmap(System.Drawing.Bitmap)' 有一些无效参数

错误 2 实例参数:无法从 'string' 转换为 'System.Drawing.Bitmap'

错误 3 'System.Collections.Generic.List' 不包含 'AppendBitmap' 的定义,并且最佳扩展方法重载 'DownloadImages.BitmapExtensions.AppendBitmap(System.Drawing.Bitmap, System.Drawing.Bitmap)' 具有一些无效的参数

错误 4 实例参数:无法从“System.Collections.Generic.List”转换为“System.Drawing.Bitmap”

错误 5 参数 2:无法从 'string' 转换为 'System.Drawing.Bitmap'

而且我在 imagesRainUrls 列表中还有更多图像,然后是 SatelliteUrls 列表,所以我怎样才能让它合并这两个图像,直到 SatelliteUrls 图像的数量? 雨图像我有 62 和卫星只有 9 在这个过程的最后,我将从所有合并的 gif 和未合并的 gif 中制作动画 gif。所以动画将是一个 gif,前 9 个图像合并,其余的 Rain 不会合并,而是相同的动画。

那么我如何使用 FOR 循环来实现它,因为我有更多的雨图像然后是卫星,所以我只需要合并 9 个图像。

【问题讨论】:

  • 请注意,像这样在循环中使用 GetPixel 非常慢。使用 DrawImage 方法可以更快地将像素从一个位图复制到另一个位图。
  • @David 我不知道你为什么说依靠图形更快。根据我的经验,速度要慢得多。在这里,您有一个我参与的答案(尽管没有提供解决方案),准确地抱怨图形太慢(并提出了一个更快的解决方案):stackoverflow.com/questions/18083318/…。此外,我还针对执行相同过程的 getpixel/setpixel 代码对 King King 代码进行了快速测试,并且 set/get 代码更快(不是更快,但图片很小)。
  • @David我已经做了进一步的测试,我必须更正我之前的说法:在这种特定情况下(使用King King代码),DrawImage更快;显然,加载/保存图像的事实对其性能有很大影响(而不是在 set/get 中),这就是为什么我的测试结果会因特定条件而有明显差异。
  • 你的imagesRainUrls[i]是string,它不能使用DoubleBitmap,你的imagesRainUrls是一个List&lt;&gt;,所以它也不能使用AppendBitmap。请注意,我将其命名为AppendBitmap 并不意味着您可以使用它来将一些位图附加到您的集合中,它只能用于Bitmap,不能用于其他类型的任何实例。

标签: c# winforms


【解决方案1】:

您可以使用Graphics.FromImage 方法获取Image 的Graphics,然后使用该对象的方法在图像上绘制所有内容:

public static class BitmapExtensions {
  public static Bitmap DoubleBitmap(this Bitmap bm){
     Bitmap bitmap = new Bitmap(bm.Width * 2, bm.Height);
     using(Graphics g = Graphics.FromImage(bitmap)){
       Rectangle rect = new Rectangle(Point.Empty, bm.Size);
       g.DrawImage(bm, rect);
       rect.Offset(bm.Width,0);
       g.DrawImage(bm, rect);
       return bitmap;
     }
  }      
  public static Bitmap AppendBitmap(this Bitmap bm, Bitmap rightBitmap){
    Bitmap bitmap = new Bitmap(bm.Width + rightBitmap.Width, Math.Max(bm.Height, rightBitmap.Height));
    using(Graphics g = Graphics.FromImage(bitmap)){
       Rectangle rect = new Rectangle(Point.Empty, bm.Size);
       g.DrawImage(bm, rect);
       rect = new Rectangle(new Point(bm.Width, 0), rightBitmap.Size);
       g.DrawImage(rightBitmap, rect);           
       return bitmap;
     }
  }
}
//Use it
//Double the same image
Bitmap doubledBitmap = yourBitmap.DoubleBitmap();
//Append new image
Bitmap appendedBitmap = yourBitmap.AppendBitmap(yourSecondBitmap);

【讨论】:

  • 我收到一个错误两个错误,一个在 DoubleBitmap 上,一个在 AppendBitmap 上,两个错误都相同:错误 1 ​​扩展方法必须在顶级静态类中定义; BitmapExtensions 是一个嵌套类。我该如何解决?
  • @user2760148 扩展类应该放在顶级范围内(在某个命名空间下),不要放在任何其他类中。
  • 好的解决了,现在我尝试使用它并得到一些错误。用我如何尝试使用它来更新我的问题。
  • 刚刚更新了我的问题。对不起。
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多