2017-09-13 40 views
0

我正在嘗試讀取PGM二進制文件(http://netpbm.sourceforge.net/doc/pgm.html)以填充基於0的整數二維矩陣(16位灰度值)。如何使用TStream填充整數矩陣

該文件可能是50兆,所以我試圖在一個調用中填充緩衝區。

我以前從來沒有對Streams做過任何事情,但Google的Delphi結果流可以追溯到20年前,並且是一個混亂的混亂,我無法找到自己的方式。

我已經成功地鎖定了德爾福(第一次是15年!)在運行使用指針和緩衝區的一些代碼(也可能是基於我的陳舊做法的誤解。)

這裏是我的僞代碼,按整數整數。有沒有辦法通過單個Stream調用來讀取和填充矩陣? (假設該文件在同一臺機器上創建的,所以字節性是一樣的。)

type 
     TMatrix: Array of Array of Integer; 

    procedure ReadMatrix(const AFileName: String; 
          const AStartingByte: Integer;   
          const AMaxRow: Integer; 
          const AMaxCol: Integer; 
          const AMatrix: TMatrix) 
    begin 
     SetLength(AMatrix, aMaxRow, aMaxCol); 
     Open(AFileName); 
     Seek(AStartingByte); 
     for Row := 0 to aMaxCol do 
     for Col := 0 to aMaxCol do 
      AMatrix[Row, Col] := ReadWord 
    end; 

而且,不,這不是一個家庭作業! :-)

+0

你的問題,你將不能夠在「一次調用」中用單或雙(取決於'Maxval'值)字節像素強度值填充二維整數數組。但爲什麼中間數組呢?你不想創建一個'TGraphic'後代和數據存儲器,例如作爲一個扁平的字節緩衝區(和索引像素在掃描線方式)? – Victoria

+0

爲什麼你需要在一次通話中完成這項工作?這將是可能的,但不是爲2d動態數組。您可以使用1d動態數組,然後執行自己的索引。 –

回答

2

如前所述,您無法在單個操作中讀取2D動態數組,因爲其內存不連續。但是每個一維子陣都可以填充。

我還將數組元素類型更改爲16位。如果你真的需要的Integer矩陣(它是32位的),那麼你必須讀16位數據和分配元素整數一個接一個

type 
     TMatrix = Array of Array of Word; 

procedure ReadMatrix(const AFileName: String; 
          const AStartingByte: Integer;   
          const AMaxRow: Integer; 
          const AMaxCol: Integer; 
          const AMatrix: TMatrix) 
var 
    FS: TFileStream; 
    Row: Integer; 
begin 
    SetLength(AMatrix, aMaxRow, aMaxCol); 
    FS := TFileStream.Create(AFileName, fmOpenRead); 
    try 
     FS.Position := AStartingByte; 
     for Row := 0 to aMaxRow - 1 do 
     FS.Read(AMatrix[Row, 0], SizeOf(Word) * aMaxCol); 
    finally 
     FS.Free; 
    end; 
end; 
+1

根據該格式規範,像素強度值也可以是單字節(但這是問題的錯誤)。 – Victoria

+1

@維多利亞我希望作者分析標題(至少他使用'AStartingByte') – MBo

+0

感謝MBo的代碼,以及你和維多利亞對我的使用的正面評價。我正在使用選項-4,因此強度總是一個字。 我真的很感謝你在這裏發佈。 – RobertFrank