void CDynSplitView2::clearmem() {
CDSplitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->statedoc = 0; // 重置文檔狀態標志
state2 = 1; // 設置視圖狀態
CDibNew1 = &pDoc->CDibNew; // 指向目標 DIB (處理後圖像)
CDib1 = &pDoc->CDib; // 指向源 DIB (原始圖像)
long int size = CDib1->GetHeight() * CDib1->GetDibWidthBytes(); // 圖像數據字節數
memcpy(CDibNew1->m_pData, CDib1->m_pData, size); // 核心:拷貝像素數據
}
// 使用 HBITMAP + GetDIBits / SetDIBits 操作像素緩衝區
void ClearMem(HBITMAP hSrcBmp, HBITMAP hDstBmp, int width, int height) {
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height; // 自上而下 DIB
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24; // 或 32
bmi.bmiHeader.biCompression = BI_RGB;
// 分配緩衝區
BYTE *srcBits = malloc(width * height * 3);
BYTE *dstBits = malloc(width * height * 3);
HDC hdc = GetDC(NULL);
// 讀取源位圖像素到 srcBits
GetDIBits(hdc, hSrcBmp, 0, height, srcBits, &bmi, DIB_RGB_COLORS);
// 拷貝到目標緩衝區 (相當於 clearmem 核心動作)
memcpy(dstBits, srcBits, width * height * 3);
// 寫回目標位圖
SetDIBits(hdc, hDstBmp, 0, height, dstBits, &bmi, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc);
free(srcBits); free(dstBits);
}
`clearmem()` 本質是**雙緩衝渲染/圖像處理中的「幀重置」操作**:將源圖像數據完整拷貝到目標緩衝區,為後續原地修改算法 (如中值濾波、邊緣檢測、幾何變換) 提供乾淨基線。缺少此步驟會導致未修改像素區域殘留舊數據,產生視覺伪影。