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

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

C#中Image,Bitmap和BitmapData

2019-11-14 14:07:22
字體:
來源:轉載
供稿:網友

先說Image,Image 就是個圖像,不能實例化,提供了位圖和源文件操作的函數。本篇文章他就是來打醬油的,這里提供一個Bitmap轉成BitmapSource的方法。

 1 [DllImport("gdi32")] 2 static extern int DeleteObject(IntPtr o); 3 /// <summary> 4 /// bitmap轉換為bitmapsource 以適應wpf的image 5 /// </summary> 6 /// <param name="pic"></param> 7 /// <returns></returns> 8 public static BitmapSource GetMapSource(Bitmap pic) 9 {10     IntPtr ip = pic.GetHbitmap();11     BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(12         ip, IntPtr.Zero, Int32Rect.Empty,13         System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());14     DeleteObject(ip);15     return bitmapSource;16 }

接下來說Bitmap和BitmapData。

Bitmap類
Bitmap對象封裝了GDI+中的一個位圖,此位圖由圖形圖像及其屬性的像素數據組成.因此Bitmap是用于處理由像素數據定義的圖像的對象.該類的主要方法和屬性如下:
1. GetPixel方法和SetPixel方法:獲取和設置一個圖像的指定像素的顏色.
2. PixelFormat屬性:返回圖像的像素格式.
3. Palette屬性:獲取和設置圖像所使用的顏色調色板.
4. Height Width屬性:返回圖像的高度和寬度.
5. LockBits方法和UnlockBits方法:分別鎖定和解鎖系統內存中的位圖像素.在基于像素點的圖像處理方法中使用LockBits和UnlockBits是一個很好的方式,這兩種方法可以使我們指定像素的范圍來控制位圖的任意一部分,從而消除了通過循環對位圖的像素逐個進行處理,每調用LockBits之后都應該調用一次UnlockBits.
BitmapData類
BitmapData對象指定了位圖的屬性
1. Height屬性:被鎖定位圖的高度.
2. Width屬性:被鎖定位圖的高度.
3. PixelFormat屬性:數據的實際像素格式.
4. Scan0屬性:被鎖定數組的首字節地址,如果整個圖像被鎖定,則是圖像的第一個字節地址.
5. Stride屬性:步幅,也稱為掃描寬度.

這里要重點說說Stride屬性,這個和Width有什么區別呢,可以這么說,如果你的圖片大小也就是圖片字節是4的整數倍,那么Stride與Width是相等的,否則Stride就是大于Width的最小4的整數倍。在處理過程中,Stride肯定是4的整數倍,這里是個坑啊。。。

                                                       

                          盜張圖,連接寫在文章底部

先看看BitmapData的應用,我的場景是,我有一個一維像素點陣數組,里面放的是每個像素點的灰度值,知道寬和高,要轉換成bitmap

 1 /// <summary> 2 /// 像素點陣轉換為bitmap 3 /// </summary> 4 /// <param name="rawValues">byte[]數組</param> 5 /// <param name="width">圖片的寬度</param> 6 /// <param name="height">圖片的高度</param> 7 /// <returns>bitmap圖片</returns> 8 public static Bitmap ToGrayBitmap(byte[] rawValues, int width, int height) 9 {10     Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);11     BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);12     //// 獲取圖像參數  13     //bmpData.Stride = width;14     int stride = bmpData.Stride;  // 掃描線的寬度  15     int offset = stride - width;  // 顯示寬度與掃描線寬度的間隙  16     IntPtr iptr = bmpData.Scan0;  // 獲取bmpData的內存起始位置  17     int scanBytes = stride * height;// 用stride寬度,表示這是內存區域的大小  18     //// 下面把原始的顯示大小字節數組轉換為內存中實際存放的字節數組  19     int posScan = 0, posReal = 0;// 分別設置兩個位置指針,指向源數組和目標數組  20     byte[] pixelValues = new byte[scanBytes];  //為目標數組分配內存  21     for (int x = 0; x < height; x++)22     {23         //// 下面的循環節是模擬行掃描  24         for (int y = 0; y < width; y++)25         {26             pixelValues[posScan++] = rawValues[posReal++];27         }28         posScan += offset;  //行掃描結束,要將目標位置指針移過那段“間隙”  29     }30     //// 用Marshal的Copy方法,將剛才得到的內存字節數組復制到BitmapData中  31     System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr, scanBytes);32     bmp.UnlockBits(bmpData);  // 解鎖內存區域  33     //// 下面的代碼是為了修改生成位圖的索引表,從偽彩修改為灰度  34     ColorPalette tempPalette;35     using (Bitmap tempBmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format8bppIndexed))36     {37         tempPalette = tempBmp.Palette;38     }39     for (int i = 0; i < 256; i++)40     {41         tempPalette.Entries[i] = System.Drawing.Color.FromArgb(i, i, i);42     }43 44     bmp.Palette = tempPalette;45 46     //// 算法到此結束,返回結果  47     return bmp;48 }

