C# 如何从两个图像中创建一个图像?

C# 如何从两个图像中创建一个图像?,c#,winforms,C#,Winforms,我想创造新的形象,这两个将是并排的。 如果我有4张图片,那么制作一张新的图片,里面有4张图片。 不是一个在另一个上面,而是两个图像,一个在另一个附近,或者如果是4个图像,那么每个图像也在另一个附近 到目前为止,我所做的是从两幅图像中提取像素: private void GetPixels(string File1, string File2) { Bitmap bmp1 = new Bitmap(File1); Bitmap bmp

我想创造新的形象,这两个将是并排的。 如果我有4张图片,那么制作一张新的图片,里面有4张图片。 不是一个在另一个上面,而是两个图像,一个在另一个附近,或者如果是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);
                }
            }
        }
private void GetPixels(字符串文件1、字符串文件2)
{
位图bmp1=新位图(文件1);
位图bmp2=新位图(文件2);
对于(int i=0;i
我想创建一个新的位图,它的大小要大到足以存储另外两个位图。 如何计算新位图的正确大小,使其包含其他两个位图

如何将像素添加到新位图中

编辑**

将其添加到名称空间及其ok下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]);
            }
        }
private void CreateNewImage()
{
对于(int i=0;i
imagesRainUrls是图像列表,ImagesAssetLiteUrls也是图像列表

我得到的错误是:

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

错误2实例参数:无法从“字符串”转换为“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:无法从“字符串”转换为“System.Drawing.Bitmap”

而且我在imagesRainUrls列表中有更多的图像,然后是SatelliteUrls列表,那么我如何才能使它合并这两个图像,直到得到SatelliteUrls图像的数量? 雨水图像我有62张,卫星图像只有9张 在这个过程的最后,我将从合并的和未合并的所有gif制作动画gif。因此,动画将是一个gif与前9个图像合并,其余的雨将不会合并,但相同的动画


既然我的雨水图像比卫星图像多,所以我只需要合并9幅图像,那么我如何使用FOR循环呢。

你可以使用
图形。FromImage
方法获取
图像的
图形
,然后使用该对象的方法在图像上绘制所有内容:

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);

注意,像这样在循环中使用GetPixel速度非常慢。使用DrawImage方法可以更快地将像素从一个位图复制到另一个位图。可能是@David的重复我不知道你为什么说依赖图形更快。根据我的经验,这要慢得多。这里有一个我参与的答案(虽然没有提供解决方案),就是抱怨图形太慢(并且提出了一个更快的解决方案):。此外,我还对King King代码与getpixel/setpixel one进行了快速测试,测试过程相同,set/get one速度更快(速度不是太快,但图片很小)。@David我已经做了进一步测试,我必须纠正我之前的说法:在这种特定情况下(使用King King代码),DrawImage速度更快;显然,加载/保存图像的事实对其性能有很大影响(不在set/get中),这就是为什么我的测试结果会因特定条件而发生明显变化的原因。您的
imagesRainUrls[i]
string
,它不能使用
DoubleBitmap
,您的
imagesRainUrls
是一个
列表
,因此它不能同时使用
AppendBitmap
。请注意,我将其命名为
AppendBitmap
,并不意味着您可以使用它将一些位图附加到集合中,它只能用于
位图
,其他类型的任何实例上都没有。我收到一个错误两个错误一个在DoubleBitmap上,一个在AppendBitmap上两个错误都是相同的:错误1扩展方法必须在顶级静态类中定义;BitmapExtensions是一个嵌套类。如何解决?@user2760148扩展类应该放在顶级作用域中(在某个名称空间下),不要放在任何其他类中。好的,现在解决了。我尝试使用它并得到一些错误。正在更新我的问题以及我如何使用它。刚刚更新了我的问题。很抱歉