public static SortedList <int, ColRangeOfRow> ComputeColRanges(int[] aoi, Size size) { SortedList <int, ColRangeOfRow> rowRanges = new SortedList <int, ColRangeOfRow>(); ColRangeOfRow range = null; int nCount = aoi.Length; int row = 0, col = 0, width = size.Width; for (int i = 0; i < nCount; i++) { row = aoi[i] / width; col = aoi[i] % width; if (rowRanges.ContainsKey(row)) { range = rowRanges[row]; range.BeginCol = Math.Min(range.BeginCol, col); range.EndCol = Math.Max(range.EndCol, col); } else { range = new ColRangeOfRow(row, col, col); rowRanges.Add(row, range); } } return(rowRanges); }
public static int[] Scale(int[] aoi, Size size, Size newSize) { if (aoi == null || aoi.Length == 1 || size.IsEmpty || newSize.IsEmpty) { return(null); } int nCount = aoi.Length; int row = 0; int col = 0; int width = size.Width; float scaleX = newSize.Width / (float)size.Width; float scaleY = newSize.Height / (float)size.Height; SortedList <int, ColRangeOfRow> rowRanges = new SortedList <int, ColRangeOfRow>(); ColRangeOfRow range = null; for (int i = 0; i < nCount; i++) { row = (int)(scaleY * (aoi[i] / width)); col = (int)(scaleX * (aoi[i] % width)); if (rowRanges.ContainsKey(row)) { range = rowRanges[row]; range.BeginCol = Math.Min(range.BeginCol, col); range.EndCol = Math.Max(range.EndCol, col); } else { range = new ColRangeOfRow(row, col, col); rowRanges.Add(row, range); } } //插值 ColRangeOfRow[] rows = rowRanges.Values.ToArray(); if (rows.Length == 0) { return(null); } ColRangeOfRow crtRow = null; ColRangeOfRow nxtRow = null; int bColOffsetSpan = 0; int eColOffsetSpan = 0; List <int> retAOIs = new List <int>(); int newWidth = newSize.Width; int bCol = 0; int eCol = 0; for (int i = 0; i < rows.Length - 1; i++) { crtRow = rows[i]; nxtRow = rows[i + 1]; bColOffsetSpan = (nxtRow.BeginCol - crtRow.BeginCol) / (nxtRow.Row - crtRow.Row); eColOffsetSpan = (nxtRow.EndCol - crtRow.EndCol) / (nxtRow.Row - crtRow.Row); bCol = crtRow.BeginCol; eCol = crtRow.EndCol; for (int r = crtRow.Row; r < nxtRow.Row; r++, bCol += bColOffsetSpan, eCol += eColOffsetSpan) { for (int c = bCol; c < eCol; c++) { retAOIs.Add(r * newWidth + c); } } } //最后一行 crtRow = rows[rows.Length - 1]; int lastRow = crtRow.Row; bCol = crtRow.BeginCol; eCol = crtRow.EndCol; for (int c = bCol; c <= eCol; c++) { retAOIs.Add(lastRow * newWidth + c); } // return(retAOIs.Count > 0 ? retAOIs.ToArray() : null); }