這代碼也是網上找的,具體哪里已經忘記了。至于24位位圖數據其實就是 一個像素點有rgb三個值而已,道理一樣。

同樣,我們也可以根據圖片得到他的灰度數組

 1 //8位位圖得到除去文件頭信息的一位灰度數組 2  3  4 BitmapData bmpData = map.LockBits(new System.Drawing.Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); 5  6 //// 獲取圖像參數   7  8 int stride = bmpData.Stride;  // 掃描線的寬度   9 10 int offset = stride - map.Width;  // 顯示寬度與掃描線寬度的間隙  11 12 IntPtr iptr = bmpData.Scan0;  // 獲取bmpData的內存起始位置  13 14 int scanBytes = stride * map.Height;// 用stride寬度,表示這是內存區域的大小  15 16 //// 下面把原始的顯示大小字節數組轉換為內存中實際存放的字節數組  17 18 mapdata = new byte[scanBytes];  //為目標數組分配內存19 20 System.Runtime.InteropServices.Marshal.Copy(iptr, mapdata, 0, scanBytes); //copy內存中數據到數組中

這里對與bitmapdata的操作方式是ReadOnly

為什么說stride是坑呢,因為在工作中,我有一個大小不為4的整數倍的文件,通過上面方法將他們轉為圖片,然后操作之后我需要存回去,繼續存成文件的形式,如果你直接存回去你會發現你的文件變大了。這時候就需要避開stride。其實stride占據的空間什么都沒有做,我們如何遍歷構建圖片,就如何反遍歷回數組就可以了

public static byte[] GetMapData(byte[] MapData,int width,int height){    var length = MapData.Length;    if(width==length/height)    {        return MapData;    }    int offset=length/height-width;    var scanBytes = width * height;    byte[] RawMapData = new byte[scanBytes];    int posScan = 0, posReal = 0;    for(int x=0;x<height;x++)    {        for (int y=0;y<width;y++)        {            RawMapData[posScan++] = MapData[posReal++];        }        posReal += offset;    }    return RawMapData;}

至于24位位圖轉8位位圖,還是看這位博主的博客,他總結了很多,我還是覺得opencv比較快捷方便。

http://blog.csdn.net/jiangxinyu/article/details/6222302

另外還看到了一下c#處理圖片的方法,比如光照,霧化,浮雕等,請移步下面鏈接

http://www.pin5i.com/showtopic-20228.html

