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

關於bmp圖像像素讀入二維數組的問題?

尚未結案
jl
一般會員


發表:17
回覆:34
積分:10
註冊:2004-02-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-25 00:32:20 IP:202.175.xxx.xxx 未訂閱
各位高手們,想請教大家一個bmp圖形讀取的問題,請問delphi是否有不使用image的間接途徑,但又可讀取bmp的每個像素讀入二維數組中的呢?能否用stream的方法,有沒有實例可提供呢?感激不盡! 平常心活著
------
平常心活著
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-25 02:42:48 IP:219.68.xxx.xxx 未訂閱
有.. 假如是使用Stream的話.RGB要自己讀..例如24位元..就是BGRBGRBGR... 不會比使用Tbitmap快..  Tbitmap配合SCANLINE..可以很快的把直丟到陣列裡 既然尼說不使用IMAGE..那我想Tbitmap是最佳的解決方案    
 
type
   TRGB=record                 //0~255
      B:byte;
      G:byte;
      R:byte;
   end;
var
   input:Tbitmap;
   i:integer;
   RGB:array of array of TRGB;
begin
   input:=Tbitmap.Create;
   input.LoadFromFile('a.bmp');
   setlength(RGB,input.height,input.width);
   for i:=0 to input.height-1 do
      RGB[i]:= image.ScanLine[i];
end;
這時..RGB就是一個內函R..G..B..3個屬性的二維陣列了 RGB[列][行] 發表人 - geniustom 於 2004/03/26 00:41:32
jl
一般會員


發表:17
回覆:34
積分:10
註冊:2004-02-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-01 09:25:56 IP:202.175.xxx.xxx 未訂閱
To:geniustom 先感謝您的回答,但尚有少許問題未能解決 1.RGB[列][行],是指橫列直行嗎? 2.若在宣告時不用TYPE TRGB=record R:TByte G:TByte B:TByte 能否用RGB : array [1..max,1..3] of byte代替嗎? //max = 10000; 1..max--->陣列位置 1..3----->代表r.g.b的值 而RGB[列][行]的位置時,怎樣寫才可取得r.g.b的值呢? jl:仍在努力中 平常心活著
------
平常心活著
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-01 16:10:29 IP:61.67.xxx.xxx 未訂閱
1.YES
2.RGB : array [1..max,1..3] of byte代替嗎? //max = 10000;
  這有幾個缺點
  1.您只指定一個MAX..圖是二維的..您還要做一維轉二維的轉換
  2.您用靜態配置的方式..假如今天不知道圖的大小..
    您的MAX若過多..浪費記憶體..過少..程式會錯誤
  3.記憶體本身是一維的..要配合指標的位移..才能把一維轉二維因為看了您先前的文章..您不熟指標
    所以我才這麼寫..這樣才能讓您早點懂
  4.不寫TRGB也可行..不過必須要把它弄成三維陣列才方便使用..否則我想您會被搞混了
    例如 RGB :array of array of array[1..3] of byte;  才行
     RGB[1][2][3]:=0就代表第一列第2行的紅色=0    我把我的程式再做更多的註解..
type
   TRGB=record                //這是定義一個結構..由於在記憶體中是BGR的排列..
      B:byte;                 //所以一定要這樣宣告..
      G:byte;
      R:byte;
   end;
var
   input:Tbitmap;
   i:integer;
   RGB:array of array of TRGB;
   //在這邊..array of array of TRGB..就是宣告一個二維陣列..
   //每個陣列的元素都是一個TRGB..每個TRGB各占3BYTES
begin
   input:=Tbitmap.Create;
   input.LoadFromFile('a.bmp');
   //以上是讀圖..
   setlength(RGB,input.height,input.width);
   //setlength是動態宣告陣列的大小..這邊是宣告這個陣列的大小為height列..width行
   for i:=0 to input.height-1 do
      RGB[i]:= image.ScanLine[i];
   //image.ScanLine[i]就是一次讀一列的TRGB到記憶體中..因為它是一次讀出一列的值
   //所以只要用一個迴圈來寫就好
  
   //-----------------------以上就讀圖完成了-------------------------
   RGB[1][2].R=255;
   RGB[1][2].G=0;
   RGB[1][2].B=0;
   //以上就是把那張圖的第一列第二行那個點變成純紅色
end;
結論...說了這麼多..如果不用指標..這應該是把圖讀到二元陣列的最佳方法了..我定義那個結構只是 讓您了解讀取圖檔的方法..而且使用也很方便...例如.RGB[列][行].R 希望您可以先仔細研究後再發問... GOOD LUCK
jl
一般會員


發表:17
回覆:34
積分:10
註冊:2004-02-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-03 05:27:53 IP:202.175.xxx.xxx 未訂閱
感謝geniustom的教導, 已明白及解決此問題 jl 平常心活著
------
平常心活著
系統時間:2024-07-01 2:59:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!