예제 #1
0
        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);
        }
예제 #2
0
        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);
        }