亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#畫8位彩色圖片(自定義調色板)

2019-11-17 04:20:46
字體:
來源:轉載
供稿:網友

此方法參照msdn上的畫8位灰階gif圖片的方法。
函數1,2為畫自定義彩色圖片方法。
函數3(GetColorPalette)和函數4(SaveGIFWithNewGrayscale)為msdn原方法。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace Em_Picture
{
    class Class2
    {
        public static List<Color> cl;
        //函數1:
        static void DrawPicture()
        {
            Image image = Image.FromFile("加載你的圖片:比如一個總共11色的股票行情走勢圖,其白色為背景色");
            //獲取11色相對應的調色板
            ColorPalette pal = GetColorPalette(11);
            //列出圖片中所包含的顏色
            cl = new List<Color>();
            cl.Add(Color.FromArgb(255, 0,   0,   0  ));
            cl.Add(Color.FromArgb(255, 255, 0,   0  ));
            cl.Add(Color.FromArgb(255, 51,  51,  102));
            cl.Add(Color.FromArgb(255, 102, 102, 102));
            cl.Add(Color.FromArgb(255, 0,   128, 0  ));
            cl.Add(Color.FromArgb(255, 128, 128, 128));
            cl.Add(Color.FromArgb(255, 206, 158, 0  ));
            cl.Add(Color.FromArgb(255, 200, 200, 200));
            cl.Add(Color.FromArgb(255, 206, 206, 206));
            cl.Add(Color.FromArgb(255, 206, 207, 156));
            cl.Add(Color.FromArgb(255, 255, 255, 255));
            //重寫調色板前11色
            for (int i = 0; i < cl.Count; i++)
            {
                pal.Entries[i] = cl[i];
            }
            pal.Entries[10] = Color.FromArgb(0, 255, 255, 255); // 將其alpha值修改為0,可使背景通透
            //調用畫8位彩色圖函數
            SaveGIFWithNewColorTable(image, pal, "你要保存新圖片的位置");
        }
        //函數2:
        public static void SaveGIFWithNewColorTable(Image image, ColorPalette pal, string filename)
        {
            int Width = image.Width;
            int Height = image.Height;
            Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
            bitmap.Palette = pal;
            Bitmap BmpCopy = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
            {
                Graphics g = Graphics.FromImage(BmpCopy);
                g.PageUnit = GraphicsUnit.Pixel;
                g.DrawImage(image, 0, 0, Width, Height);
                g.Dispose();
            }
            BitmapData bitmapData;
            Rectangle rect = new Rectangle(0, 0, Width, Height);
            bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            IntPtr pixels = bitmapData.Scan0;
            BitmapData bmData = BmpCopy.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            unsafe
            {
                byte* pBits;
                if (bitmapData.Stride > 0)
                    pBits = (byte*)pixels.ToPointer();
                else
                    pBits = (byte*)pixels.ToPointer() + bitmapData.Stride * (Height - 1);
                uint stride = (uint)Math.Abs(bitmapData.Stride);
                //
                byte* p = (byte*)bmData.Scan0;
                int offset = bmData.Stride - Width * 4;
                //
                for (uint row = 0; row < Height; ++row)
                {
                    for (uint col = 0; col < Width; ++col)
                    {
                        //取原圖中某個點顏色值
                        Color pixel = Color.FromArgb(p[3], p[2], p[1], p[0]);
                        p += 4;
                        //獲取新圖對應點的指針
                        byte* p8bppPixel = pBits + row * stride + col;
                        //將原圖這個點的顏色所對應的顏色索引值賦給指針
                        *p8bppPixel = (byte)cl.IndexOf(pixel);
                       
                        //===========================================================
                        //其實上面的代碼比較消耗性能,改為如下代碼較好(也可使用switch函數)
                        /*
                        byte b = 0;
                        //判斷的順序為建立顏色表的倒序
                        //因為白色為背景色,絕大多數判斷到這里就會停止
                        if (p[1] == 255) b = 10;      
                        else if (p[1] == 207) b = 9;
                        else if (p[1] == 206) b = 8;
                        else if (p[1] == 200) b = 7;
                        else if (p[1] == 158) b = 6;
                        else if (p[1] == 128 && p[2] == 128) b = 5;
                        else if (p[1] == 128 && p[2] == 0) b = 4;
                        else if (p[1] == 102) b = 3;
                        else if (p[1] == 51) b = 2;
                        else if (p[1] == 0 && p[2] == 225) b = 1;
                        else if (p[1] == 0 && p[2] == 0) b = 0;
                        p += 4;
                        byte* p8bppPixel = pBits + row * stride + col;
                        *p8bppPixel = b;
                        */
                        //===========================================================
                    } /* end loop for col */
                    p += offset;
                } /* end loop for row */
                BmpCopy.UnlockBits(bmData);
            } /* end unsafe */
            bitmap.UnlockBits(bitmapData);
            bitmap.Save(filename, ImageFormat.Gif);
            BmpCopy.Dispose();
            bitmap.Dispose();
        }

        //函數3:獲取顏色個數相對應的調色板 
        public static ColorPalette GetColorPalette(uint nColors)
        {
            // Assume monoChrome image.
            PixelFormat bitscolordepth = PixelFormat.Format1bppIndexed;
            ColorPalette palette;       // The Palette we are stealing
            Bitmap bitmap;              // The source of the stolen palette
            // Determine number of colors.
            if (nColors > 2)
                bitscolordepth = PixelFormat.Format4bppIndexed;
            if (nColors > 16)
                bitscolordepth = PixelFormat.Format8bppIndexed;
            // Make a new Bitmap object to get its Palette.
            bitmap = new Bitmap(1, 1, bitscolordepth);
            palette = bitmap.Palette;   // Grab the palette
            bitmap.Dispose();           // cleanup the source Bitmap
            return palette;             // Send the palette back
        }
        //函數4:畫8位灰階gif圖    
        public static void SaveGIFWithNewGrayscale(Image image, string filename, uint nColors, bool fTransparent)
        {
            if (nColors > 256)
                nColors = 256;
            if (nColors < 2)
                nColors = 2;
            int Width = image.Width;
            int Height = image.Height;
            Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
            ColorPalette pal = GetColorPalette(nColors);
            for (uint i = 0; i < nColors; i++)
            {
                uint Alpha = 0xFF;                              // Colors are opaque.
                uint Intensity = i * 0xFF / (nColors - 1);      // Even distribution.
                if (i == 0 && fTransparent)                     // Make this color index
                    Alpha = 0;                                  // Transparent
                pal.Entries[i] = Color.FromArgb((int)Alpha, (int)Intensity, (int)Intensity, (int)Intensity);
            }
            bitmap.Palette = pal;
            Bitmap BmpCopy = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
            {
                Graphics g = Graphics.FromImage(BmpCopy);
                g.PageUnit = GraphicsUnit.Pixel;
                g.DrawImage(image, 0, 0, Width, Height);
                g.Dispose();
            }
            BitmapData bitmapData;
            Rectangle rect = new Rectangle(0, 0, Width, Height);
            bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            IntPtr pixels = bitmapData.Scan0;
            unsafe
            {
                byte* pBits;
                if (bitmapData.Stride > 0)
                    pBits = (byte*)pixels.ToPointer();
                else
                    pBits = (byte*)pixels.ToPointer() + bitmapData.Stride * (Height - 1);
                uint stride = (uint)Math.Abs(bitmapData.Stride);
                for (uint row = 0; row < Height; ++row)
                {
                    for (uint col = 0; col < Width; ++col)
                    {
                        Color pixel;        // The source pixel.
                        byte* p8bppPixel = pBits + row * stride + col;
                        pixel = BmpCopy.GetPixel((int)col, (int)row);
                        double luminance = (pixel.R * 0.299) + (pixel.G * 0.587) + (pixel.B * 0.114);
                        *p8bppPixel = (byte)(luminance * (nColors - 1) / 255 + 0.5);
                    } /* end loop for col */
                } /* end loop for row */
            } /* end unsafe */
            bitmap.UnlockBits(bitmapData);
            bitmap.Save(filename, ImageFormat.Gif);
            BmpCopy.Dispose();
            bitmap.Dispose();
        }
    }
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品女同一区二区三区在线播放| 少妇高潮 亚洲精品| 国产精品露脸自拍| 日韩在线观看你懂的| www.午夜精品| 日韩有码在线电影| 欧美日韩亚洲高清| 丝袜美腿精品国产二区| 欧美日韩国产色| 97香蕉久久夜色精品国产| 亚洲综合中文字幕68页| 亚洲精品自产拍| 麻豆国产va免费精品高清在线| 欧美巨猛xxxx猛交黑人97人| 亚洲精品suv精品一区二区| 国产精品www网站| 欧美在线中文字幕| 91久久久国产精品| 亚洲精品按摩视频| 欧美黑人性生活视频| 亚洲国产精品久久91精品| 亚洲最大福利网站| 久久久精品美女| 久久色精品视频| 久久精品夜夜夜夜夜久久| 亚洲成人免费在线视频| 一区二区三区国产视频| 国产一区二区色| 欧美成人亚洲成人日韩成人| 国产精品国产亚洲伊人久久| 中日韩午夜理伦电影免费| 日韩最新av在线| 亚洲人成在线电影| 911国产网站尤物在线观看| 亚洲精品久久久久| 韩日精品中文字幕| 上原亚衣av一区二区三区| 欧美性高潮床叫视频| 欧美精品videos| 久久久久免费视频| 亚洲视频第一页| 成人欧美一区二区三区黑人孕妇| 欧美性猛交xxxx黑人猛交| 日韩欧美在线观看视频| 欧美亚洲另类视频| 国产日韩在线看| 欧美人在线观看| 97碰碰碰免费色视频| 日韩中文理论片| 97精品一区二区视频在线观看| 欧美日本高清视频| 国产精品91在线| 亚洲аv电影天堂网| 成人综合国产精品| 最近中文字幕日韩精品| 成人免费在线视频网址| 久久伊人91精品综合网站| 亚洲高清久久久久久| 久久精品国产亚洲| 亚洲国产天堂久久国产91| 午夜精品蜜臀一区二区三区免费| 精品亚洲国产视频| 中文日韩电影网站| 中文字幕亚洲欧美| 久久久久久噜噜噜久久久精品| 伊人一区二区三区久久精品| 91麻豆国产精品| 97成人在线视频| 欧美日韩国产精品一区| 国产精品视频地址| 久久久久北条麻妃免费看| 国产亚洲精品91在线| 成人欧美一区二区三区黑人| 亚洲成人精品久久| 69影院欧美专区视频| 亚洲福利视频专区| 狠狠操狠狠色综合网| 亚洲xxxxx电影| 97成人精品区在线播放| 国产精品久久久久免费a∨大胸| 日韩经典中文字幕在线观看| 6080yy精品一区二区三区| 91免费欧美精品| 成人国内精品久久久久一区| 91精品国产色综合久久不卡98口| 97精品国产97久久久久久免费| 中文字幕成人精品久久不卡| 亚洲在线免费观看| 91po在线观看91精品国产性色| 国产有码在线一区二区视频| 亚洲欧美制服中文字幕| 色老头一区二区三区在线观看| 午夜精品在线视频| 中文字幕日韩有码| 韩国三级电影久久久久久| 久久精品国产精品亚洲| 亚洲图片在区色| 欧美大肥婆大肥bbbbb| 性欧美xxxx| 国产精品一区二区3区| 久久这里只有精品99| 中文在线资源观看视频网站免费不卡| 国产一区在线播放| 久久免费少妇高潮久久精品99| 亚洲综合大片69999| 在线免费看av不卡| 欧美日韩亚洲一区二区三区| 亚洲精品成人网| 亚洲欧美国产精品va在线观看| 日韩欧美第一页| 国产91精品不卡视频| 51精品国产黑色丝袜高跟鞋| 欧美性69xxxx肥| 97视频在线观看视频免费视频| 日韩中文字幕不卡视频| 欧美日韩日本国产| 亚洲欧洲日韩国产| 欧美日韩成人在线观看| 亚洲人成电影网站色www| 性色av一区二区咪爱| 91欧美精品午夜性色福利在线| 久久久久久久爱| 久久久av亚洲男天堂| 国产精品久久久久高潮| 日韩国产中文字幕| 91免费精品国偷自产在线| 中文字幕欧美视频在线| 黑人与娇小精品av专区| 欧美精品久久久久久久久久| 亚洲影院色无极综合| 亚洲裸体xxxx| 国产精品爽黄69天堂a| 国产欧美日韩91| 亚洲欧洲成视频免费观看| 亚洲色在线视频| 国产z一区二区三区| 日韩在线一区二区三区免费视频| 亚洲国产欧美自拍| 国产精品丝袜一区二区三区| 久久久视频免费观看| 欧美不卡视频一区发布| 欧美性生活大片免费观看网址| 在线观看欧美日韩国产| 日韩欧美有码在线| 欧美日韩一区二区免费在线观看| 精品动漫一区二区| 最新亚洲国产精品| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲人成网站777色婷婷| 92福利视频午夜1000合集在线观看| 国产成人精品久久亚洲高清不卡| 国产精品成人国产乱一区| 久久精品影视伊人网| 欧美日韩国产综合新一区| 欧美日本啪啪无遮挡网站| 92福利视频午夜1000合集在线观看| 色爱精品视频一区| 91av在线网站| 国产精品美女主播| www.久久久久久.com| 2018中文字幕一区二区三区| 91久久综合亚洲鲁鲁五月天| 国内精品在线一区| 俺去啦;欧美日韩|