首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ CImage 像素處理訪問違例:GetPixelAddress 邊界檢查與 LockBits 替代

     編輯:程式設計綜合問答

錯誤現象

`BYTE *tp1 = (BYTE*)bmps[nIndex].GetPixelAddress(i,j);` 觸發訪問違例。

原因

  1. 索引越界:`i` 循環至 `GetHeight()`,`j` 至 `GetWidth()`,**但 `GetPixelAddress(row, col)` 參數順序為 (y, x) 即 (行, 列)**,若傳反則訪問錯誤內存。
  2. 圖片格式不匹配:`CImage` 可能非 32bpp,`BYTE*` 強轉後步長計算錯誤。
  3. CImage 未正確加載:`IsNull()` 為真,內部緩衝區為空。

修正建議

// 1. 確認加載成功
if (bmps[nIndex].IsNull()) return;
// 2. 正確參數順序:row=y, col=x
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        BYTE* p = (BYTE*)bmps[nIndex].GetPixelAddress(y, x);
        // 檢查 p 是否在有效範圍 (可選)
    }
}
// 3. 推薦:LockBits 替代 (同 .NET),但 CImage 無直接 LockBits,
//    可用 GDI+ Bitmap::LockBits 或直接操作 DIBSection 指針
//    參考:https://docs.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-locking-bits-use

參考代碼

見樓主提供的 `LoadCImage` 中 `GetPixelAddress` 遍歷修改像素的正確用法 (注意 `GetWidth()`/`GetHeight()` 順序)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved