示例#1
0
文件: Drawing.cs 项目: cvogt/AlbLib
        /// <summary>
        /// Draws bitmap.
        /// </summary>
        /// <param name="data">
        /// Image pixel data.
        /// </param>
        /// <param name="width">
        /// Output image width.
        /// </param>
        /// <param name="height">
        /// Output image height.
        /// </param>
        /// <param name="options">
        /// More rendering options.
        /// </param>
        /// <returns>
        /// Drawn bitmap.
        /// </returns>
        public static Bitmap DrawBitmap(byte[] data, int width, int height, RenderOptions options)
        {
            ImagePalette palette = options.Palette;
            Bitmap       bmp     = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
            ColorPalette pal     = bmp.Palette;

            palette.CopyTo(pal.Entries, 0);
            if (options.TransparentIndex >= 0)
            {
                pal.Entries[options.TransparentIndex] = Color.Transparent;
            }
            bmp.Palette = pal;
            BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

            if (data.Length == 0)
            {
            }
            else if (width % 4 == 0)
            {
                Marshal.Copy(data, 0, bmpdata.Scan0, Math.Min(bmpdata.Stride * bmpdata.Height, data.Length));
            }
            else
            {
                for (int y = 0; y < height; y++)
                {
                    if (width * y < data.Length)
                    {
                        Marshal.Copy(data, width * y, bmpdata.Scan0 + bmpdata.Stride * y, Math.Min(width, data.Length - width * y));
                    }
                    else
                    {
                        break;
                    }

                    /*if(y == height-1)
                     * {
                     *      Marshal.Copy(data, width*y, bmpdata.Scan0+bmpdata.Stride*y, Math.Min(width, data.Length-width*y));
                     * }else{
                     *      Marshal.Copy(data, width*y, bmpdata.Scan0+bmpdata.Stride*y, width);
                     * }*/
                }
            }
            bmp.UnlockBits(bmpdata);
            return(bmp);
        }