看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev-C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) WindowsAPI 問題(Question): 我已經將一張圖片透過一些處理存到一個HDC的變數叫src,然後設另一個hdc的變數叫dest ,然後將src透過我寫的迴圈將像素垂直翻轉到dest,但出來的結果怪怪的,變成下面一半 是原來圖形,上面一半是翻轉過的圖形,不知有沒有人能幫忙指點迷津?XD 餵入的資料(Input): 正常圖片 預期的正確結果(Expected Output): 垂直翻轉圖片 錯誤結果(Wrong Output): 只有一半圖片翻轉 程式碼(Code):(請善用置底文網頁, 記得排版) HDC turnHDC(int op, HDC* dest, HDC* src) { RECT rc; GetClipBox(*src, &rc); switch (op) { case V_TURN: for (int i = 0; i < rc.right; i++) for(int j = 0; j < rc.bottom; j++) SetPixel(*dest, i, j, GetPixel(*src,i, rc.bottom-j)); break; case H_TURN: break; } } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.233.164.59
EdisonX:你的邏輯不正確,從上到下掃到一半時,這時上半部的圖片就 07/13 20:16
EdisonX:變成下半部的圖片,再往下掃時,下半部去找上半部找到自己. 07/13 20:17
EdisonX:所以,從上而下掃一半,掃到對應的點做 swap. 07/13 20:18
EdisonX:!! sorry,沒看到你多用一個 buffer,略過上述推文 orz 07/13 20:19
jeff810123:我是想說跟邏輯座標和裝置座標之間的轉換有沒有關係? 07/13 20:47
pnpncat:貼一下錯誤的那張圖吧? 比較容易猜出問題所在 07/13 20:48
jeff810123:圖片網址 07/13 21:00
jeff810123:http://tinyurl.com/89d6fug 07/13 21:05
pnpncat:看來就像是 EdisonX 說的問題呀 你看你的函數呼叫 07/13 21:15
pnpncat:dest和src是不是同一個位址? 或者開watch檢查一下 07/13 21:16
pnpncat:另外 迴圈不要這樣寫 你的i和j寫反了 橫的應該在裡面 07/13 21:18
pnpncat:直的應該在外面才對 07/13 21:18
jeff810123:turnHDC(V_TURN, &dest_mdc , &src_mdc); 07/13 21:24
jeff810123:這是呼叫部分 07/13 21:25
pnpncat:你要追蹤dest_mdc和src_mdc怎麼來的呀 這樣的設計本身就 07/13 21:26
pnpncat:是錯的 因為你的函式對自我賦值的結果根本不對嘛 07/13 21:27
pnpncat:正確的作法是先malloc一塊tmp記憶體 翻轉貼過去 再將 07/13 21:29
EdisonX:疑!講起來 src,des 指向同一份記憶體的可能性頗大. 07/13 21:29
pnpncat:dst原來指向的記憶體free掉 再將tmp的指標丟給dst 07/13 21:30
pnpncat:這是所有這類函式的慣用寫法 要背起來的.......@@ 07/13 21:31
pnpncat:而且你應該傳reference才對 如果傳值 就要改用memcpy 07/13 21:34
pnpncat:去把整個tmp 拷貝回原來的 dst 了 07/13 21:34
jeff810123:pnpncat大大,您講的我有點難理解 07/13 21:40
pnpncat:你可以用一行 if (src == dst) 之類的來檢查自我賦值 07/13 21:40
EdisonX:那你方便把 HDC des_mdc, src_mdc , 取得的部份po上來嗎? 07/13 21:41
EdisonX:我覺得要檢討會較方 便。 07/13 21:42
pnpncat:但那不是治本之道 你的函式宣告本身就預示了逾界的風險 07/13 21:42
pnpncat:算了 我發文解釋吧^^" 07/13 21:43
jeff810123:我是傳兩個不同變數進去,為什麼會指向同一個記憶體是 07/13 21:43
jeff810123:是我不能理解的地方 07/13 21:44
EdisonX:兩個不同變數指向同一份記憶體,是時有所聞吧 ? 07/13 21:45
jeff810123:這樣結果是空白的,但直接用*temp = hdc結果就正確 07/13 23:39