---- 2. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
---- 3. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
---- 4. property Position: Longint;
---- 5. property Size: Longint
---- Read錛學rite錛孲eek閮芥槸綰櫄鍑芥暟錛屾彁渚涗簡鏁版嵁璇誨啓鍜屽畾浣嶇殑鎶借薄鐨勬柟娉曘俁ead鏂規硶灝嗘暟鎹粠Stream涓鍒癇uffer緙撳啿鍖轟腑錛學rite鍒欏疄鐜扮浉鍙嶇殑鎿嶄綔錛岃繑鍥炲艱〃紺哄疄闄呰鍐欐暟鎹殑澶у皬銆係eek鎻愪緵浜嗗湪Stream涓Щ鍔ㄦ暟鎹寚閽堢殑鏂規硶銆傚弬鏁癘rigin鍙互鍙杝oFromBeginning錛宻oFromCurrent錛宻oFromEnd 涓変釜鍊鹼紝Offset鏄亸縐婚噺錛岃繑鍥炲兼槸褰撳墠Stream鏁版嵁鎸囬拡鐨勪綅緗?
---- Position琛ㄧず浜嗘暟鎹寚閽堝湪Stream涓殑浣嶇疆銆傝繖涓睘鎬ф槸鍙鍐欑殑錛屽畠瀹為檯涓婂氨鏄氳繃璋冪敤Seek鏂規硶瀹炵幇鐨勶紝鎵浠ュ疄闄呬嬌鐢ㄦ椂浣跨敤榪欎釜灞炴ф洿涓烘柟渚夸竴浜涖係ize灞炴ц〃紺哄綋鍓峉tream鐨勫ぇ灝忥紝瀵逛簬涓嶅悓鐨凷tream錛屾湁浜涙椂鍊欐槸鍙鐨勩?
---- 2. LoadFromStream(Stream: TStream); //浠庡綋鍓嶄綅緗鍏tream閲岀殑鏁版嵁
---- 瀹為檯浣跨敤鏃舵垜浠熀鏈笂鍙浣跨敤涓婇潰涓や釜鍑芥暟灝卞彲浠ヤ簡銆?
---- 鍒涘緩涓涓獥浣揊orm1錛屾斁緗笁涓寜閽産tnRead錛宐tnInvert錛宐tnSave鍜屼竴涓枃浠舵墦寮瀵硅瘽妗哋penDialog1浠ュ強鏁版嵁鎺т歡DataSource1錛孴able1錛宼est.
---- 浣跨敤Dephi鎻愪緵鐨凞atabase Desktop鍒涘緩涓涓〃test錛岃〃閲屾湁涓涓瓧孌靛煙Image錛屾暟鎹簱鏂囦歡鍚嶅瓨涓簍est.db銆傚湪紿椾綋涓婃斁緗竴涓猅Database鎺т歡dbTest錛屼竴涓猅Table鎺т歡Table1,涓涓狣ataSource鎺т歡DataSource1,涓涓猅DBNavigator鎺т歡DBNavigator1銆傚皢dbTest涓庡垰鎵岲esktop鍒涘緩鐨勬暟鎹簱鐩歌繛錛孴able1鐨凾ableName灞炴ц涓簍est.db錛孌ataSource1鐨凞ataSet灞炴ц涓篢able1錛孌BNavigator1鐨凞ataSource灞炴ц涓篋ataSource1錛孷isibleButtons灞炴у墠鍥涗釜璁句負TRUE銆傛澶栵紝灝哾btest鐨凜onnected璁句負TRUE錛孴able1鐨凙ctive灞炴ц涓篢RUE錛屼嬌寰楁暟鎹簱涓寮濮嬪氨澶勪簬鎵撳紑鐘舵併?
---- 浜嬩歡浠g爜緙栧啓濡備笅錛?
---- 1. btnRead鐨凜lick浜嬩歡錛岃繖閲屾紨紺轟簡TFileStream鐨勭敤娉曘?
var MS: TFileStream; begin if OpenDialog1.Execute then begin MS:=TFileStream.Create (OpenDialog1.FileName, fmOpenRead); Image1.Picture.Bitmap.LoadFromStream(MS); MS.Free; end; end;---- 2. btnInvert鐨凜lick浜嬩歡錛岃繖閲屾紨紺轟簡TMemoryStream鐨勭敤娉曘傚叾涓嬌鐢ㄤ簡Invert鍑芥暟錛岃繖鏄竴涓畝鍗曠殑灝嗗浘璞″弽鑹茬殑鍑芥暟錛堜粎瀵圭湡褰╁浘璞℃湁鏁堬級錛屽畠榪斿洖涓涓寚鍚戝鐞嗚繃鐨勫浘璞℃暟鎹潡鐨勬寚閽堛?
var M S: TMemoryStream; pImage: pointer; begin MS:=TMemoryStream.create; Image1.Picture.Bitmap.SaveToStream(MS); MS.Position:=0; pImage:=Invert(MS.Memory, MS.size); //Memory灞炴ф槸鎸囧悜瀹為檯鍐呭瓨鍧楃殑鎸囬拡 MS.Write(pImage^,MS.size); MS.Position:=0; //涓婁竴琛屼唬鐮佷嬌鎸囬拡縐誨埌浜哠tream鏈熬錛屾墍浠ヨ澶嶄綅 Image1.Picture.Bitmap.LoadFromStream(MS); FreeMem(pImage); MS.Free; end; Invert鍑芥暟濡備笅錛? function TForm1.Invert (pImage: pointer; size: Integer): pointer; var pData, pMem: PChar; i: Integer; begin pMem:=AllocMem(size); CopyMemory(pMem,pImage,size); pData:=pMem+54; for i:=0 to size-54-1 do begin pData^:=Char(not integer(pData^)); pData:=pData+1; end; Result:=pMem; end;---- 1. btnSave鐨凜lick浜嬩歡錛岃繖閲屾紨紺轟簡TMemoryStream鐨勫彟涓縐嶇敤娉曪紝灝哠tream涓殑鏁版嵁鍐欏埌鏁版嵁搴撲腑鍘匯?
var MS: TMemoryStream; begin MS:=TMemoryStream.create; Image1.Picture.Bitmap.SaveToStream(MS); MS.Position:=0; Table1.Append; //鍦ㄦ暟鎹簱涓坊鍔犱竴鏉¤褰? TBlobField(Table1.FieldbyName ('image')).LoadFromStream(MS); Table1.Post; //灝嗘墍浣滅殑鏇存柊鍐欏叆鏁版嵁搴? end;---- 4. DBNavigator1鐨凜lick浜嬩歡錛岃繖閲屾紨紺轟簡TBlobStream鐨勭敤娉曪紝浣跨敤浜嗗拰鍐欏叆鏃朵笉鍚岀殑鏂規硶鏉ヨ鍑烘暟鎹簱鐨勫浘璞℃暟鎹?
var MS: TStream; begin with Table1 do MS:=CreateBlobStream (FieldbyName('image'),bmRead); Image1.Picture.Bitmap. LoadFromStream(MS); MS.Free; end;---- 鐜板湪浣犲凡緇忚兘澶熷湪鏂囦歡錛屾暟鎹簱錛屽唴瀛樹腑浠繪剰璇誨啓鏁版嵁嫻佷簡銆傝瘯璇曠湅鍚э紒