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

縮圖程式問題

尚未結案
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-08 14:24:00 IP:220.130.xxx.xxx 訂閱
各位大大您好:

我有一個縮圖程式,照著範例所改,但當圖片大於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;


------
.......
系統時間:2024-05-06 3:42:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!