C# 我有任意数量的列表,如何将它们压缩在一起?

C# 我有任意数量的列表,如何将它们压缩在一起?,c#,image,list,C#,Image,List,我有一些列表,表示一些图像的像素值,每个列表由0和1组成。我的问题是如何得到所有元素编号为零的平均值,并将其表示在同一元素编号的新列表中,然后对所有其他元素重复该过程?(获取编号为0、1、2和…)的所有元素的平均值。因此,最终列表的长度应与所有其他列表的长度相同,而每个元素是所有其他列表的平均值。伪代码: averageImage = new image(size of source image) for each image in list: for each pixel in ima

我有一些列表,表示一些图像的像素值,每个列表由0和1组成。我的问题是如何得到所有元素编号为零的平均值,并将其表示在同一元素编号的新列表中,然后对所有其他元素重复该过程?(获取编号为0、1、2和…)的所有元素的平均值。因此,最终列表的长度应与所有其他列表的长度相同,而每个元素是所有其他列表的平均值。

伪代码:

averageImage = new image(size of source image)

for each image in list:
   for each pixel in image:
      add pixel to averageImage

averageImage = averageImage / numberOfSourceImages
我写了这篇文章,但重新阅读了你的问题,发现它可能不符合你的要求。

尽管如此,它还是需要任意数量的
位图
,并平均它们的颜色。只需给它输入一个
列表
,然后调用
ToBitmap()

公共类位图平均值{
私有只读列表(BMP);
公共位图平均值(列出BMP){
_bmps=bmps;
}
私有结构颜色平均值{
公共int A{get;set;}
公共int R{get;set;}
公共int G{get;set;}
公共int B{get;set;}
}
私有位图_averageImages(){
var colors=new ColorAverage[_bmps.First().Width,_bmps.First().Height];
foreach(var bmp in_bmps){
对于(var x=0;x
++=


此处的全尺寸图像:

如果将所有图像相加,然后除以图像数量,那么“平均图像”中的值将完全符合您的要求-如果我理解您的要求。哪一点你不知道该怎么做;但是我怎样才能把图像加在一起得到它们的平均值呢?我怎样才能把图像一个像素一个像素地加在一起呢?你是想把它们的颜色平均起来还是别的什么?事实上,您的书面描述和代码在意图上并不完全匹配,我只看到一个列表,而不是任意数量的列表,我也没有看到任何试图压缩代码中任何内容的尝试。我不明白你在问什么。谢谢你的评论。请你对你的密码再解释一下好吗?如何将列表添加到一起?源图像的大小应该是多少?这是像素数吗?不,这不是C#-这是“伪代码”(正如我在回答中所说)-这是“不是实际的代码,而是描述您必须采取的步骤的一种方式”。我希望你能从这里找到答案。我真的没有时间写确切的代码——我想这就足够了。也许这会激励其他人写出更完整的答案。
public class BitmapAverage {
  private readonly List<Bitmap> _bmps;

  public BitmapAverage(List<Bitmap> bmps) {
    _bmps = bmps;
  }

  private struct ColorAverage {
    public int A { get; set; }
    public int R { get; set; }
    public int G { get; set; }
    public int B { get; set; }
  }

  private Bitmap _averageImages() {
    var colors = new ColorAverage[_bmps.First().Width, _bmps.First().Height];
    foreach (var bmp in _bmps) {
      for (var x = 0; x < bmp.Width; x++) {
        for (var y = 0; y < bmp.Height; y++) {
          var color = bmp.GetPixel(x, y);
          colors[x, y].A += color.A;
          colors[x, y].R += color.R;
          colors[x, y].G += color.G;
          colors[x, y].B += color.B;
        }
      }
    }
    return _toBitmap(colors);
  }

  private Bitmap _toBitmap(ColorAverage[,] colors) {
    var bitmapToReturn = new Bitmap(_bmps[0].Width, _bmps[0].Height, _bmps[0].PixelFormat);
    for (var x = 0; x < colors.GetLength(0); x++) {
      for (var y = 0; y < colors.GetLength(1); y++) {
        bitmapToReturn.SetPixel(x, y, Color.FromArgb(colors[x,y].A / _bmps.Count, 
                                                     colors[x,y].R / _bmps.Count, 
                                                     colors[x,y].G / _bmps.Count, 
                                                     colors[x,y].B / _bmps.Count)
        );
      }
    }
    return bitmapToReturn;
  }

  public Bitmap ToBitmap() {
    return _averageImages();
  }
}