程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi制作仿Acdsee功能的圖片浏覽器

Delphi制作仿Acdsee功能的圖片浏覽器

編輯:Delphi

Delphi制作一個圖片浏覽器,風格和功能類似於著名的看圖軟件ACDSee,使用該程序可選擇驅動器任意文件夾中的圖片進行浏覽,如果圖片格式符合文件列表框中的過濾要求,就會在浏覽器底部的面板上顯示圖片縮微圖,一次最多可以顯示8 張。單擊每一張縮略圖,可以將其放大到本來的尺寸。程序運行界面如下圖所示:

Delphi實戰圖片浏覽器

基本設計思路:將綜合利用ListBox,FileListBox,DirectoryListBox 和DriveComboBox 等文件對話框,實現對圖像文件的浏覽。本程序的重點是實現圖像的處理,包括如何實現圖像的加載、圖像大小的縮放以及怎樣把同時顯示多幅圖片與文件處理功能結合起來。這幾個步驟的前後銜接需要進行妥善的處理。

具體設計步驟:

首先需要在指定的文件路徑中加載8 幅圖片,然後調整其尺寸以適應縮微圖像面板的大小,並將其在縮微面板上完整顯示出來。當點擊縮微圖像時,還需編寫代碼實現原圖浏覽。

1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
(4)選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Form 選項,則出現Form2 窗口,選擇“文件”菜單下的“另存為”命令,在彈出的對話框中為該Form 命名並將其保存在前幾步相同的目錄下。

2.修改窗口

(1)激活Form1 窗口。在構件選項板上選擇“標准”頁上的MainMenu 選項,將鼠標移到窗口中點擊,生產菜單圖標。雙擊菜單圖標,進入菜單編輯器,本例中菜單設置為“文件-退出”。
(2)選擇構件選項板上的“標准”頁,選擇其中的ListBox 選項,將鼠標移到窗口中點擊,按下鼠標左鍵拖動生成的對話框至合適的大小和位置;再“選擇構件選項板上的Win3.1 頁”分別選擇FileListBox,DirectoryListBox 和DriveComboBox 選項至窗口中。
(3)選擇構件選項板上的“附加”頁中的Bevel 選項,將其放置在窗口的底部,拖動鼠標調整其合適的大小和位置。再選擇“標准”選項卡中的Panel 選項,將其放置在Bevel之上,再放置7 個Panel 面板,將其平均分布在Bevel 之上。
(4)選擇構件選項板上的“附加”頁中的Image 選項,將其放置在Panel 面板之上。繼續為每個Panel 面板添加Image 構件。
(5)激活Form2 窗口,在構件選項板上選擇“附加”頁中的Image 選項,將其放置在Form2 窗口中央。
3.設置各構件屬性,在上面步驟中添加的構件屬性如下設置:

01 //窗口Form1 的屬性 02 Form1:TForm1 03 Height = 395 04 Left = 238 05 Top = 130 06 Width = 450 07 Name1 = Form1 08 Caption = ’圖片浏覽器’ 09 Color = clBtnFace 10 Font.Height = -11 11 Font.Name = MS Sans Serif 12 FormStyle = fsNormal 13 //DriveComboBox1 構件的屬性 14 DriveComboBox1:TDriveComboBox1 15 Height = 19 16 Left = 16 17 Top = 8 18 Width = 201 19 Name = DriveComboBox1 20 Color = clWindow 21 //FilterComboBox1 構件的屬性 22 FilterComboBox1:TFilterComboBox1 23 Height = 21 24 Left = 232 25 Top = 8 26 Width = 193 27 Name = FilterComboBox1 28 Color = clWindow 29 Filter = ’Picture Files(*.bmp;*.jpg)|*.bmp;*.jpg |Bmp Files(*.bmp)|*.bmp|Jpeg 30 Files(*.jpg)|*.jpg’ 31 //DirectoryListBox1 構件的屬性 32 DirectoryListBox1:TDirectoryListBox1 33 Height = 137 34 Left = 16 35 Top = 40 36 Width = 201 37 Name = DirectoryListBox1 38 Color = clWindow 39 //FileListBox1 構件的屬性 40 FileListBox1:TFileListBox1 41 Height = 137 42 Left = 232 43 Top = 40 44 Width = 193 45 Mask = ’*.bmp;*.jpg’ 46 Name = FileListBox1 47 Color = clWindow 48 //Bevel 構件的屬性 49 Bevel:TBevel 50 Height = 153 51 Left = 8 52 Top = 184 53 Width = 433 54 Name = Bevel1 55 //Panel1 構件的屬性 56 Panel1:Tpanel1 57 Height = 65 58 Left = 16 59 Top = 192 60 Width = 81 61 Name = Panel1 62 BevelLnner = bvLowered 63 BevelOuter = bvLowered 64 BevelWidth = 1 65 BorderStyle = bsSingle 66 BorderWidth = 0 67 //Image1 構件的屬性 68 Image1:TImage1 69 Height = 49 70 Left = 8 71 Top = 8 72 Width = 57 73 Name = Image1 74 ShowHint = True 75 Hint = ’點擊可放大圖像’ 76 (Panel2-8 以及Image2-8 的屬性在此省略。) 77 //窗口Form2 的屬性 78 Form2:TForm2 79 Height = 349 80 Left = 221 81 Top = 136 82 Width = 483 83 Name = bigForm 84 Caption = bigForm 85 FormStyle fsNormal 86 //Image 構件的屬性 87 Image:TImage 88 Height = 281 89 Left = 16 90 Top = 16 91 Width = 449 92 Name = bigImage 93 ShowHint = True 94 Hint = ’點擊圖片可以將其關閉’