種一棵樹最好的時間是十年前,其次是現在。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91在线高潮白浆在线观看| 91精品视频在线免费观看| 欧美视频一区二区三区…| 国产91色在线|| 国产精品夫妻激情| 成人h视频在线观看播放| 91亚洲精品一区| 久久免费精品日本久久中文字幕| 美女国内精品自产拍在线播放| 97超视频免费观看| 国产欧美一区二区三区在线| 欧美性视频网站| 亚洲影院在线看| 亚洲韩国欧洲国产日产av| 亚洲人成电影网站色www| 日韩黄色av网站| 美女撒尿一区二区三区| 伊人av综合网| 尤物九九久久国产精品的特点| 久久久成人精品| 精品中文字幕在线| 亚洲欧美日韩天堂一区二区| 欧美一区二区三区免费视| 亚洲欧美制服丝袜| 亚洲欧美日韩综合| 91精品国产成人| 91亚洲永久免费精品| 国产区亚洲区欧美区| 国产精品久久久久久超碰| 国产精品爽爽ⅴa在线观看| 日韩大陆毛片av| 91精品国产91久久久久| 国产一区二区三区中文| 日韩一区av在线| 欧美日韩亚洲国产一区| 成人自拍性视频| 成人黄在线观看| 欧美日韩第一页| 国产精品久久电影观看| 国产精品亚洲网站| 欧美床上激情在线观看| 国产精品狠色婷| 日本精品视频网站| 亚洲专区在线视频| 亚洲夜晚福利在线观看| 精品久久久久久久久国产字幕| 日韩久久精品成人| 91久久精品国产91久久| 亚洲人成在线观看| 亚洲天堂一区二区三区| 在线看福利67194| 在线日韩中文字幕| 欧美激情va永久在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 中文字幕亚洲无线码在线一区| 日韩欧美在线视频观看| 国模吧一区二区三区| 一区二区三区视频免费在线观看| 日韩精品在线免费观看视频| 久久亚洲电影天堂| 日韩在线观看免费全集电视剧网站| 亚洲精品视频在线播放| 亚洲乱码国产乱码精品精天堂| 欧美乱大交做爰xxxⅹ性3| 国产精品视频久久久| 国产视频福利一区| 亚洲综合大片69999| 国自产精品手机在线观看视频| 国产亚洲欧美视频| 日韩av电影国产| 欧美一级视频免费在线观看| 亚洲欧美日韩国产中文| 国产成人一区三区| 欧美日韩一区二区三区| 亚洲精品视频二区| 日韩成人久久久| 不卡av日日日| 中文字幕av日韩| 亚洲一区二区久久久久久| 91av在线免费观看视频| 蜜月aⅴ免费一区二区三区| 欧美激情精品久久久久久黑人| 久久精品国产96久久久香蕉| 久久久久久久成人| 97国产真实伦对白精彩视频8| 亚洲美女av在线| 欧美孕妇毛茸茸xxxx| 亚洲一区二区三区sesese| 中文综合在线观看| 国产中文日韩欧美| 日韩av中文字幕在线播放| 精品国产91久久久| 97婷婷涩涩精品一区| 日韩黄色av网站| 成人久久久久久久| 久久视频这里只有精品| 国产va免费精品高清在线| 68精品久久久久久欧美| 亚洲老司机av| 性欧美激情精品| 中文综合在线观看| 欧美在线视频观看免费网站| 精品久久中文字幕久久av| 欧美激情综合亚洲一二区| 2018日韩中文字幕| 国产ts人妖一区二区三区| 国产亚洲欧美日韩精品| 国产欧美精品一区二区三区介绍| 欧美日韩国产成人在线| 国产日韩精品在线观看| 国产精品视频大全| 2019亚洲日韩新视频| 精品亚洲男同gayvideo网站| 亚洲成色999久久网站| 欧美wwwxxxx| 91香蕉嫩草神马影院在线观看| 国产精品福利观看| 国产成人久久久精品一区| 国产精品久久999| 久久久视频精品| 91九色视频导航| 色偷偷亚洲男人天堂| 亚洲精品99999| 亚洲三级 欧美三级| 精品国产91久久久久久| 久久九九全国免费精品观看| 日韩精品视频在线观看网址| 久久久国产精品免费| 日韩欧美高清视频| 日韩精品免费在线| 日韩免费在线电影| 2024亚洲男人天堂| 日韩最新av在线| 亚洲男人天堂网站| 国产精品免费福利| 国产精品r级在线| 欧美肥老妇视频| 亚洲a成v人在线观看| 日韩精品黄色网| 国产精品老女人视频| 日韩视频中文字幕| 欧美精品情趣视频| 精品成人久久av| 亚洲天堂男人的天堂| 精品色蜜蜜精品视频在线观看| 久久精品国产一区二区三区| 97视频在线观看网址| 91亚洲人电影| 欧美伊久线香蕉线新在线| 国内精品视频在线| 亚洲精品网址在线观看| 亚洲第一视频网| 日韩视频―中文字幕| 国产拍精品一二三| 日韩在线免费av| 欧美精品激情blacked18| 亚洲va电影大全| 久久久亚洲网站| 在线日韩精品视频| 欧美激情videoshd| 欧美大尺度激情区在线播放| 欧美亚州一区二区三区| 久久久午夜视频| 欧美有码在线观看|