全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2531
推到 Plurk!
推到 Facebook!

TBitmap.SaveToStream 的效率问题

答題得分者是:malanlk
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-22 13:03:49 IP:219.133.xxx.xxx 未訂閱
我用代码把桌面屏幕抓成ABmp:TBitmap 然后把 ABmp.SaveToStream,把内容保存到一个Stream里去,好传给网络上的另一台电脑。 我用了一个Timer,300MS 抓一次图。发现 CPU 跑到100%。 一句一句地把代码屏蔽掉,最后发现只要把 ABmp.SaveToStream 屏蔽掉不执行,CPU 的使用率立即掉下来。只要加上这一句,CPU 的使用率立即跑到 100% 看来是 ABmp.SaveToStream 的效率低。请问各位达人,有别的效率更高的办法可以把ABmp里的Data导出来吗?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-22 19:42:48 IP:203.69.xxx.xxx 未訂閱
既然是擷取螢幕圖形, 所以大小事可以事先得知的, 追蹤 TBitmap.SaveToStream 到 Classes.pas 內的 TMemoryStream.Write(...)
function TMemoryStream.Write(const Buffer; Count: Longint): Longint;
var
  Pos: Longint;
begin
  if (FPosition >= 0) and (Count >= 0) then
  begin
    Pos := FPosition   Count;
    if Pos > 0 then
    begin
      if Pos > FSize then
      begin
        if Pos > FCapacity then
          SetCapacity(Pos);
        FSize := Pos;
      end;
      System.Move(Buffer, Pointer(Longint(FMemory)   FPosition)^, Count);
      FPosition := Pos;
      Result := Count;
      Exit;
    end;
  end;
  Result := 0;
end;
如果 Stream 的容量太小就會不斷重新配置... 所以試試看用 Stream.SetSize 先將 Stream 加大, 減少重配置的動作.... 發表人 - malanlk 於 2005/08/22 19:44:11
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-23 10:35:50 IP:219.133.xxx.xxx 未訂閱
谢谢。 ABitmap.SaveToStream(MyMemoryStream) 我试过先把MyMemoryStream.Create及MyMemoryStream.SetSize都做好,但似乎对效率的改善影响不大,CPU仍然跑到 100%
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-23 13:18:01 IP:203.69.xxx.xxx 未訂閱
照這樣來看, 要提升效率大概只有 參考 TBitmap.WriteStream 的程式碼 自己寫一個函式將圖由 Image.Canvas 寫入 Stream 內了...
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-23 13:47:49 IP:203.69.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=56632 這篇應該可以參考一下 BMP Stream = BMP Header ImageData 問題應該是 Canvas.Pixels 如何化為 ImageData http://web.uccs.edu/wbahn/ECE1021/STATIC/REFERENCES/bmpfileformat.htm 應該可以有答案...
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-25 14:38:24 IP:219.133.xxx.xxx 未訂閱
谢谢! 我估计这个效率很难提升起来。我在试换另一个办法,也就是抓系统消息,当屏幕变化的时候,才抓屏幕图。 看了一些关于 Hook 系统消息的资料,都是抓鼠标和键盘的。不知道屏幕变化,WINDOWS是否会给出消息?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-29 00:14:34 IP:61.219.xxx.xxx 未訂閱
又爬到一篇有 source 的 http://delphi.about.com/od/internetintranet/l/aa012004a.htm
系統時間:2024-04-26 5:08:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!