詳細的代碼分析:
(1)在本例中需要編制多個輔助函數來實現圖像的加載、圖像大小的縮放、在面板上顯示多幅圖片、調整圖像尺寸大小以適應顯示面板的大小以及最後使圖像以原尺寸大小顯示。

procedure TForm1.loadpicture
procedure TForm1.updateshowbararray
procedure TForm1.unVisibleshowbar
procedure TForm1.initshowbararray
procedure TForm1.Clearshowbarcolor
procedure TForm1.setshowbarcolor
procedure TForm1.Visibleshowbar
procedure TForm1.bigvIEw
procedure TForm1.FormCreate
procedure TForm1.FormDestroy

各輔助函數的代碼參見具體程序。這些函數通用性很強,可以很方便地移植到別的程序中。在選取文件的操作中,需通過處理文件列表框中的OnClick()事件來完成,該過程的工作流程是這樣的:首先設置圖像不可見,並清理顯示區顏色,然後從當前的文件開始顯示8 個縮略圖(如果已到文件列表的末尾,將只顯示剩下的所有圖像縮略圖)。

Var startshownum,endshownum:integer //設置文件的起始位置
procedure TForm1.unVisibleshowbar //對不可見圖像的處理
procedure TForm1.Clearshowbarcolor //清理顯示區顏色

在編寫縮略圖中需要進行兩個步驟:第一是判斷文件格式並裝載起來;第二是按比例調整圖像寬高和顯示位置。前者利用函數Loadpicture() 完成, 後者利用函數Updateshowbararray()完成。在觀看原尺寸圖像時,需處理每一個圖像的OnClick()事件,利用BigVIEw 函數使圖像恢復本來的大小。

SetShowBarColor(CurrentSelectedNum) //設置選中圖像的顏色
BigView(CurrentSelectedNum) //利用BigVIEw()函數進行大圖觀看

窗體的初始化,需要同時執行InitShowBarArray ()和UnVisibleShowBar()這兩個函數。部分代碼如下:

jpgImage:=tjpegImage.Create;//在程序中加入一個TjpegImage 對象變量
pictureWidth:=80;
pictureHeight:=60;
initshowbararray;
unVisibleshowbar;//初始化設定

(2)當選擇不同的驅動硬盤時,文件夾列表中顯示不同的文件夾。DriveComboBox1的OnChange 事件代碼如下:

procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
Form1.DirectoryListBox1.Drive:=Form1.DriveComboBox1.Drive;
end;

(3)DirectoryListBox1 的OnChange 事件代碼如下:

procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
Form1.FileListBox1.Directory:=Form1.DirectoryListBox1.Directory;
end;

(4)當選擇不同的文件夾路徑時,在FileListBox1 中將顯示該文件夾中所有符合格式的圖像文件。點擊不同的文件,在底部的面板上可以看到該文件以下(含該圖像文件)8個圖像文件的縮略圖。FileListBox1 的OnClick 事件代碼如下:

