縮圖程式問題 |
尚未結案
|
cat200188
中階會員 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
各位大大您好:
我有一個縮圖程式,照著範例所改,但當圖片大於100多張,會出現秀圖秀不出來,經debug後發現,是 Screen->Cursor = crHourGlass; const ThumbWidth = 92; // 縮圖寬度 const ThumbHeight = 69; // 縮圖高度 TColor bkColor = clSilver; // 縮圖的底色 (圖檔尺寸小於縮圖框尺寸時才會顯示出來) AnsiString GoDir = "c:\\my temp"; // 要處理縮圖的目錄位置 chdir(GoDir.c_str()); // 切換到指定目錄去 ListView3->Items->Clear(); // 清除 ListView 的所有內容 ListView3->Items->BeginUpdate(); // 作此設定可讓處理速度較為快些 ImageList3->Clear(); // 清除 ImageList 的所有內容 ImageList3->Width = ThumbWidth; // 設定 ImageList 存放圖像的寬度 ImageList3->Height = ThumbHeight; // 設定 ImageList 存放圖像的高度 TSearchRec Sr; // 設 Sr 為存放檔案資訊的結構變數 AnsiString FileName; // 設定檔案名稱之用的暫存變數 AnsiString FileExt; // 存放檔案的副檔名 int done = FindFirst("*.*", faDirectory | faAnyFile, Sr); while (done == 0) { Application->ProcessMessages(); if (!(Sr.Attr & faDirectory)) { // 如果是檔案 FileName = Sr.Name; // 取得檔案名稱 FileExt = ExtractFileExt(FileName).UpperCase(); // 取得檔案的副檔名,並轉為大寫字樣 // 若檔案類型為 .bmp, .jpg, .jpeg, .gif 才做成縮圖並顯示於 ListView 上 if (FileExt == ".BMP" || FileExt == ".JPG" || FileExt == ".JPEG" || FileExt == ".GIF") { TListItem* Item = ListView3->Items->Add(); // 添加 ListView 項目 Item->Caption = AnsiString(FileName); // 設定 ListView 項目的標題為檔案名稱 Graphics::TBitmap *Bitmap = new Graphics::TBitmap(); // 暫存之用的 Bitmap Bitmap->PixelFormat = pf24bit; if (FileExt == ".BMP") { // 如果是 .BMP 檔的話 Bitmap->LoadFromFile(FileName); } else if (FileExt == ".GIF") { // 如果是 .GIF 檔的話 TGIFGraphic *Gif = new TGIFGraphic(); // 透過 TGIFGraphic 來讀取 Gif->LoadFromFile(FileName); Bitmap->Assign(Gif); delete Gif; Gif = NULL; } else if (FileExt == ".JPG" || FileExt == ".JPEG") { // 如果是 .JPG 或 .JPEG 檔的話 TJPEGImage *JPEG = new TJPEGImage(); // 透過 TJPEGImage 來讀取 JPEG->Performance = jpBestSpeed; JPEG->Scale = jsEighth; JPEG->Scale = jsFullSize; JPEG->LoadFromFile(FileName); Bitmap->Assign(JPEG); delete JPEG; JPEG = NULL; } Graphics::TBitmap *DestBmp = new Graphics::TBitmap(); Bitmap->PixelFormat = pf24bit; DestBmp->Width = ThumbWidth; DestBmp->Height = ThumbHeight; // 以下三是將 DestBmp 填滿指定的底色 DestBmp->Canvas->CopyMode = cmSrcCopy; DestBmp->Canvas->Brush->Color = bkColor; DestBmp->Canvas->FillRect(Rect(0, 0, ThumbWidth, ThumbHeight)); int w = Bitmap->Width; int h = Bitmap->Height; int top; int left; // 如果讀入圖檔的尺寸超出縮圖的指定尺寸,就進行縮小比例的運算 if (Bitmap->Width > ThumbWidth || Bitmap->Height > ThumbHeight) { top = 0; left = 0; float f = (float)h / w; // 取得高度與寬度的比例 w = ThumbWidth; h = f * w; if (h > ThumbHeight) { // 如果計算出來的高度高過縮圖框的高度 h = ThumbHeight; w = h/f; left = (ThumbWidth-w) / 2; } else { top = (ThumbHeight-h) / 2; } SetStretchBltMode(DestBmp->Canvas->Handle, HALFTONE); // 大圖需縮小時作此設定會比較美觀 } else { // 如果讀入圖檔的尺寸小於縮圖的指定尺寸,就計算出居中顯示的位置 left = (ThumbWidth-w) / 2; top = (ThumbHeight-h) / 2; } // 將讀入的圖檔按照縮圖尺寸繪製到已經填滿底色的 Bitmap 物件上 DestBmp->Canvas->CopyRect(Rect(left, top, left w, top h), Bitmap->Canvas, Rect(0,0, Bitmap->Width, Bitmap->Height)); Item->ImageIndex = ImageList3->Add(DestBmp, NULL); // 將縮圖存入 ImageList delete DestBmp; DestBmp = NULL; delete Bitmap; Bitmap = NULL; } } done = FindNext(Sr); // 找尋目錄中的下一個檔案 } FindClose(Sr); ListView3->Items->EndUpdate(); Screen->Cursor = crDefault;
------
....... |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |