示例#1
0
        /// <summary>
        /// Aggregates lower level image tiles to construct upper level tiles.
        /// </summary>
        /// <param name="level">
        /// Zoom level.
        /// </param>
        /// <param name="tileX">
        /// X coordinate.
        /// </param>
        /// <param name="tileY">
        /// Y coordinate.
        /// </param>
        /// <param name="tileSerializer">
        /// Serializer to invoke in order to persist the bitmap image.
        /// </param>
        public static void CreateParent(int level, int tileX, int tileY, IImageTileSerializer tileSerializer)
        {
            if (tileSerializer == null)
            {
                throw new ArgumentNullException("tileSerializer");
            }

            int level1 = checked (level + 1);
            int x1     = checked (2 * tileX);
            int y1     = checked (2 * tileY);

            using (Bitmap bmp = new Bitmap(2 * Constants.TileSize, 2 * Constants.TileSize))
                using (Graphics g = Graphics.FromImage(bmp))
                    using (Bitmap b00 = tileSerializer.Deserialize(level1, x1, y1))
                        using (Bitmap b10 = tileSerializer.Deserialize(level1, x1 + 1, y1))
                            using (Bitmap b01 = tileSerializer.Deserialize(level1, x1, y1 + 1))
                                using (Bitmap b11 = tileSerializer.Deserialize(level1, x1 + 1, y1 + 1))
                                {
                                    // Default is to display color indicating no data.
                                    g.Clear(Color.Transparent);

                                    // Draw each quadrant keeping track of number of quadrants actually drawn.
                                    short drawn = 0;
                                    if (b00 != null)
                                    {
                                        g.DrawImage(b00, 0, 0);
                                        drawn++;
                                    }

                                    if (b01 != null)
                                    {
                                        g.DrawImage(b01, 0, Constants.TileSize);
                                        drawn++;
                                    }

                                    if (b10 != null)
                                    {
                                        g.DrawImage(b10, Constants.TileSize, 0);
                                        drawn++;
                                    }

                                    if (b11 != null)
                                    {
                                        g.DrawImage(b11, Constants.TileSize, Constants.TileSize);
                                        drawn++;
                                    }

                                    // If we actually have data, shrink the tile and save it.
                                    if (drawn > 0)
                                    {
                                        using (Bitmap b = ResizeBitmap(bmp, Constants.TileSize, Constants.TileSize))
                                        {
                                            tileSerializer.Serialize(b, level, tileX, tileY);
                                        }
                                    }
                                }
        }