procedure TForm1.FileListBox1Click(Sender: TObject);
var
startshownum,endshownum:integer;
begin
if filelistbox1.Items.count<>0 then
begin
unVisibleshowbar;
Clearshowbarcolor;
startshownum:=filelistbox1.ItemIndex;
if filelistbox1.ItemIndex+maxshowbmpnum<=filelistbox1.Items.count-1 then
endshownum:=filelistbox1.ItemIndex+maxshowbmpnum
else
endshownum:=filelistbox1.Items.count;
currentselectednum:=1;
setshowbarcolor(currentselectednum);
updateshowbararray(startshownum,endshownum);
Visibleshowbar(endshownum-filelistbox1.ItemIndex);
end;
end;

(5)點擊面板上方的圖像縮略圖,可以以原大小尺寸觀察該圖像,同時在新彈出窗口上方顯示該圖像文件的路徑,Image 構件的OnClick 事件代碼如下(以Image1 為例,其他類似):

procedure TForm1.Image1Click(Sender: TObject);
var
i:integer;
begin
i:=1;
currentselectednum:=1;
while i<=maxshowbmpnum do
begin
if showbararray[i].showImage=(sender as TImage) then
begin
currentselectednum:=i;
i:=i+maxshowbmpnum;
end
else
i:=i+1;
end;
Clearshowbarcolor;
setshowbarcolor(currentselectednum);
bigvIEw(currentselectednum);
end;

(6)點擊文件菜單中的退出按鈕,可以退出該圖像浏覽器,點擊該菜單的代碼如下:

procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;

(7)用鼠標點擊Unit2 的圖像,可以關閉該圖像,代碼如下:

procedure TbigForm.bigImageClick(Sender: TObject);
begin
Close;
end;

完整代碼如下:

