[問題] 圖片垂直翻轉

看板C_and_CPP (C/C++)作者 (曉風殘月)時間13年前 (2012/07/13 20:05), 編輯推噓0(0032)
留言32則, 3人參與, 最新討論串1/2 (看更多)
開發平台(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

07/13 20:16, , 1F
你的邏輯不正確,從上到下掃到一半時,這時上半部的圖片就
07/13 20:16, 1F

07/13 20:17, , 2F
變成下半部的圖片,再往下掃時,下半部去找上半部找到自己.
07/13 20:17, 2F

07/13 20:18, , 3F
所以,從上而下掃一半,掃到對應的點做 swap.
07/13 20:18, 3F

07/13 20:19, , 4F
!! sorry,沒看到你多用一個 buffer,略過上述推文 orz
07/13 20:19, 4F

07/13 20:47, , 5F
我是想說跟邏輯座標和裝置座標之間的轉換有沒有關係?
07/13 20:47, 5F

07/13 20:48, , 6F
貼一下錯誤的那張圖吧? 比較容易猜出問題所在
07/13 20:48, 6F

07/13 21:00, , 7F
圖片網址
07/13 21:00, 7F

07/13 21:05, , 8F

07/13 21:15, , 9F
看來就像是 EdisonX 說的問題呀 你看你的函數呼叫
07/13 21:15, 9F

07/13 21:16, , 10F
dest和src是不是同一個位址? 或者開watch檢查一下
07/13 21:16, 10F

07/13 21:18, , 11F
另外 迴圈不要這樣寫 你的i和j寫反了 橫的應該在裡面
07/13 21:18, 11F

07/13 21:18, , 12F
直的應該在外面才對
07/13 21:18, 12F

07/13 21:24, , 13F
turnHDC(V_TURN, &dest_mdc , &src_mdc);
07/13 21:24, 13F

07/13 21:25, , 14F
這是呼叫部分
07/13 21:25, 14F

07/13 21:26, , 15F
你要追蹤dest_mdc和src_mdc怎麼來的呀 這樣的設計本身就
07/13 21:26, 15F

07/13 21:27, , 16F
是錯的 因為你的函式對自我賦值的結果根本不對嘛
07/13 21:27, 16F

07/13 21:29, , 17F
正確的作法是先malloc一塊tmp記憶體 翻轉貼過去 再將
07/13 21:29, 17F

07/13 21:29, , 18F
疑!講起來 src,des 指向同一份記憶體的可能性頗大.
07/13 21:29, 18F

07/13 21:30, , 19F
dst原來指向的記憶體free掉 再將tmp的指標丟給dst
07/13 21:30, 19F

07/13 21:31, , 20F
這是所有這類函式的慣用寫法 要背起來的.......@@
07/13 21:31, 20F

07/13 21:34, , 21F
而且你應該傳reference才對 如果傳值 就要改用memcpy
07/13 21:34, 21F

07/13 21:34, , 22F
去把整個tmp 拷貝回原來的 dst 了
07/13 21:34, 22F

07/13 21:40, , 23F
pnpncat大大,您講的我有點難理解
07/13 21:40, 23F

07/13 21:40, , 24F
你可以用一行 if (src == dst) 之類的來檢查自我賦值
07/13 21:40, 24F

07/13 21:41, , 25F
那你方便把 HDC des_mdc, src_mdc , 取得的部份po上來嗎?
07/13 21:41, 25F

07/13 21:42, , 26F
我覺得要檢討會較方 便。
07/13 21:42, 26F

07/13 21:42, , 27F
但那不是治本之道 你的函式宣告本身就預示了逾界的風險
07/13 21:42, 27F

07/13 21:43, , 28F
算了 我發文解釋吧^^"
07/13 21:43, 28F

07/13 21:43, , 29F
我是傳兩個不同變數進去,為什麼會指向同一個記憶體是
07/13 21:43, 29F

07/13 21:44, , 30F
是我不能理解的地方
07/13 21:44, 30F

07/13 21:45, , 31F
兩個不同變數指向同一份記憶體,是時有所聞吧 ?
07/13 21:45, 31F

07/13 23:39, , 32F
這樣結果是空白的,但直接用*temp = hdc結果就正確
07/13 23:39, 32F
文章代碼(AID): #1G00xmb0 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1G00xmb0 (C_and_CPP)