示例#2
0
        public static void ToBitmap(int level, int tileX, int tileY, int[] values, IImageTileSerializer serializer, IImageTileSerializer referenceImageSerializer)
        {
            byte[] referenceImage = null;
            using (Bitmap image = new Bitmap(Constants.TileSize, Constants.TileSize, PixelFormat.Format32bppArgb))
            {
                // Set the data row by row
                Rectangle  dimension = new Rectangle(0, 0, Constants.TileSize, Constants.TileSize);
                BitmapData imageData = image.LockBits(dimension, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                byte[]     rgb       = new byte[imageData.Stride];
                int        position  = -1;

                if (referenceImageSerializer != null)
                {
                    referenceImage = TileHelper.BitmapToBytes(referenceImageSerializer.Deserialize(level, tileX, tileY));
                }

                for (int pixelY = 0; pixelY < Constants.TileSize; pixelY++)
                {
                    Array.Clear(rgb, 0, rgb.Length);
                    int   pos            = 0;
                    Color referenceColor = Color.White;
                    for (int pixelX = 0; pixelX < Constants.TileSize; pixelX++)
                    {
                        Color color = Color.Transparent;
                        position++;
                        if (referenceImage != null)
                        {
                            if (referenceImage != null &&
                                referenceImage[(position * 4)] == referenceColor.B &&
                                referenceImage[(position * 4) + 1] == referenceColor.G &&
                                referenceImage[(position * 4) + 2] == referenceColor.R)
                            {
                                if (values != null)
                                {
                                    color = Color.FromArgb(values[position]);
                                }
                            }
                        }
                        else
                        {
                            if (values != null)
                            {
                                color = Color.FromArgb(values[position]);
                            }
                        }

                        rgb[pos++] = color.B;
                        rgb[pos++] = color.G;
                        rgb[pos++] = color.R;
                        rgb[pos++] = color.A;
                    }

                    IntPtr p = new IntPtr(imageData.Scan0.ToInt64() + (pixelY * imageData.Stride));
                    System.Runtime.InteropServices.Marshal.Copy(rgb, 0, p, rgb.Length);
                }

                image.UnlockBits(imageData);
                if (serializer != null)
                {
                    serializer.Serialize(image, level, tileX, tileY);
                }

                imageData = null;
                rgb       = null;
            }
        }
示例#3
0
        public static void ToBitmap(int level, int tileX, int tileY, int[] values, IImageTileSerializer serializer, IImageTileSerializer referenceImageSerializer)
        {
            byte[] referenceImage = null;
            using (Bitmap image = new Bitmap(Constants.TileSize, Constants.TileSize, PixelFormat.Format32bppArgb))
            {
                // Set the data row by row
                Rectangle dimension = new Rectangle(0, 0, Constants.TileSize, Constants.TileSize);
                BitmapData imageData = image.LockBits(dimension, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                byte[] rgb = new byte[imageData.Stride];
                int position = -1;

                if (referenceImageSerializer != null)
                {
                    referenceImage = TileHelper.BitmapToBytes(referenceImageSerializer.Deserialize(level, tileX, tileY));
                }

                for (int pixelY = 0; pixelY < Constants.TileSize; pixelY++)
                {
                    Array.Clear(rgb, 0, rgb.Length);
                    int pos = 0;
                    Color referenceColor = Color.White;
                    for (int pixelX = 0; pixelX < Constants.TileSize; pixelX++)
                    {
                        Color color = Color.Transparent;
                        position++;
                        if (referenceImage != null)
                        {
                            if (referenceImage != null &&
                               referenceImage[(position * 4)] == referenceColor.B &&
                               referenceImage[(position * 4) + 1] == referenceColor.G &&
                               referenceImage[(position * 4) + 2] == referenceColor.R)
                            {
                                if (values != null)
                                {
                                    color = Color.FromArgb(values[position]);
                                }
                            }
                        }
                        else
                        {
                            if (values != null)
                            {
                                color = Color.FromArgb(values[position]);
                            }
                        }

                        rgb[pos++] = color.B;
                        rgb[pos++] = color.G;
                        rgb[pos++] = color.R;
                        rgb[pos++] = color.A;
                    }

                    IntPtr p = new IntPtr(imageData.Scan0.ToInt64() + (pixelY * imageData.Stride));
                    System.Runtime.InteropServices.Marshal.Copy(rgb, 0, p, rgb.Length);
                }

                image.UnlockBits(imageData);
                if (serializer != null)
                {
                    serializer.Serialize(image, level, tileX, tileY);
                }

                imageData = null;
                rgb = null;
            }
        }
示例#4
0
        /// <summary>
        /// Aggregates lower level image tiles to construct upper level tiles.
        /// </summary>
        /// <param name="level">
        /// Zoom level.
        /// </param>
        /// <param name="tileX">
        /// X coordinate.
        /// </param>
        /// <param name="tileY">
        /// Y coordinate.
        /// </param>
        /// <param name="tileSerializer">
        /// Serializer to invoke in order to persist the bitmap image.
        /// </param>
        public static void CreateParent(int level, int tileX, int tileY, IImageTileSerializer tileSerializer)
        {
            if (tileSerializer == null)
            {
                throw new ArgumentNullException("tileSerializer");
            }

            int level1 = checked(level + 1);
            int x1 = checked(2 * tileX);
            int y1 = checked(2 * tileY);
            using (Bitmap bmp = new Bitmap(2 * Constants.TileSize, 2 * Constants.TileSize))
            using (Graphics g = Graphics.FromImage(bmp))
            using (Bitmap b00 = tileSerializer.Deserialize(level1, x1, y1))
            using (Bitmap b10 = tileSerializer.Deserialize(level1, x1 + 1, y1))
            using (Bitmap b01 = tileSerializer.Deserialize(level1, x1, y1 + 1))
            using (Bitmap b11 = tileSerializer.Deserialize(level1, x1 + 1, y1 + 1))
            {
                // Default is to display color indicating no data.
                g.Clear(Color.Transparent);

                // Draw each quadrant keeping track of number of quadrants actually drawn.
                short drawn = 0;
                if (b00 != null)
                {
                    g.DrawImage(b00, 0, 0);
                    drawn++;
                }

                if (b01 != null)
                {
                    g.DrawImage(b01, 0, Constants.TileSize);
                    drawn++;
                }

                if (b10 != null)
                {
                    g.DrawImage(b10, Constants.TileSize, 0);
                    drawn++;
                }

                if (b11 != null)
                {
                    g.DrawImage(b11, Constants.TileSize, Constants.TileSize);
                    drawn++;
                }

                // If we actually have data, shrink the tile and save it.
                if (drawn > 0)
                {
                    using (Bitmap b = ResizeBitmap(bmp, Constants.TileSize, Constants.TileSize))
                    {
                        tileSerializer.Serialize(b, level, tileX, tileY);
                    }
                }
            }
        }