vIEw source print? 001 unit Unit1; 002 interface 003 uses 004 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 005 ExtCtrls, FileCtrl, StdCtrls,Jpeg, Menus; 006 const maxshowbmpnum=8; 007 type 008 showarrayrecord=record 009 showImage:TImage; 010 backpanel:tpanel; 011 FileName:string[15]; 012 end; 013 TForm1 = class(TForm) 014 DriveComboBox1: TDriveComboBox; 015 DirectoryListBox1: TDirectoryListBox; 016 FilterComboBox1: TFilterComboBox; 017 FileListBox1: TFileListBox; 018 Bevel1: TBevel; 019 Panel1: TPanel; 020 Panel2: TPanel; 021 Panel3: TPanel; 022 Panel4: TPanel; 023 Panel5: TPanel; 024 Panel6: TPanel; 025 Panel7: TPanel; 026 Panel8: TPanel; 027 Image1: TImage; 028 Image2: TImage; 029 Image3: TImage; 030 Image4: TImage; 031 Image5: TImage; 032 Image6: TImage; 033 Image7: TImage; 034 Image8: TImage; 035 MainMenu1: TMainMenu; 036 N1: TMenuItem; 037 N2: TMenuItem; 038 procedure FormCreate(Sender: TObject); 039 procedure FormDestroy(Sender: TObject); 040 procedure FileListBox1Click(Sender: TObject); 041 procedure Image1Click(Sender: TObject); 042 procedure DirectoryListBox1Change(Sender: TObject); 043 procedure DriveComboBox1Change(Sender: TObject); 044 procedure Image2Click(Sender: TObject); 045 procedure Image3Click(Sender: TObject); 046 procedure Image4Click(Sender: TObject); 047 procedure Image5Click(Sender: TObject); 048 procedure Image6Click(Sender: TObject); 049 procedure Image7Click(Sender: TObject); 050 procedure Image8Click(Sender: TObject); 051 procedure N2Click(Sender: TObject); 052 private 053 { Private declarations } 054 public 055 { Public declarations } 056 jpgImage:TjpegImage; 057 pictureWidth,pictureHeight,currentselectednum:integer; 058 showbararray:array[1..maxshowbmpnum]of showarrayrecord; 059 fileext:string[4]; 060 procedure initshowbararray; 061 procedure unVisibleshowbar; 062 procedure Clearshowbarcolor; 063 procedure setshowbarcolor(const currentselectednum:integer); 064 procedure Visibleshowbar(const endnum:integer); 065 procedure updateshowbararray(var startnum:integer;const endnum:integer); 066 procedure loadpicture(const FileName:string;var destImage:TImage); 067 procedure bigvIEw(const currentclickednum:integer); 068 end; 069 var 070 Form1: TForm1; 071 implementation 072 uses Unit2; 073 {$R *.DFM} 074 procedure TForm1.loadpicture(const FileName:string;var destImage:tImage); 075 //在面板上顯示圖片子程序 076 begin 077 fileext:=ansilowercase(extractfileext(FileName)); 078 if fileext=’.bmp’ then 079 begin 080 destImage.picture.loadfromfile(FileName); 081 pictureWidth:=destImage.picture.Width; 082 pictureHeight:=destImage.picture.Height; 083 end 084 else 085 if fileext=’.jpg’ then 086 begin 087 jpgImage.loadfromfile(FileName); 088 destImage.picture.graphic:=jpgImage; 089 pictureWidth:=destImage.picture.Width; 090 pictureHeight:=destImage.picture.Height; 091 end; 092 end; 093 procedure TForm1.updateshowbararray(var startnum:integer;const endnum:integer); 094 //更新面板上顯示的圖片 095 var 096 i:integer; 097 Widthtimes,Heighttimes,smalltimes:real; 098 begin 099 i:=1; 100 if startnum<=endnum-1 then 101 begin 102 while startnum<endnum do 103 begin 104 showbararray[i].FileName:=filelistbox1.Items[startnum]; 105 loadpicture(directorylistbox1.directory+’\’+showbararray[i].FileName,showbararray[i]. 106 showImage); 107 Widthtimes:=pictureWidth/80; 108 Heighttimes:=pictureHeight/60; 109 if Widthtimes>=Heighttimes then 110 smalltimes:=Widthtimes 111 else 112 smalltimes:=Heighttimes; 113 showbararray[i].showImage.Width:=round(pictureWidth/smalltimes); 114 showbararray[i].showImage.Height:=round(pictureHeight/smalltimes); 115 showbararray[i].showImage.left:=(showbararray[i].backpanel.Width-showbararray[i]. 116 showImage.Width)div 2; 117 showbararray[i].showImage.top:=(showbararray[i].backpanel.Height-showbararray[i]. 118 showImage.Height)div 2; 119 inc(i); 120 inc(startnum); 121 end; 122 end; 123 end; 124 procedure TForm1.unVisibleshowbar;//對不可見圖像的處理 125 var 126 i:integer; 127 begin 128 for i:=1 to maxshowbmpnum do 129 begin 130 showbararray[i].backpanel.Visible:=False; 131 end; 132 end; 133 procedure TForm1.initshowbararray;//控制面板上顯示的圖片 134 var 135 i:integer; 136 begin 137 showbararray[1].showImage:=Image1; 138 showbararray[1].backpanel:=panel1; 139 showbararray[2].showImage:=Image2; 140 showbararray[2].backpanel:=panel2; 141 showbararray[3].showImage:=Image3; 142 showbararray[3].backpanel:=panel3; 143 showbararray[4].showImage:=Image4; 144 showbararray[4].backpanel:=panel4; 145 showbararray[5].showImage:=Image5; 146 showbararray[5].backpanel:=panel5; 147 showbararray[6].showImage:=Image6; 148 showbararray[6].backpanel:=panel6; 149 showbararray[7].showImage:=Image7; 150 showbararray[7].backpanel:=panel7; 151 showbararray[8].showImage:=Image8; 152 showbararray[8].backpanel:=panel8; 153 for i:=1 to maxshowbmpnum do 154 begin 155 showbararray[i].backpanel.caption:=’’; 156 end; 157 end; 158 procedure TForm1.Clearshowbarcolor;//清除圖片顯示區的顏色 159 var 160 i:integer; 161 begin 162 for i:=1 to maxshowbmpnum do 163 begin 164 showbararray[i].backpanel.color:=clBtnface; 165 end; 166 end; 167 procedure TForm1.setshowbarcolor(const currentselectednum:integer); //設置選中圖像的顏色 168 begin 169 showbararray[currentselectednum].backpanel.color:=clfuchsia; 170 end; 171 procedure TForm1.Visibleshowbar(const endnum:integer);//對可見圖像的處理 172 var 173 i:integer; 174 begin 175 for i:=1 to endnum do 176 showbararray[i].backpanel.Visible:=true; 177 end; 178 procedure TForm1.bigvIEw(const currentclickednum:integer); 179 var 180 isjpegoriconflag:boolean; 181 begin 182 with bigForm do 183 begin 184 isjpegoriconflag:=False; 185 fileext:=ansilowercase(extractfileext(showbararray[currentclickednum].FileName)); 186 pictureWidth:=showbararray[currentclickednum].showImage.picture.Width; 187 pictureHeight:=showbararray[currentclickednum].showImage.picture.Height; 188 if (fileext=’.jpg’)or(fileext=’.bmp’) then 189 isjpegoriconflag:=true; 190 bigImage.picture:=showbararray[currentclickednum].showImage.picture; 191 bigImage.Width:=pictureWidth; 192 bigImage.Height:=pictureHeight; 193 if(pictureHeight>bigForm.clIEntHeight) and (pictureWidth>bigForm._ 194 clIEntWidth) then 195 begin 196 bigImage.top:=0; 197 bigImage.left:=0; 198 end 199 else 200 if pictureHeight>bigForm.clIEntHeight then 201 begin 202 bigImage.top:=0; 203 bigImage.left:=(bigForm.clIEntWidth-pictureWidth)div 2; 204 end 205 else 206 if pictureWidth>bigForm.clIEntWidth then 207 begin 208 bigImage.top:=(bigForm.clIEntHeight-pictureHeight)div 2; 209 bigImage.left:=0; 210 end 211 else 212 begin 213 bigImage.top:=(bigForm.clIEntHeight-pictureHeight)div 2; 214 bigImage.left:=(bigForm.clIEntWidth-pictureWidth)div 2; 215 end; 216 color:=clblack; 217 caption:=directorylistbox1.directory+’\’+showbararray[currentclickednum].FileName; 218 show; 219 end; 220 end; 221 procedure TForm1.FormCreate(Sender: TObject);//初始化窗體 222 begin 223 jpgImage:=tjpegImage.Create; 224 pictureWidth:=80; 225 pictureHeight:=60; 226 initshowbararray; 227 unVisibleshowbar; 228 end; 229 procedure TForm1.FormDestroy(Sender: TObject); 230 begin 231 jpgImage.free; 232 end; 233 procedure TForm1.FileListBox1Click(Sender: TObject);//點擊圖像列表中的圖片 234 var 235 startshownum,endshownum:integer; 236 begin 237 if filelistbox1.Items.count<>0 then 238 begin 239 unVisibleshowbar; 240 Clearshowbarcolor; 241 startshownum:=filelistbox1.ItemIndex; 242 if filelistbox1.ItemIndex+maxshowbmpnum<=filelistbox1.Items.count-1 then 243 endshownum:=filelistbox1.ItemIndex+maxshowbmpnum 244 else 245 endshownum:=filelistbox1.Items.count; 246 currentselectednum:=1; 247 setshowbarcolor(currentselectednum); 248 updateshowbararray(startshownum,endshownum); 249 Visibleshowbar(endshownum-filelistbox1.ItemIndex); 250 end; 251 end; 252 procedure TForm1.Image1Click(Sender: TObject);//點擊圖片觀看原圖 253 var 254 i:integer; 255 begin 256 i:=1; 257 currentselectednum:=1; 258 while i<=maxshowbmpnum do 259 begin 260 if showbararray[i].showImage=(sender as TImage) then 261 begin 262 currentselectednum:=i; 263 i:=i+maxshowbmpnum; 264 end 265 else 266 i:=i+1; 267 end; 268 Clearshowbarcolor; 269 setshowbarcolor(currentselectednum); 270 bigvIEw(currentselectednum); 271 end; 272 (Image2、Image3、Image4、Image5、Image6、Image7 和Image8 的相關處理代碼,與Image1 類似,在此省略。) 273 procedure TForm1.DirectoryListBox1Change(Sender: TObject); 274 begin 275 Form1.FileListBox1.Directory:=Form1.DirectoryListBox1.Directory; 276 end; 277 procedure TForm1.DriveComboBox1Change(Sender: TObject);//改變驅動器事件 278 begin 279 Form1.DirectoryListBox1.Drive:=Form1.DriveComboBox1.Drive; 280 end; 281 procedure TForm1.N2Click(Sender: TObject); 282 begin 283 close;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved