查看完整版本: 影像處理Lockbit處理截圖的方法
頁: [1]

iansuperian 發表於 2017-12-3 11:50 PM

影像處理Lockbit處理截圖的方法

最近在研究利用C#做影像處理

想到要選取一張圖片的特定範圍

進行擷取動作

網上找到一篇文章

https://stackoverflow.com/questions/10771300/bitmap-lockbits-confusion?answertab=votes#tab-top

蠻符合自己的需求的

但是解答者for迴圈中的row、pixel、pixelComponent三條式子

我不太懂它們的意思

想請問有前輩可以幫忙解惑嗎?


謝謝
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

sggleeee 發表於 2017-12-4 09:19 PM

大大你好,小弟只是個新手,底下為個人解讀,您參考看看:

底下轉貼大大所提及的 stackoverflow 的連結的原代碼加上個人註解......
var bitmap = new Bitmap(100, 100);

var data = bitmap.LockBits(new Rectangle(0, 0, 10, 10),
                           ImageLockMode.ReadWrite,
                           bitmap.PixelFormat);

//pt指到點陣圖中的第一個像素資料的位址
var pt = (byte*)data.Scan0;

//利用Bitmap的資料列掃描寬度除以Bitmap的圖像寬度來取得每個像素點所占位元組
var bpp = data.Stride / bitmap.Width;

//此例中 data 的Height 與 Wdth均為10個 pixel
for (var y = 0; y < data.Height; y++)
{
    // pt+(y * data.Stride) 來指向每一列的第一筆資料的位址   
    var row = pt + (y * data.Stride);

    for (var x = 0; x < data.Width; x++)
    {
        //取得每個Pixel 的位址, row代表每行資料第一筆的位址, bpp是每個Pixel 所占位元組
        //所以用 row + x*bpp 來取得每個像素點的起位址
        var pixel = row + x * bpp;
        
        //底下 bit 應該是打錯了,應該是 byte而不是bit
        for (var bit = 0; bit < bpp; bit++)
        {
             //將所要擷取的像素點的每一個byte內容存放到pixelComponent變數中
             var pixelComponent = pixel;
        }
    }
}

bitmap.UnlockBits(data);
以上僅就 stackoverflow 上的原代碼來解讀...
不過建議大大再看一下該網站上底下的其他人留言.......
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

sggleeee 發表於 2017-12-5 12:55 AM

其實大大可以使用Bitmap的Clone方法來選取你要的區域
如果需要進行Byte處理,再將Clone的Bitmap轉成Byte Array即可

參考看看囉 ~

iansuperian 發表於 2017-12-6 08:29 PM

sggleeee 發表於 2017-12-4 09:19 PM static/image/common/back.gif
大大你好,小弟只是個新手,底下為個人解讀,您參考看看:

底下轉貼大大所提及的 stackoverflow 的連結的原 ...

好的謝謝大大
說明得很清楚我會再花些時間研究

iansuperian 發表於 2017-12-6 08:30 PM

sggleeee 發表於 2017-12-5 12:55 AM static/image/common/back.gif
其實大大可以使用Bitmap的Clone方法來選取你要的區域
如果需要進行Byte處理,再將Clone的Bitmap轉成Byte Ar ...

謝謝您的建議
我會嘗試看看<br><br><br><br><br><div></div>

w100386435 發表於 2018-6-11 09:35 AM




以前寫的C# 快速存取Bitmap pixel 你可以參考看看
(請自己補上.)
null-adventure-diarytwo.blogspot com/2017/12/c-bitmap-pixel.html
頁: [1]