如何製作如ACD快速顯示圖片 |
尚未結案
|
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
各位大大:
BCB要如何做出像ACD顯示圖時快速,以下是我用的方法,但是在顯示是遇到上百張時速度慢的不行,是否要寫執行緒的方式顯示,請大大指點。
void __fastcall TShowMainForm::TreeViewChange(TObject *Sender, TTreeNode *Node)
{
TSearchRec sr;
TListItem *ListItem;
NowSelectPath = TreeViewGetPath(Node);
int iPicCount=0; ImageList1->Clear();
ListView1->Items->Clear(); if ( !FindFirst(NowSelectPath "\\*.jpg",faAnyFile, sr) )
{
do
{
TJPEGImage *PicJpg = new TJPEGImage();
try
{
PicJpg->LoadFromFile(NowSelectPath "\\" sr.Name);
}
catch(...)
{
ShowMessage(NowSelectPath "\\" sr.Name);
}
Graphics::TBitmap *DestBmp = new Graphics::TBitmap();
float JpgWidth = PicJpg->Width;
float JpgHeight = PicJpg->Height;
DestBmp->Width=180;
DestBmp->Height=180;
DestBmp->Canvas->StretchDraw(Rect(1,1,JpgWidth,JpgHeight),PicJpg); ListItem = ListView1->Items->Add();
ListItem->Caption = sr.Name; ListItem->ImageIndex = ImageList1->Add(DestBmp,NULL);
delete PicJpg;
delete DestBmp; StatusBar1->Panels->Items[0]->Text = "Total : " IntToStr( iPicCount) " Jpeg.";
Application->ProcessMessages();
}
while ((!FindNext(sr)) && (!bCloseForm)); FindClose(sr);
}
}
//---------------------------------------------------------------------------
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 各位大大: BCB要如何做出像ACD顯示圖時快速,以下是我用的方法,但是在顯示是遇到上百張時速度慢的不行,是否要寫執行緒的方式顯示,請大大指點。 void __fastcall TShowMainForm::TreeViewChange(TObject *Sender, TTreeNode *Node) { TSearchRec sr; TListItem *ListItem; NowSelectPath = TreeViewGetPath(Node); int iPicCount=0; ImageList1->Clear(); ListView1->Items->Clear(); if ( !FindFirst(NowSelectPath "\\*.jpg",faAnyFile, sr) ) { do { TJPEGImage *PicJpg = new TJPEGImage(); try { PicJpg->LoadFromFile(NowSelectPath "\\" sr.Name); } catch(...) { ShowMessage(NowSelectPath "\\" sr.Name); } Graphics::TBitmap *DestBmp = new Graphics::TBitmap(); float JpgWidth = PicJpg->Width; float JpgHeight = PicJpg->Height; DestBmp->Width=180; DestBmp->Height=180; DestBmp->Canvas->StretchDraw(Rect(1,1,JpgWidth,JpgHeight),PicJpg); ListItem = ListView1->Items->Add(); ListItem->Caption = sr.Name; ListItem->ImageIndex = ImageList1->Add(DestBmp,NULL); delete PicJpg; delete DestBmp; StatusBar1->Panels->Items[0]->Text = "Total : " IntToStr( iPicCount) " Jpeg."; Application->ProcessMessages(); } while ((!FindNext(sr)) && (!bCloseForm)); FindClose(sr); } } //---------------------------------------------------------------------------kevintam 你好: 先請問一下~~你是一次先載入所有的圖檔嗎?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
引言: kevintam您好: 您可以利用Timer來作連續讀圖檔的動作... 我測試過連續讀上千張圖檔都不會有問題.... 我們是同行ㄝ,我也有在做監視系統 ^_^您好: 我連續讀取是沒有問題,但是在顯示圖的速度大大折扣了,因為我是利用搜尋圖案再利用ImageList加入ListItem(程式如下),此時它會連續RUN但是要等到他完全讀取完時才會結束,效率上大大折扣;您在監控系統要顯示全部圖片是如何寫的,我是想做出和ACD一樣顯示圖片的方式.....希望各位大大指點 Graphics::TBitmap *DestBmp = new Graphics::TBitmap(); float JpgWidth = PicJpg->Width; float JpgHeight = PicJpg->Height; DestBmp->Width=180; DestBmp->Height=180; DestBmp->Canvas->StretchDraw(Rect(1,1,JpgWidth,JpgHeight),PicJpg); ListItem = ListView1->Items->Add(); ListItem->Caption = sr.Name; ListItem->ImageIndex = ImageList1->Add(DestBmp,NULL); |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 您好: 我連續讀取是沒有問題,但是在顯示圖的速度大大折扣了,因為我是利用搜尋圖案再利用ImageList加入ListItem(程式如下),此時它會連續RUN但是要等到他完全讀取完時才會結束,效率上大大折扣;您在監控系統要顯示全部圖片是如何寫的,我是想做出和ACD一樣顯示圖片的方式.....希望各位大大指點 kevintam 你好: 以下是我對你的問題的建議(參考看看) ( > (> --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
引言:引言: 您好: 我連續讀取是沒有問題,但是在顯示圖的速度大大折扣了,因為我是利用搜尋圖案再利用ImageList加入ListItem(程式如下),此時它會連續RUN但是要等到他完全讀取完時才會結束,效率上大大折扣;您在監控系統要顯示全部圖片是如何寫的,我是想做出和ACD一樣顯示圖片的方式.....希望各位大大指點kevintam 你好: 以下是我對你的問題的建議(參考看看) ( > (> -- >>< face="Verdana, Arial, Helvetica"> 感謝大大的指點.... 因為專題的需要,需要在教師點選到特定的目錄時,在顯示時就可以看到圖 片(大小約180*180,因為要讓老師看到是否有作幣的畫面,不需一個一個點 來看)我以有利用FindFirst的方式尋找出jpg的圖,但問題是在要顯示是效率不佳(找到時再將圖show出來),如ACD是先找到所以檔案數,再慢慢的顯示...... 我的專題介面和ACD顯示時的圖 http://tw.photo.yahoo.com/kevintam5566/ab1/ |
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: 我的專題介面和ACD顯示時的圖 http://tw.photo.yahoo.com/kevintam5566/ab1/參考這個範例試試! 1.類似 ACDsee 中縮圖瀏覽的功能 http://netcity1.web.hinet.net/UserData/nep2314/Datas/BmpViewer.zip 2.當圖片大於可視範圍時如何用滑鼠拖曳圖片,也就是ACDSee用滑鼠抓住圖片移動的功能。 http://netcity1.web.hinet.net/UserData/nep2314/Datas/MovePic.zip 3.利用BFbmpV11.zip元件所寫的簡單旋轉圖形的範例 ( BFbmpV11.zip 有附上 ) http://netcity1.web.hinet.net/UserData/nep2314/Datas/RotatePic.zip 資料來源:星點子工作室 http://www.sit.idv.tw/ 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/02/21 18:27:14 |
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
這個也可參考
【轉貼】用Delphi讀取JPEG文件的縮覽圖
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21809 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
引言: 這個也可參考 【轉貼】用Delphi讀取JPEG文件的縮覽圖 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21809 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起HI...jackkcg大大 我有試這去try您所寫的那個程式,但可能我Dephi不熟悉function不能用,是否可冒昧可有壓縮檔讓我參考,有些不懂的地方再請叫大大(Dephi轉BCB寫時)。 |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
應 j sir 的要請 我也來回答 你的問題 哈哈 我沒用過 bcb 只用過 bc
我幫你番番看,但不一定對 【轉貼】用Delphi讀取JPEG文件的縮覽圖
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21809 void BGR2RGB(TBitmap* bmp)
{ int x,y;
char t;
PCHAR data;
y=bmp->Height-1 ;
while (y>=0)
{ data=bmp->ScanLine[y]; for (x=0 ;x<=bmp.Width-1 ; x++)
{
//如果你圖 色彩是 24 BIT
t=data[x*3];
data[x*3]=data[x*3+2];
data[x*3+2]=t;
} Y--;
}
); TBitmap LoadThumb(string filename)
{ Tfilestream* fstream;
Tmemorystream* mstream; WORD j,i;
PCHAR data;
BYTE buf[4] ; DWORD filesize;
Tjpegimage* fjpg;
TBITMAP* bmp;
TBITMAP* result=NULL;
WORD* p; fstream=new Tfilestream(filename,fmOpenRead); //建立文件流,讀JPEG文件 fstream->Seek(20,soFromBeginning); //FF ED段在文件的第20個位元組處
fstream->Read(buf,sizeof(buf)); p=(WORD*)buf; if (p*==0xEDFF)
{
j=buf[2]*256+buf[3]; //FF ED的大小,高位在前,低位元在後
if (j<1024) //FF ED段的大小若?1024個位元組則文件不包含縮覽圖,退出程式
{
delete fstream;
return result;
} mstream=new TMemorystream;//建立記憶體流
mstream->CopyFrom(fstream,j); //把FF ED段拷貝到mstream
data=mstream.Memory; for (i=300;i<=700;i++) //找縮覽圖的開始標誌FF D8
{
p=(WORD*)&Data[i];
if (p*==0xD8FF) break; if (i<700)
{
fjpg=new Tjpegimage; //建立TJPEGimage 解出縮覽圖
bmp=new TBitmap; mstream->Position=i; fjpg->LoadFromStream(mstream);//fjpg讀取mstream bmp->Assign(fjpg); //JPEG轉BMP p=(WORD*)&Data[i+57];
if (p*==0x2e34) //PhotoShop 4.0的縮覽圖
BGR2RGB(bmp); //BMP的圖元格式BGR 而不是RGB,要把BGR轉化?RGB result=bmp; //函數返回BMP
delete mstream;
delete fjpg; //釋放Object };
}; delete fstream; return result; }; 發表人 - cmf 於 2003/02/24 09:48:41 發表人 - cmf 於 2003/02/24 12:50:45
------
︿︿ |
kevintam
一般會員 發表:7 回覆:11 積分:3 註冊:2003-02-14 發送簡訊給我 |
引言:axsoft大大: 我在顯示圖片時有引用http://netcity1.web.hinet.net/UserData/nep2314/Datas/BmpViewer.zip這支程式改成顯示jpg格式,但效率上如同上述問題一樣。 目前正在使用cmf大大所指點的程式做修改,但還是有一連串的錯誤;不知大大您是否也有空閒幫小弟也try看看.....相關的錯誤我整理完再一並po出來,請教各位大大。引言: 我的專題介面和ACD顯示時的圖 http://tw.photo.yahoo.com/kevintam5566/ab1/參考這個範例試試! 1.類似 ACDsee 中縮圖瀏覽的功能 http://netcity1.web.hinet.net/UserData/nep2314/Datas/BmpViewer.zip 2.當圖片大於可視範圍時如何用滑鼠拖曳圖片,也就是ACDSee用滑鼠抓住圖片移動的功能。 http://netcity1.web.hinet.net/UserData/nep2314/Datas/MovePic.zip 3.利用BFbmpV11.zip元件所寫的簡單旋轉圖形的範例 ( BFbmpV11.zip 有附上 ) http://netcity1.web.hinet.net/UserData/nep2314/Datas/RotatePic.zip 資料來源:星點子工作室 http://www.sit.idv.tw/ 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/02/21 18:27:14 |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |