日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理中的跨度(stride)

發布時間:2025/7/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理中的跨度(stride) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:圖像處理中的跨度(stride)

使用C#的BitmapData

最近要轉開發平臺,正研究C#。C#好是好,不過處理圖片時一個像素一個像素的操作像素不是一般的慢。其實Delphi也一樣,但好在Delphi的Bitmap類提供了ScanLines,可以一行一行的讀圖,效率比較高。C#應該也有類似的東東。經過一番搜索,終于發現了BitmapData類。

先看個例子,這是對一張位圖的每個像素按FF取補,然后輸出到一個新圖(代碼有點啰嗦,不過應該可以說明問題了)。

int h = m_Bmp.Height;
int w = m_Bmp.Width;

Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);

BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0,0,w,h),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb;
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

unsafe
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
byte * pOut = (byte*)(dataOut.Scan0.ToPointer());

for (int y = 0; y < dataIn.Height; y++)
{
for (int x = 0; x < dataIn.Width; x++)
{

pOut[0] = (byte)(255 - pIn[0]);
pOut[1] = (byte)(255 - pIn[1]);
pOut[2] = (byte)(255 - pIn[2]);

pIn += 3;
pOut += 3;
}

pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
}

bmpOut.UnlockBits(dataOut);
m_Bmp.UnlockBits(dataIn);

貌似比Delphi復雜得多,難道我真的天生對指針過敏?還是Delphi的比較好理解,就是掃描每一行,然后對當前像素點的三個分量做處理,非常方便。而且C#代碼中的Stride是個什么東東?

查找了不少資料,現在我是這么理解的:

假設有一張圖片寬度為6,因為是Format24bppRgb格式(每像素3字節。在以下的討論中,除非特別說明,否則Bitmap都被認為是24位RGB)的,顯然,每一行需要6*3=18個字節存儲。對于Bitmap就是如此。但對于BitmapData,雖然BitmapData.Width還是等于Bitmap.Width,但大概是出于顯示性能的考慮,每行的實際的字節數將變成大于等于它的那個離它最近的4的整倍數,此時的實際字節數就是Stride。就此例而言,18不是4的整倍數,而比18大的離18最近的4的倍數是20,所以這個BitmapData.Stride = 20。顯然,當寬度本身就是4的倍數時,BitmapData.Stride = Bitmap.Width * 3。

畫個圖可能更好理解。R、G、B 分別代表3個原色分量字節,BGR就表示一個像素。為了看起來方便我在每個像素之間插了個空格,實際上是沒有的。X表示補足4的倍數而自動插入的字節。為了符合人類的閱讀習慣我分行了,其實在計算機內存中應該看成連續的一大段。

Scan0
|
|———Stride—————–|
|———Width————-| | 注:Width是圖片(BGR作為一個單位)寬度
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
.
.
.

現在應該很好理解了。首先用 BitmapData.Scan0找到第0個像素的第0個分量的地址。這個地址指向的是個byte類型,所以當時定義為byte* pIn。
行掃描時,在當前指針位置(不妨看成當前像素的第0個顏色分量)連續取出三個值(3個原色分量。注意,0 1 2代表的次序是B G R。在取指針指向的值時,貌似p[n]和p += n再取p[0]是等價的),然后下移3個位置(pIn += 3,看成指到下一個像素的第0個顏色分量)。做過Bitmap.Width次操作后,就到達了Bitmap.Width * 3的位置,應該要跳過圖中標記為X的字節了(共有Stride - Width * 3個字節),代碼中就是 pIn += dataIn.Stride - dataIn.Width * 3;

跳過以后指針就到達下行的第0個像素了。按照此算法,一共需要做Bitmap.Height次行掃描(代碼就是 for (int y = 0; y < dataIn.Height; y++))。

另外,因為使用了unsafe,所以編譯的時候需要設置“允許不安全的代碼”。

Posted: 2006年12月27日 14:22 作者 biojaye

總結

以上是生活随笔為你收集整理的图像处理中的跨度(stride)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91色视频| 国产一区二区黑人欧美xxxx | 国产最新视频 | 欧美少妇性生活 | 欧美日本国产 | 黄色免费网站在线 | 99久久精品免费看国产交换 | 五十路六十路七十路熟婆 | 日韩欧美国产精品 | 每日在线更新av | 亚洲AV无码成人精品区东京热 | 精品一区二区三区视频日产 | 日韩色区| 国产欧美在线视频 | 激情五月色婷婷 | 性生交生活片1 | 国产丰满大乳奶水在线视频 | 日韩亚洲国产欧美 | 激情xxxx| 在线免费看91 | 99精品国产免费 | 麻豆精品国产传媒av | 91九色蝌蚪 | 97超碰碰碰| 91av小视频| 少妇天天干 | 国产精品欧美综合 | 国产99久久九九精品无码 | 日韩乱码视频 | 亚洲欧美系列 | 免费观看黄一级视频 | 国产欧美一区二区三区在线 | 久久伊人中文字幕 | 色校园| 五月激情婷婷网 | 天堂中文网 | 99久久影视 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 女人下面喷水视频 | 日韩日b| 毛片a区 | 欧美男人的天堂 | 97精品人人妻人人 | 黄色免费视频网站 | 亚洲国产成人精品女人 | av一本在线| 久久综合伊人77777蜜臀 | 精品国产一二三区 | 日韩高清在线播放 | 伊人网大| 国产日本欧美在线观看 | 久久精品午夜福利 | 精品国产精品三级精品av网址 | www.四虎在线观看 | 在线能看的av网站 | 成人av高清在线观看 | 激情五月婷婷小说 | 69网址 | 国产视频97| 九九九九九热 | 日本高清视频www夜色资源 | 久热免费| 免费观看久久 | 91成人免费版 | 午夜理伦三级理论 | 亚洲av无码日韩精品影片 | 超碰超碰超碰超碰超碰 | 亚洲精品视屏 | 午夜精品久久久久久久久久 | 在线你懂得 | 国产精品1区2区3区 在线看黄的网站 | 一道本视频在线 | 中文字幕xxxx| 日韩人妻精品一区二区三区 | 久久国语对白 | 欧美中文一区 | 一区二区三区在线观 | 成av人在线观看 | 夜夜爱av| 一级片大全 | 色丁香在线 | 日本四级电影 | 美女的诞生免费观看在线高清 | 亚洲精品韩国 | 激情综合影院 | 污版视频在线观看 | 久久久77 | 日韩午夜在线视频 | 中文字幕在线播放一区 | 欧美女优一区二区 | 天天干网址| 久草视频手机在线观看 | 日本在线不卡一区二区 | 大尺度摸揉捏胸床戏视频 | 成人免费做受小说 | 日本少妇网站 | 精品无码人妻少妇久久久久久 | 国产高潮久久久 | 天堂视频在线免费观看 |