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

怎樣把一張JPEG放進byteArray內?

尚未結案
joe_ung
一般會員


發表:12
回覆:21
積分:6
註冊:2003-10-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-22 16:02:47 IP:202.175.xxx.xxx 未訂閱
小弟想把一張JPEG照片通過network來發送出去 應怎樣做呢? 請各位前輩指教一下. 多謝
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-22 16:15:02 IP:147.8.xxx.xxx 未訂閱
Make use of stream if you want some kind of byte array,    
var
    Mem: TMemoryStream;
{...}
    Mem := TMemoryStream.Create;    
    Jpeg.SaveToStream(Mem);
    { now Mem.Memory^ is what you want }
{...}
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-22 17:49:37 IP:211.96.xxx.xxx 未訂閱
. 發表人 - japhenchen 於 2003/10/22 17:52:33
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-22 17:53:35 IP:211.96.xxx.xxx 未訂閱
幫我刪一下我剛貼的訊息~~~~我剛剛豬頭回錯信息了..... 我不懂,不懂,不懂....所以我才來ktop學工夫
joe_ung
一般會員


發表:12
回覆:21
積分:6
註冊:2003-10-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-23 10:12:14 IP:202.175.xxx.xxx 未訂閱
我都是不太明白啊.... 可否解釋一下呢? 希望可以啦....多謝
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-23 12:15:12 IP:147.8.xxx.xxx 未訂閱
MemoryStream, as the name suggests, is a stream resize in memory and its data are begin stored continuously in a large block of memory (Mem.Memory^ points to the 1st byte of data).
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-27 16:40:21 IP:211.96.xxx.xxx 未訂閱
這篇烏龍鬧大了,這篇樓主好像給分給錯人了........我啥都沒做,莫名奇妙拿到分,這下子我非答不可囉! 以下的例子是我寫來做局網里做p2p的檔案傳輸用的,全部用indy的tcp/udp的元件來處理。 當我需要一個檔案的時候,就用udp對局網內的所有電腦做broadcast詢問『誰有我要的檔案,檔名是xxx.abc,大小是nnnn bytes,CRC是$00ABCDEF』(前述的數字是假設數字),這時這局網里十台電腦,有一台里有我要的東西(PC-A),於是用TCP開始接洽是否可以丟檔案給我的電腦,當然TCP必須要建立THREAD來處理這個TCP連線的工作,不然同時一堆電腦同時發生通訊請求,不就塞車?第一個回答我的電腦出現後,我為了要停止後來的人再傳檔過來,我設sendercount:=1,再把PC-A的IP記下來,後來的thread檢查如果sendercount>0的話就terminate掉不再繼續.... PC-A打開tcp server,綁在8888 port 電腦就是tcp client,打開到PC-A的port8888去 二台電腦連上之後開始進行handshaking~(確定傳送協定的握手交談的動作),以下開始傳檔    我的電腦TCP CLIENT端
procedure DownLoadfile(xfn:string);
var xfile : TFileStream;
    sResp:string;
begin
   WITH idTCPClient1 do begin
      idTCPClient1.Port:=8888;         
      idTCPClient1.host:=10.10.1.1;     // PC-A的ip
      idTCPClient1.Connect ;
      while Connected do begin
         xfile:= TFileStream.Create(xfn,fmCreate or fmShareExclusive); 
         //與server端建立連線成功之後,先建立一個filestream準備接收檔案
         try
            sRESP:=READLN; 
            if sRESP<>'JAPHEN'S TCP Peer to Peer Sharing' then
               break;
            // 如果對方回答我的不是共同的語言,就中斷所有的連接動作
            writeln('GETINGFILE_'   xfn); // 向PC-A要求我要的檔案
            readstream(xfile,-1,true);
         finally
            Disconnect ; // 總算完成(依檔案大小來決定所花時間),中斷連接
            xfile.free;  // 關閉檔案(這時也寫入完成了,檢查一下是不是接收到了吧)
         end;
      end;
   end;
end;
server端(PC-A,裡面有我要的檔案的電腦)
procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread);
VAR SREQ ,prefile: STRING ;
    FStream :  TFileStream;
begin
      ATHREAD.Connection.WriteLN('JAPHEN'S TCP Peer to Peer Sharing'); 
      //連線建立後,回傳個訊息給client端
      try
         SREQ:=READLN;
         if copy(SREQ,1,11)='GETINGFILE_' then begin
            // 如果對方跟我要檔案的話,往下繼續
            prefile := copy(SREQ,12,length(SREQ)-11);
            if fileexists(prefile) then begin //檢查一下檔案存不存在
               try
                  FStream:=TFileStream.Create(prefile,fmOpenRead or fmShareDenyNone);
                  //打開要送出去的檔案
                  fstream.Seek(0,soFromBeginning);
                  //檔案指標指到最開頭
                  ATHREAD.Connection.openwritebuffer; // 打開TCP WRITEBUFFER
                  ATHREAD.Connection.writestream(fStream); //把檔案FSTREAM直接丟出去,沒限制大小
                  ATHREAD.Connection.Closewritebuffer;//關閉TCP WRITEBUFFER(全都送完了)
               finally
                  freeandnil(FStream);
               end;
            end;
         end;
      finally
         ATHREAD.Connection.disconnect ;
      end;
   END;
end;
可能有人會問只要WRITEBUFFER只要一次就可以傳完成千上萬MB甚至2G 3G的資料,會不會有問題?網卡不是笨蛋,TCP協定也不是丟了就不管,所有的資料封包最後都有個CRC,在傳完每個封包之後,網卡自動會檢查封包是否有錯,如果錯了,由網卡發起自動重送(資料連結層的事,AP管不著也不用管),至於INDY TCP元件的角色,負責會議層的工作,把檔案資料切割成一個封包最大能傳送的大小,一個個排隊傳,一個個確認(我猜的,當然也可以用多緒全狂送,在最後檢查正確性,傳錯或沒收到的包,再通知重傳),所以給最末開發者的工作,就只要做到二端AP的協議還有資料弄成STREAM然後送出跟負責接收的工作就好,其他細部的工作就交給INDY在背景處理囉 當然如果想練功,又沒有開發時程的壓力,或者對INDY元件沒信心,那就自己拿WINSOCK自己慢慢做吧!誰說會開車的人就一定要懂得如何修車,如何組裝一台車?不懂,一樣可以開的很好,一樣可以達到目的地,所以~~請別笑只會用元件寫程式的人.... 我不懂,不懂,不懂....所以我才來
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-28 09:55:19 IP:211.96.xxx.xxx 未訂閱
var
    Mem: TMemoryStream;
{...}
    Mem := TMemoryStream.Create;    
    Jpeg.SaveToStream(Mem);
    { now Mem.Memory^ is what you want }
{...}
下面是另一種方法,用法相同,用途也相同,但在記憶体里佔的空間,僅有一個指標,而不用allocate掉一塊空間來存放這個jpeg
var
    JPGFILE: TFileStream;
{...}
    JPGFILE := TFileStream.Create('c:\abc.jpg',fmOpenRead or fmShareDenyNone);    
    { 這時就可以對JPGFILE操作了,用法跟同樣繼承自TSTREAM的MEMSTREAM差不多 }
    { 但檔案還是在硬碟里,用指標來讀取,而MEMSTREAM,則是把檔案全讀進記憶体里 }
{...}
我不懂,不懂,不懂....所以我才來ktop學工夫
系統時間:2024-05-08 3:05:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!