請教 影像傳輸 問題 |
答題得分者是:RaynorPao
|
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
各位前輩好: 小弟參閱了 RaynorPao 前輩關於『影像傳輸』的範例
礙於小弟程式功力不深,並不能了解程式內容為何 RaynorPao 前輩在 Timer 中每秒抓取影像的程式
小弟最看不懂的也是這部份,希望前輩指導
小弟比較好奇的是 ClientToServer 的程式
HDC dc; TCanvas *cs=new TCanvas; dc=GetDC(0); cs->Handle=dc; bmp1->Width=Screen->Width; bmp1->Height=Screen->Height; bmp1->Canvas->CopyRect(Rect(0, 0, bmp1->Width, bmp1->Height), cs, Rect(0, 0, Screen->Width, Screen->Height)); POINT pt; HCURSOR hCur=GetCursor(); GetCursorPos(&pt); DrawIcon(bmp1->Canvas->Handle, pt.x, pt.y, hCur);對於上面程式幾乎是完全不懂 HDC 是什麼呢?小弟在 help 中沒找到 cs->Handle 又是什麼意思?小弟不懂 bmp1->Canvas->CopyRect... 也不了解意思 還有後面的,是不是能請前輩說明一下 讓小弟以後想在自己的程式中加上此項功能時 了解該從哪修改能符合自己需求 TMemoryStream 小弟已在 help 中找到範例,大約能懂其功用 請問哪邊有關於 IdTCPserver IdTCPClient 相關使用範例 RaynorPao 前輩給的網址中有個 Demo 不像是 Delphi 寫成,不知有沒有 BCB 版的範例 謝謝 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 各位前輩好: 小弟參閱了 RaynorPao 前輩關於『影像傳輸』的範例 礙於小弟程式功力不深,並不能了解程式內容為何 RaynorPao 前輩在 Timer 中每秒抓取影像的程式 小弟最看不懂的也是這部份,希望前輩指導 小弟比較好奇的是 ClientToServer 的程式HDC dc; TCanvas *cs=new TCanvas; dc=GetDC(0); cs->Handle=dc; bmp1->Width=Screen->Width; bmp1->Height=Screen->Height; bmp1->Canvas->CopyRect(Rect(0, 0, bmp1->Width, bmp1->Height), cs, Rect(0, 0, Screen->Width, Screen->Height)); POINT pt; HCURSOR hCur=GetCursor(); GetCursorPos(&pt); DrawIcon(bmp1->Canvas->Handle, pt.x, pt.y, hCur);對於上面程式幾乎是完全不懂 HDC 是什麼呢?小弟在 help 中沒找到 cs->Handle 又是什麼意思?小弟不懂 bmp1->Canvas->CopyRect... 也不了解意思 還有後面的,是不是能請前輩說明一下 讓小弟以後想在自己的程式中加上此項功能時 了解該從哪修改能符合自己需求 TMemoryStream 小弟已在 help 中找到範例,大約能懂其功用 請問哪邊有關於 IdTCPserver IdTCPClient 相關使用範例 RaynorPao 前輩給的網址中有個 Demo 不像是 Delphi 寫成,不知有沒有 BCB 版的範例 謝謝 流 你好: (1)所謂 DC 就是 Device Context,HDC 指的就是 DC 的 HANDLE,建議你看看 M$DN 中的原始說明文件 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_0g6r.asp (2)Canvas->Handle 其實就是 HDC (3)上面那段紅色程式碼中的 GetDC(0) 就是在抓螢幕的 DC,只要抓到了螢幕的 DC 就可以截取螢幕的畫面 (CopyRect) (4)上面那段綠色的程式碼,是為了要把滑鼠的指標畫到 (3) 中抓取的畫面中, 因為由螢幕 DC 抓到的畫面,並不包含滑鼠的指標 (5)"bmp1->Canvas->CopyRect" 這一行指令,你只要查詢 BCB 中 TCanvas 的 Method 就可以查到說明了 (本站也有很多這方面的範例),其實只是要把某 一個 Canvas1 中的內容,貼到另外一個 Canvas2 裡面 (6)有關 Indy 元件的 BCB 範例非常的少,小弟我也是常看 Delphi 的程式碼自 己摸索寫出範例的,其實也有 BCB 的範例,不過~~我說過了,很少,請參考 以下的連結 (解開以後在 Chat 目錄底下就是了) > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
RaynorPao 前輩您好: 非常感謝您熱心且詳細的指導
小弟已能從您的程式中抓出自己的螢幕並儲存
我想小弟應該能幫自己的同學的忙了 (專題) jpg->CompressionQuality=20;
jpg->Compress(); // part code in Client
jpg->CompressionQuality=100; // part code in Server
希望前輩指導一下其中Quality代表的意思
呃...查到了,100是代表失真少,但檔案大一些
1代表失真多,但檔案小
不曉得小弟解釋所查到的是否有誤 ^^"
而兩者為何一個有 Compress() function 而一個沒有
是否因為100是無壓縮狀態,故無須用到 Compress function 小弟還有一個問題想請教前輩
Client To Server 或 Server To Client 都是 jpg 檔
由於傳輸有限制,小弟剛剛測試一下
發現存成 bmp 檔的大小為 3 MB,傳送起來應該很要命吧 ...||| 是不是能將 jpg 的格式傳送至另一端時
能夠把他還原為 bmp 的格式且不失真再 dispaly ? ^^|||
TJPEGImage *jpg=new TJPEGImage; // bmp1 已讀到螢幕畫面了 jpg->Assign(bmp1); // 將 bmp1 變為 jpg 格式 jpg->CompressionQuality=20; // 設定壓縮率 jpg->Compress(); // 壓縮 Image1->Picture->Assign(bmp1); // 先讀 bmp1 Image1->Picture->SaveToFile("real.bmp"); // 存為原來之 bmp 檔 Image1->Picture->Assign(jpg); // 再讀 jpg Image1->Picture->SaveToFile("change.jpg"); // 存為轉換後改變之 jpg 檔 bmp1->Assign(jpg); // 再讀由 jpg 轉回來之 bmp1 Image1->Picture->SaveToFile("change.bmp"); // 存為轉換後改變之 bmp小弟依據您的程式做比較,發現無法還原為 bmp 檔案之大小 這樣畫面在 display 會失真,好像失真蠻嚴重的 不曉得前輩有無方法可解...... (不知道這要求會不會很過份,因為您很忙且好像要別的方法才可實作出來) 謝謝前輩的指導,小弟又上了一堂課了,很充實。 發表人 - 流 於 2003/09/18 14:27:40 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: RaynorPao 前輩您好: 非常感謝您熱心且詳細的指導 小弟已能從您的程式中抓出自己的螢幕並儲存 我想小弟應該能幫自己的同學的忙了 (專題) jpg->CompressionQuality=20; jpg->Compress(); // part code in Client jpg->CompressionQuality=100; // part code in Server 希望前輩指導一下其中Quality代表的意思 呃...查到了,100是代表失真少,但檔案大一些 1代表失真多,但檔案小 不曉得小弟解釋所查到的是否有誤 ^^" 而兩者為何一個有 Compress() function 而一個沒有 是否因為100是無壓縮狀態,故無須用到 Compress function 小弟還有一個問題想請教前輩 Client To Server 或 Server To Client 都是 jpg 檔 由於傳輸有限制,小弟剛剛測試一下 發現存成 bmp 檔的大小為 3 MB,傳送起來應該很要命吧 ...||| 是不是能將 jpg 的格式傳送至另一端時 能夠把他還原為 bmp 的格式且不失真再 dispaly ? ^^|||TJPEGImage *jpg=new TJPEGImage; // bmp1 已讀到螢幕畫面了 jpg->Assign(bmp1); // 將 bmp1 變為 jpg 格式 jpg->CompressionQuality=20; // 設定壓縮率 jpg->Compress(); // 壓縮 Image1->Picture->Assign(bmp1); // 先讀 bmp1 Image1->Picture->SaveToFile("real.bmp"); // 存為原來之 bmp 檔 Image1->Picture->Assign(jpg); // 再讀 jpg Image1->Picture->SaveToFile("change.jpg"); // 存為轉換後改變之 jpg 檔 bmp1->Assign(jpg); // 再讀由 jpg 轉回來之 bmp1 Image1->Picture->SaveToFile("change.bmp"); // 存為轉換後改變之 bmp小弟依據您的程式做比較,發現無法還原為 bmp 檔案之大小 這樣畫面在 display 會失真,好像失真蠻嚴重的 不曉得前輩有無方法可解...... (不知道這要求會不會很過份,因為您很忙且好像要別的方法才可實作出來) 謝謝前輩的指導,小弟又上了一堂課了,很充實。 流 你好: (1)CompressQuality 可以把它看成壓縮後的影像品質,數字愈大 (100) 愈好, 數字愈小 (1) 愈差,但是~~即使品質再好,也已經失真,這是 JPEG 的特性 ,JPEG 壓縮/編碼的過程裡面,一定會造成失真的,如果有興趣的話,建議 你可以參考目前市面上一些影像處理的書籍,裡面都寫得很清楚 (2)其實如果不寫 jpg->Compress(); 這一行的話,它也會在某些情況之下自動 壓縮,例如: jpg->SaveToFile(...); 或 jpg->SaveToStream(...); ,我只 是強迫它提早執行而已 (3)在 Client 端設定 CompressQuality 為 20 的主要目的,是想要把傳輸影像 的 Size 弄小,你可以自己試試看把原程式碼中抓到的 bmp 存檔,例如: bmp->SaveToFile("1.bmp"); 另外,也把經過壓縮過的 jpg 存檔,例如: jpg->SaveToFile("1.jpg"); 比較一下,你就會知道了 (4)在 Server 端又把 CompressQuality 設為 100,其實並沒有其他的意義,只 是小弟我無意間發現 TJPEGImage 這個元件,有的時候要把它的內容取出來 轉回 bmp 的時候,例如: bmp->Assign(jpg); 在某些情況之下會造成錯誤, 因此,我都會特別加上那一行,就不會發生錯誤了,只是習慣的寫法,不用 太在意它;不過,原本在 Client 端設為 20,現在 Server 端收到了又設為 100,並不會恢復原影像的品質 (這一點千萬別搞混了) (5)一般來說,壓縮可分為有損失及無損失兩種,無損失的壓縮是可以完全回復 至沒有壓縮之前的內容,例如: Zip,這種好處是完全無損失,壞處是壓縮比 不高;另一種是有損失的壓縮,這種壓縮是沒有辦法完全回復到壓縮之前的 內容,這也是壞處,但好處是壓縮比很高,常應用於影像處理,因為人的眼 睛對亮度比較敏感,對彩度則沒有那麼的敏感,因此就可以利用一些數學理 論實現較高壓縮比的結果,而一般常見的 JPEG 所使用的壓縮方式,大部分 都是屬於這種 (6)因此,JPEG 是沒有辦法完全回復至尚未壓縮之前的 Bitmap 的,老話再說一 次,現在市面上有很多這方面影像處理的書籍,建議你有空逛逛書店吧-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
流
中階會員 發表:36 回覆:142 積分:70 註冊:2003-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |