如何開一張圖 |
尚未結案
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
//---------------------------------------------------------------------------
#include
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: //--------------------------------------------------------------------------- #includeJASONWAR 你好: 請參考以下的連結文章
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: for (i=1;i<=512;i ) { for (j=1;j<=512;j ) { fread(&temp_eng[i][j],1,1,fp); } 宣告[512][512]矩陣,index應該為[0..511],[0..511] 所以loop要改成 //i=0;i<512;i //j=0;j<512;j#include |
China Join
中階會員 發表:81 回覆:242 積分:89 註冊:2003-03-12 發送簡訊給我 |
|
fangback
初階會員 發表:4 回覆:47 積分:40 註冊:2002-06-15 發送簡訊給我 |
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: lena ... 512 ... 512 ... 你不會是陳同孝老師的學生ㄅ~呵 上面幾位前輩轉貼的連結文章都寫得很好ㄚ,要做影像特效處理也夠用了,這個問題首先請妳先確認圖檔格式是否為 RAW ,另外大小是否為 512 * 512 ,不然用作弊的方法,先用 Image 元件把圖片讀出來,再對上面的點作處理好ㄌ GOOD LUCK !! >>< face="Verdana, Arial, Helvetica"> 不是ㄝ...陳同孝?=.=...我ㄉ圖沒有副檔名...但是他可以用matlab開啟,大小是512 * 512沒錯..還有請問raw是甚ㄇ格式阿... |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
China Join
中階會員 發表:81 回覆:242 積分:89 註冊:2003-03-12 發送簡訊給我 |
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
JASONWAR您好:
若方便的話可以將您的程式與SOURCE放到[會員求助程式檔案上傳區]
http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97
因為沒有SOURCE很難發現問題所在< > 順心< >
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
抱歉,上一篇我寫錯了..應該是
---------------------------------------
int main()
{
FILE* fp;
int image_size=512*512;
int temp_eng[image_size]={0}; clrscr(); fp=fopen("lena","rb");
fread(temp_eng,1,image_size,fp);
fclose(fp);
}
這是用一維陣列存放影像值;
每個點的值 (x,y)=temp_eng[x 512*y];
不知是否合用?
--------------------------------------
即然是raw data可以用一維陣列存放,一般影像處理都是用一維陣列比較有效率
如果要用二維陣列存放,在陣列的存放時,就要改變一下,temp_eng[y][x],這樣
你會發現比較好做影像處理
|
brant
一般會員 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
在 windows 一個 int 4bytes,512*512個int共1MB,給local variable 用的stack可能沒有那麼大,問題應該是出在這邊。
試試把存放圖檔資料的變數改為指標,用動態配置記憶體的方式處理
做完記得把記憶體 free 掉:
int *temp_eng = new int[512*512]; ..... ..... delete temp_eng;發表人 - brant 於 2003/04/07 16:04:26 發表人 - brant 於 2003/04/07 16:19:41 |
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: JASONWAR您好: 若方便的話可以將您的程式與SOURCE放到[會員求助程式檔案上傳區] http://delphi.ktop.com.tw/forum.asp?FORUM_ID=97 因為沒有SOURCE很難發現問題所在< > 順心< >SOURCE已放到上傳區ㄌ...幫我看看問題在哪~~ |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
JASONWAR您好:
我的BCB是5.0版所以我無法開啟您的專案檔
我的方式您參考看看,我測試過並沒有問題 < class="code">
byte pixel[300000]="0";
byte color;
int x,y;
int count=0; if (OpenDialog1->Execute())
{
TMemoryStream* ima = new TMemoryStream();
ima->LoadFromFile(OpenDialog1->FileName);
BYTE bBuf=0; for (int i=0;i < ima->Size;i )
{
ima->Position=i;
bBuf=i;
ima->Read(&bBuf,1);
pixel[i]=bBuf;
} delete ima;
} for (y=0;y<512;y )
{
for (x=0;x<512;x )
{
color=pixel[count];
SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
count ;
}
}
上面的方式可以達到您的需求...
但只要作些許的改變便可以讀取任何RAW Data的影像 順心 發表人 -
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
JASONWAR 你好:
1.
測試一下結果,我發現在下面這行會出問題
fread(&temp_eng[i][j],1,1,fp);
你的意思應該是要一次讀個一個byte,並儲存到相對應的(i,j)
不過fread好像不能這麼用,我測出的資料是全黑的一片,表示
矩陣都沒有把資料讀進來。我建議你用getc()來讀檔,如下 temp_eng[i][j] = getc(fp);....測試過,真的可以用^^ 2.不過看到的圖,是左旋轉90度,因為Lena的圖片資料,是一列一列存放
所以你迴圈的最外圈,要先從y軸開始,也就是
for (j=0;j<512;j )
{
for (i=0;i<512;i )
{
temp_eng[i][j] = getc(fp);
}
}
得到圖就正確囉^^
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
FILE *fp;
int i,j,temp_eng[512][512];
//char clr; fp=fopen("lena","rb");
//Image1->Width=512;
//Image1->Height=512; for (j=0;j<512;j )
{
for (i=0;i<512;i )
{
fread(&temp_eng[i][j],1,1,fp);
clr = temp_eng[i][j];
//Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr);
}
}
fclose(fp);
---------------------------------------------------------------------
JASONWAR你好:
我用你的程式,上面只是加上show圖的碼,把temp_eng的資料型態改成char,其他
都一樣,結果是"正確",因為我沒小心去求証,所以才會說fread不能這樣用,抱歉
驗証的結果是可以的...你把
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
FILE *fp;
int i,j,temp_eng[512][512];
//char clr; fp=fopen("lena","rb");
//Image1->Width=512;
//Image1->Height=512; for (j=0;j<512;j )
{
for (i=0;i<512;i )
{
fread(&temp_eng[i][j],1,1,fp);
clr = temp_eng[i][j];
//Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr);
}
}
fclose(fp);
---------------------------------------------------------------------
JASONWAR你好:
我用你的程式,上面只是加上show圖的碼,把temp_eng的資料型態改成char,其他
都一樣,結果是"正確",因為我沒小心去求証,所以才會說fread不能這樣用,抱歉
驗証的結果是可以的...你把
|
brant
一般會員 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
引言: FILE *fp; int i,j,temp_eng[512][512]; //char clr; fp=fopen("lena","rb"); //Image1->Width=512; //Image1->Height=512; for (j=0;j<512;j ) { for (i=0;i<512;i ) { fread(&temp_eng[i][j],1,1,fp); clr = temp_eng[i][j]; //Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); } } fclose(fp); --------------------------------------------------------------------- JASONWAR你好: 我用你的程式,上面只是加上show圖的碼,把temp_eng的資料型態改成char,其他 都一樣,結果是"正確",因為我沒小心去求証,所以才會說fread不能這樣用,抱歉 驗証的結果是可以的...你把>>< face="Verdana, Arial, Helvetica"> 一次讀一個 byte ,可是是放在 int 的 highest byte 的位置 (&temp_eng[][]是一個指向 int 的指標) 0xff 就變成 0xff000000,值差很多。 |
brant
一般會員 發表:1 回覆:64 積分:23 註冊:2003-04-07 發送簡訊給我 |
引言: FILE *fp; int i,j,temp_eng[512][512]; //char clr; fp=fopen("lena","rb"); //Image1->Width=512; //Image1->Height=512; for (j=0;j<512;j ) { for (i=0;i<512;i ) { fread(&temp_eng[i][j],1,1,fp); clr = temp_eng[i][j]; //Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); } } fclose(fp); --------------------------------------------------------------------- JASONWAR你好: 我用你的程式,上面只是加上show圖的碼,把temp_eng的資料型態改成char,其他 都一樣,結果是"正確",因為我沒小心去求証,所以才會說fread不能這樣用,抱歉 驗証的結果是可以的...你把>>< face="Verdana, Arial, Helvetica"> 一次讀一個 byte ,可是是放在 int 的 highest byte 的位置 (&temp_eng[][]原本是一個指向 int 的指標) 0xff 就變成 0xff000000,值差很多。 改成 char , array 的大小變 256K,stack 可能就不會爆 不過還是建議不要在函式內宣告這麼大的變數。 |
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: FILE *fp; int i,j,temp_eng[512][512]; //char clr; fp=fopen("lena","rb"); //Image1->Width=512; //Image1->Height=512; for (j=0;j<512;j ) { for (i=0;i<512;i ) { fread(&temp_eng[i][j],1,1,fp); clr = temp_eng[i][j]; //Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); } } fclose(fp); --------------------------------------------------------------------- JASONWAR你好: 我用你的程式,上面只是加上show圖的碼,把temp_eng的資料型態改成char,其他 都一樣,結果是"正確",因為我沒小心去求証,所以才會說fread不能這樣用,抱歉 驗証的結果是可以的...你把>>< face="Verdana, Arial, Helvetica"> 感謝JerryKuo和各位前被如此細心ㄉ指導我馬上ㄑ試試... 還有//後是加上去ㄉ嗎..... |
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
我程式如下:
#include
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
JASONWAR您好:
引言:compile後 [Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr);]這一行說 不能定義image1.....是怎ㄇ回事...我覺得您的目的有一點怪?? 假如您只是要將lena影像的各點像素值存到矩陣中 temp_eng[i][j]就是了... 而Image是VCL元件,讓您的程式是在[有介面]的環境底下來呈現lena圖 Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); 所以您應該沒有將Image元件放在您的Form上吧?? 順心 |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
JASONWAR你好:
1.char clr;
2.Image1->Width=512;
3.Image1->Height=512;
4.clr = temp_eng[i][j];
5.Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr);
都是要讓檔案讀出的圖,秀在BCB介面上,看得到才知道正不正確,不是嗎^^ 不曉得你是用bcb,或是純dos c 寫的?...
如果你是用bcb,可以拉一個TImage物件在Form上,把上面的code加在適當的
地方,就可以看到美麗的Lena^^...
|
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: JASONWAR您好:引言:compile後 [Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr);]這一行說 不能定義image1.....是怎ㄇ回事...我覺得您的目的有一點怪?? 假如您只是要將lena影像的各點像素值存到矩陣中 temp_eng[i][j]就是了... 而Image是VCL元件,讓您的程式是在[有介面]的環境底下來呈現lena圖 Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); 所以您應該沒有將Image元件放在您的Form上吧?? 順心 >>< face="Verdana, Arial, Helvetica"> 我有將Image元件放Form上,但因為不太會用vcl也就是不太會設他ㄉ屬性,之前都用純dos c 寫,現在是用bcb寫ㄉ... 1.char clr; 2.Image1->Width=512; 3.Image1->Height=512; 4.clr = temp_eng[i][j]; 5.Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); 現在就是問第五項是怎ㄇ設ㄉ因為我在左邊沒找到image1ㄉcanvas屬性 ....就是這樣......^^...... |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
JASONWAR您好:
引言: 我有將Image元件放Form上,但因為不太會用vcl也就是不太會設他ㄉ屬性,之前都用純dos c 寫,現在是用bcb寫ㄉ... 1.char clr; 2.Image1->Width=512; 3.Image1->Height=512; 4.clr = temp_eng[i][j]; 5.Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); 現在就是問第五項是怎ㄇ設ㄉ因為我在左邊沒找到image1ㄉcanvas屬性現在是用BCB,您就要善加利用其便利性囉(VCL) 建議您可以買一本> 後 > 發表人 - |
JASONWAR
一般會員 發表:8 回覆:21 積分:5 註冊:2002-08-31 發送簡訊給我 |
引言: JASONWAR您好:引言: 我有將Image元件放Form上,但因為不太會用vcl也就是不太會設他ㄉ屬性,之前都用純dos c 寫,現在是用bcb寫ㄉ... 1.char clr; 2.Image1->Width=512; 3.Image1->Height=512; 4.clr = temp_eng[i][j]; 5.Image1->Canvas->Pixels[i][j]=(TColor)RGB(clr,clr,clr); 現在就是問第五項是怎ㄇ設ㄉ因為我在左邊沒找到image1ㄉcanvas屬性現在是用BCB,您就要善加利用其便利性囉(VCL) 建議您可以買一本> 後 > 發表人 - >>< face="Verdana, Arial, Helvetica"> 版主我會不會問太多阿,我很不好意思ㄋ,但是照你所說ㄉ我先開啟新檔選擇application然後再additional拉出image到form1再來鍵入image1打到->後 就跳出錯誤[c error]unit1.cpp(1):unable to invoke code completion due to errors in source code會不是我ㄉbcb6.0該重灌ㄌ..... 問這ㄇ多濫問題在這裡先跟大家說個抱歉.......=.= |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
JASONWAR您好:
引言: 版主我會不會問太多阿,我很不好意思ㄋ,但是照你所說ㄉ我先開啟新檔選擇application然後再additional拉出image到form1再來鍵入image1打到->後 就跳出錯誤[c error]unit1.cpp(1):unable to invoke code completion due to errors in source code會不是我ㄉbcb6.0該重灌ㄌ.....不會問太多,若有滿意的答覆記得要給分鼓勵答題者喔< > 初學者有很多類似的疑問,以後就可以引用這篇文章囉< > 您執行BCB之後便有一個Form在您的畫面上,您只要將Image元件 放在Form上接下來,按照之前所描述的方式就可以了... 您可以參考下面連結的範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26672 讓您對BCB有更深一步的了解 順心 發表人 - |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |