線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1784
推到 Plurk!
推到 Facebook!

請教 影像傳輸 問題

答題得分者是:RaynorPao

中階會員


發表:36
回覆:142
積分:70
註冊:2003-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-18 11:20:49 IP:211.23.xxx.xxx 未訂閱
各位前輩好:    小弟參閱了 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-18 12:15:35 IP:203.73.xxx.xxx 未訂閱
引言: 各位前輩好: 小弟參閱了 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-18 14:17:46 IP:211.23.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-18 22:51:57 IP:61.221.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-20 15:56:40 IP:218.163.xxx.xxx 未訂閱
前輩RaynorPao 您好: 真的很感謝您,還費了您許多時間跟小弟解釋 你所指導的一些狀況小弟已有實際修改測試 沒更動的話, bmp1 是 3 MB jpg 的 Quality = 100 時為 133 KB Quality 越小時,檔案越小,但失真越嚴重 小弟以後若想再往下鑽研時 會去坊間找書自行閱讀 但這次,真的很感謝。
系統時間:2024-04-29 19:42:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!