예제 #1
0
        public override Bitmap GetCroppedImage(float aScale, UpdateInfoBoxTimeDelegate aFunct = null)
        {
            DateTime dtStart = DateTime.Now;
            Rectangle rect = GetSourceRectangle(aScale);
            Bitmap result;
            Rectangle resultRect = GetDestinationRectangle(aScale, rect);
            //Rectangle resultRect = new Rectangle(0, 0, (int)Math.Round(srcBmpWidth * aScale), (int)Math.Round(srcBmpHeight * aScale));

            //finalna bitmapa o odpowiednim rozmiarze
            result = new Bitmap(3 * panelSize.Width, 3 * panelSize.Height);
            Graphics graphics = Graphics.FromImage(result);
            //Brush h = new Brush();
            //Pen localPen = new Pen(new Brush() );

            Vector_Rectangle[][] vectArr = mapFactory.vectArr;
            aFunct("  Faza1", false, dtStart);
            //rysowanie rectangli odzwierciedlających pixele wzorcowego obrazka
            if (!settings.Polygons() || aScale == 1)
            {
                //będziemy poruszać się po ustalonym wycinku wzorcowego obrazu
                for (int x = 0; x < rect.Width; x++)
                {
                    for (int y = 0; y < rect.Height; y++)
                    {
                        int sourceX = x + rect.X;
                        int sourceY = y + rect.Y;
                        graphics.FillRectangle(new SolidBrush(vectArr[sourceX][sourceY].color), (x) * aScale + resultRect.X, (y) * aScale + resultRect.Y, aScale, aScale);
                        if (settings.Edges() && aScale >= 4)
                            graphics.DrawRectangle(new Pen(Color.Red), (x) * aScale + resultRect.X, (y) * aScale + resultRect.Y, aScale, aScale);
                        //graphics.DrawRectangle(localPen, x/**aScale*/, y/**aScale*/, /*aScale, aScale*/ 100, 100);
                        //result.SetPixel(x + resultRect.X, y + resultRect.Y, vectArr[x][y].color);
                        /*for (int xScale = 0; xScale < aScale; xScale++)
                        {
                            for (int yScale = 0; yScale < aScale; yScale++)
                            {
                                result.SetPixel(x + resultRect.X, y + resultRect.Y, vectArr[x][y].color);
                            }
                        }   */
                    }
                }
            }
            //rysowanie polygonów
            else
            {
                Color tmpColor = new Color();
                int tmpLineR;
                int tmpLineG;
                int tmpLineB;
                int tmpPointR;
                int tmpPointG;
                int tmpPointB;
                int tmpPointBorderR;
                int tmpPointBorderG;
                int tmpPointBorderB;

                Boolean[][] usedArray = new Boolean[rect.Width + rect.X][];
                for (int i = 0; i < rect.Width + rect.X; i++)
                {
                    usedArray[i] = new Boolean[rect.Height + rect.Y];
                    for (int j = 0; j < rect.Height; j++)
                    {
                        usedArray[i][j] = false;
                    }

                }

                //będziemy poruszać się po ustalonym wycinku wzorcowego obrazu
                for (int x = 0; x < rect.Width; x++)
                {
                    for (int y = 0; y < rect.Height; y++)
                    {
                        int sourceX = x + rect.X;
                        int sourceY = y + rect.Y;

                        VectoredRectangleGroup group = mapFactory.GetGroupByXY(sourceX, sourceY, usedArray);

                        //foreach (VectoredRectangleGroup group in mapFactory.Values)
                        if(group != null)
                        {
                            PointAdv[] granica;
                            if (settings.ShowSimplifiedEdge())
                            {
                                Debug.Assert(group.pointAdvMapFromSimplifiedEdge != null,
                                             "Tablica pointArrFromSimplifiedEdge nie została zainicjalizowana.");
                                Debug.Assert(group.pointAdvMapFromSimplifiedEdge.Length != 0,
                                             "Tablica pointArrFromSimplifiedEdge jest pusta.");
                                granica = group.GetScaledPointArrFromSimplifiedEdge(aScale,
                                                                                            resultRect.X - rect.X * aScale,
                                                                                            resultRect.Y - rect.Y * aScale);
                            }
                            else
                            {
                                Debug.Assert(group.pointAdvMapFromFullEdge != null,
                                             "Tablica pointArrFromFullEdge nie została zainicjalizowana.");
                                Debug.Assert(group.pointAdvMapFromFullEdge.Length != 0,
                                             "Tablica pointArrFromFullEdge jest pusta.");
                                granica = group.GetScaledPointArrFromFullEdge(aScale,
                                                                                      resultRect.X - rect.X * aScale,
                                                                                      resultRect.Y - rect.Y * aScale);

                            }

                            Point[] pointArr = GetPointArr(granica);
                            if (pointArr.Count() < 2)
                                continue;
                            graphics.FillPolygon(new SolidBrush(group.sourceColor), pointArr);
                            if (settings.Edges())
                            {
                                if (!settings.TestColor())
                                {
                                    Math.DivRem(group.sourceColor.R + 50, 256, out tmpLineR);
                                    Math.DivRem(group.sourceColor.G + 50, 256, out tmpLineG);
                                    Math.DivRem(group.sourceColor.B + 50, 256, out tmpLineB);

                                    Math.DivRem(2 * group.sourceColor.R, 256, out tmpPointR);
                                    Math.DivRem(2 * group.sourceColor.G, 256, out tmpPointG);
                                    Math.DivRem(2 * group.sourceColor.B, 256, out tmpPointB);

                                    Math.DivRem(2 * group.sourceColor.R + 150, 256, out tmpPointBorderR);
                                    Math.DivRem(2 * group.sourceColor.G + 150, 256, out tmpPointBorderG);
                                    Math.DivRem(2 * group.sourceColor.B + 150, 256, out tmpPointBorderB);
                                }
                                else
                                {
                                    tmpLineR = 255;
                                    tmpLineG = 0;
                                    tmpLineB = 0;
                                    tmpPointR = 100;
                                    tmpPointG = 255;
                                    tmpPointB = 255;
                                    tmpPointBorderR = 100;
                                    tmpPointBorderG = 255;
                                    tmpPointBorderB = 255;
                                }

                                graphics.DrawPolygon(new Pen(Color.FromArgb(tmpLineR, tmpLineG, tmpLineB)), pointArr);
                                foreach (PointAdv p in granica)
                                {
                                    //graphics.DrawLine(new Pen(Color.Blue), p, p);
                                    if (p.X < result.Width && p.Y < result.Height && p.X > 0 && p.Y > 0)
                                        if (p.GetKdPointType() == Cst.c_geoPxSimple)
                                            result.SetPixel(p.X, p.Y, Color.FromArgb(tmpPointR, tmpPointG, tmpPointB));
                                        else
                                            result.SetPixel(p.X, p.Y, Color.FromArgb(tmpPointBorderR, tmpPointBorderG, tmpPointBorderB));
                                }
                            }
                            //group.edgeList
                        }
                    }
                }
            }

                /*
                //ustawia, że result będzie płótnem graphics
                Graphics graphics = Graphics.FromImage(result);
                //ustawia sposób zmiękczania przy powiększaniu - NN da brak zmiękczania
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
                //przepisze źródło na cel odpowiednio skalująć. W tym przypadku źódło i cel to result
                //nowy obszar jest większy od startego więc nastąpi rozciągnięcie pixeli zgodnie z InterpolationMode

                graphics.DrawImage(srcBmp,
                                    resultRect, //nowy obszar
                                    rect, //originalny obszar
                                    System.Drawing.GraphicsUnit.Pixel);*/

                return result;
        }
예제 #2
0
 public abstract Bitmap GetCroppedImage(float aScale, UpdateInfoBoxTimeDelegate aFunct = null);
예제 #3
0
        public override Bitmap GetCroppedImage(float aScale, UpdateInfoBoxTimeDelegate aFunct = null)
        {
            Rectangle rect = GetSourceRectangle(aScale);
            Bitmap result;
            Rectangle resultRect = GetDestinationRectangle(aScale, rect);

            //finalna bitmapa o odpowiednim rozmiarze
            result = new Bitmap(3 * panelSize.Width, 3 * panelSize.Height);
            //ustawia, że result będzie płótnem graphics
            Graphics graphics = Graphics.FromImage(result);
            //ustawia sposób zmiękczania przy powiększaniu - NN da brak zmiękczania
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            //przepisze źródło na cel odpowiednio skalująć. W tym przypadku źódło i cel to result
            //nowy obszar jest większy od startego więc nastąpi rozciągnięcie pixeli zgodnie z InterpolationMode
            graphics.DrawImage(srcBmp,
                                resultRect, //nowy obszar
                                rect, //originalny obszar
                                System.Drawing.GraphicsUnit.Pixel);

            return result;
        }