亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi中保存圖像列表

2019-11-18 18:54:04
字體:
來源:轉載
供稿:網友
最近在做項目時遇到將圖像列表(TImageList)中一系列的圖像保存到指定的文件或二進制流中,以便在需要時進行動態恢復的情況。于是在Delphi的幫助中查找TImageList類相關的屬性、方法,遺憾的是Delphi在TImageList中并未提供SaveToFile和SaveToStream方法,所以針對TImageList目前的限制,必須采取其它的辦法來擴展TImageList的功能,以滿足實際項目的需要。
解決方法
方法一:
使用API函數ImageList_Write和ImageList_Read。二者都需要指定一個類型為IStream的參數,前者的作用是將指定句柄的圖像列表保存到類型為IStream的二進制流中;后者是從類型為IStream的二進制流中讀出原先保存的圖像列表,并且返回指向這個圖像列表的句柄。IStream是一個OLE對象,它在Delphi中的聲明為TStreamAdapter = class(TInterfacedObject, IStream),意為TStreamAdapter是從TInterfacedObject繼承下來的操縱 IStream接口的對象。通過TStreamAdapter對象可以實現Delphi內部TStream對象對ISTream接口對象的操縱。
方法二:
從TImageList繼承一個子類TImageListEx,實現自定義的SaveToFileEx和SaveToStreamEx方法。在默認情況下TImageList中保存的圖像是由普通圖像及其掩碼圖像組合而成,所以必須調用其基類TCustomImageList的PRotected部分提供的GetImages(Index: Integer; Image, Mask: TBitmap)方法,以獲得圖像列表中指定索引號的位圖及其掩碼位圖,之后分別保存到自定義的文件或二進制流中,此外還需提供LoadFromFileEx和LoadFromStreamEx方法從自定義的文件或二進制流中恢復圖像集合。
實現步驟
自定義的TImageListEx控件在Public部分一并實現了對上述兩種方法的封裝。
TImageListEx類源代碼如下:
unit ImageListEx;
interface
uses Windows, SysUtils, Classes, Graphics, Controls, Commctrl, ImgList, Consts;
type
TImageListEx = class(TImageList)
public
procedure LoadFromFile(const FileName: string);//實現API方式保存
procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
procedure LoadFromFileEx(const FileName: string);//實現自定義方式保存
procedure LoadFromStreamEx(Stream: TStream);
procedure SaveToFileEx(const FileName: string);
procedure SaveToStreamEx(Stream: TStream);
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('ImageListEx', [TImageListEx]);
end;
{ TImageListEx }
procedure TImageListEx.LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TImageListEx.LoadFromFileEx(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
LoadFromStreamEx(Stream);
finally
Stream.Free;
end;
end;
procedure TImageListEx.LoadFromStream(Stream: TStream);
var
SA: TStreamAdapter;
begin
SA := TStreamAdapter.Create(Stream);
try
Handle := ImageList_Read(SA);//將當前圖像列表的句柄指向從二進制流中得到的句柄
if Handle = 0 then
raise EReadError.CreateRes(@SImageReadFail);
finally
SA.Free;
end;
end;
procedure TImageListEx.LoadFromStreamEx(Stream: TStream);
var
Width, Height: Integer;
Bitmap, Mask: TBitmap;
BinStream: TMemoryStream;
procedure LoadImageFromStream(Image: TBitmap);
var
Count: DWord;
begin
Image.Assign(nil);
Stream.ReadBuffer(Count, SizeOf(Count));//首先讀出位圖的大小
BinStream.Clear;
BinStream.CopyFrom(Stream, Count);//接著讀出位圖
BinStream.Position := 0;//流指針復位
Image.LoadFromStream(BinStream);
end;
begin
Stream.ReadBuffer(Height, SizeOf(Height));
Stream.ReadBuffer(Width, SizeOf(Width));
Self.Height := Height;
Self.Width := Width;//恢復圖像列表原來的高度、寬度
Bitmap := TBitmap.Create;
Mask := TBitmap.Create;
BinStream := TMemoryStream.Create;
try
while Stream.Position <> Stream.Size do
begin
LoadImageFromStream(Bitmap);//從二進制流中讀出位圖
LoadImageFromStream(Mask);//從二進制流中讀出掩碼位圖
Add(Bitmap, Mask);//將位圖及其掩碼位圖合并添加到圖像列表中
end;
finally
Bitmap.Free;
Mask.Free;
BinStream.Free;
end;
end;
procedure TImageListEx.SaveToFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TImageListEx.SaveToFileEx(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStreamEx(Stream);
finally
Stream.Free;
end;
end;
procedure TImageListEx.SaveToStream(Stream: TStream);
var
SA: TStreamAdapter;
begin
SA := TStreamAdapter.Create(Stream);
try
if not ImageList_Write(Handle, SA) then//將當前圖像列表保存到二進制流中
raise EWriteError.CreateRes(@SImageWriteFail);
finally
SA.Free;
end;
end;
procedure TImageListEx.SaveToStreamEx(Stream: TStream);
var
I: Integer;
Width, Height: Integer;
Bitmap, Mask: TBitmap;
BinStream: TMemoryStream;
procedure SetImage(Image: TBitmap; IsMask: Boolean);
begin
Image.Assign(nil);//清除上一次保存的圖像,避免出現圖像重疊
with Image do
begin
if IsMask then MonoChrome := True;//掩碼位圖必須使用單色
Height := Self.Height;
Width := Self.Width;
end;
end;
procedure SaveImageToStream(Image: TBitmap);
var
Count: DWORD;
begin
BinStream.Clear;
Image.SaveToStream(BinStream);
Count := BinStream.Size;
Stream.WriteBuffer(Count, SizeOf(Count));//首先保存位圖的大小
Stream.CopyFrom(BinStream, 0);//接著保存位圖
end;
begin
Height := Self.Height;
Width := Self.Width;
Stream.WriteBuffer(Height, SizeOf(Height));//保存原圖像列表的高度
Stream.WriteBuffer(Width, SizeOf(Width));//保存將原圖像列表的寬度
Bitmap := TBitmap.Create;
Mask := TBitmap.Create;
BinStream := TMemoryStream.Create;
try
for I := 0 to Count - 1 do//遂一保存圖像列表中的圖像
begin
SetImage(Bitmap, False);
SetImage(Mask, True);
GetImages(I, Bitmap, Mask);//取得指定索引號的位圖及其掩碼位圖
SaveImageToStream(Bitmap);//保存位圖到二進制流中
SaveImageToStream(Mask);//保存掩碼位圖到二進制流中
end;
finally
Bitmap.Free;
Mask.Free;
BinStream.Free;
end;
end;
end.
下面示范在Delphi中的使用方法:
首先在Delphi中新建一個項目,然后在Form1上放置一個ImageListEx控件,一個TreeView控件和四個Button控件。將TreeView控件的Images屬性與ImageListEx相關聯,在ImageListEx中任意添加幾幅圖像,在TreeView中添加相應數量的項目,項目的ImageIndex屬性分別對應于ImageListEx中圖像的索引號。現在TreeView中每個項目之前已經能夠顯示出相應的圖標。
最后,在Button1的OnClick事件中寫上:
ImageListEx1.SaveToFile('C:CJ.dat');
ImageListEx1.SaveToFileEx('C:CJEx.dat');
在Button2的OnClick事件中寫上:ImageListEx1.Clear;
在Button3的OnClick事件中寫上:ImageListEx1.LoadFromFile('C:CJ.dat');
在Button4的OnClick事件中寫上:ImageListEx1.LoadFromFileEx('C:CJEx.dat');
運行程序,首先單擊Button1,之后單擊Button2,最后任意單擊Button3或Button4,可以看到程序能夠將圖像列表中的圖像保存到指定的文件中,可以從指定的文件中正確的恢復并顯示。
結束語
本文介紹的內容已用于解決本人在實際項目中遇到的情況,也希望同樣遇到此問題的程序員能夠從中找到答案。以上代碼在 Delphi5.0、Windows2000 Server 中調試運行通過。

上一篇:在Delphi中調用Flash

下一篇:創建良好設計的代碼(基于Delphi/VCL)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91精品网站| 久久av在线播放| 国产精品久久久久久久久借妻| 亚洲精品视频网上网址在线观看| 亚洲人成网站免费播放| 久久九九全国免费精品观看| 亚洲网站在线看| 久久亚洲一区二区三区四区五区高| 成人福利网站在线观看11| 亚洲成人久久网| 中文字幕视频在线免费欧美日韩综合在线看| 久久久免费在线观看| 久久久久久久久久久av| 色av中文字幕一区| 久久久久中文字幕2018| 亚洲亚裔videos黑人hd| 日韩av中文字幕在线| 热久久这里只有精品| 亚洲成人激情视频| 亚洲精品成a人在线观看| 欧美日韩亚洲视频| 一道本无吗dⅴd在线播放一区| 福利一区视频在线观看| 久久成人亚洲精品| 欧美最猛性xxxxx(亚洲精品)| 久久青草精品视频免费观看| 91精品国产综合久久男男| 国产成人精品一区二区在线| 国产一区二区三区在线观看视频| 97视频在线观看免费| 亚洲国产高清自拍| 日韩欧美国产成人| 久久久久久av| 在线观看亚洲视频| 4438全国亚洲精品在线观看视频| 日韩av在线电影网| 亚洲欧美中文日韩在线| 久久九九全国免费精品观看| 成人精品久久一区二区三区| 国产精品嫩草影院久久久| 国产亚洲aⅴaaaaaa毛片| 精品电影在线观看| 亚洲精品福利视频| 欧美在线视频a| 8x拔播拔播x8国产精品| 欧美日韩国产综合视频在线观看中文| 国产一区私人高清影院| 国产精品免费在线免费| 久久久www成人免费精品| 91精品中文在线| 欧美老女人xx| 亚洲色图第一页| 欧洲精品在线视频| 亚洲人成电影在线观看天堂色| 亚洲国产中文字幕在线观看| 在线视频国产日韩| 欧美区二区三区| 日本精品久久电影| 国产在线观看91精品一区| 正在播放亚洲1区| 国产精品日韩欧美综合| 国产精品九九久久久久久久| 色综合久综合久久综合久鬼88| 国产精品99久久久久久久久| 欧美性高跟鞋xxxxhd| 精品日本美女福利在线观看| 久久久爽爽爽美女图片| 欧美大片在线看免费观看| 国语自产偷拍精品视频偷| 亚洲国语精品自产拍在线观看| 亚洲美女视频网| 亚洲精品理论电影| 97视频在线观看免费高清完整版在线观看| 欧美成人午夜视频| 国产男女猛烈无遮挡91| www.精品av.com| 亚洲一区二区三区成人在线视频精品| 国产一区二区三区丝袜| 国产激情久久久| 成人久久一区二区| 91亚洲一区精品| 欧美精品电影在线| 日韩av快播网址| 精品少妇一区二区30p| 7m精品福利视频导航| 亚洲视频在线播放| 91色在线视频| 亚洲第一二三四五区| 69**夜色精品国产69乱| 国外成人在线视频| 欧美成人精品三级在线观看| 欧美性视频网站| 91在线视频成人| 亚洲欧美日韩一区在线| 国产精品国语对白| 久久国产精彩视频| 精品久久久免费| 8090成年在线看片午夜| 久久久久久这里只有精品| 国产精品免费在线免费| 欧美精品在线观看91| 2019亚洲日韩新视频| 91sao在线观看国产| 成人激情视频小说免费下载| 久久久精品视频成人| 日韩精品免费在线| 69久久夜色精品国产69乱青草| 欧美激情在线狂野欧美精品| 精品日韩中文字幕| 亚洲精选中文字幕| 欧美日韩国产成人在线观看| 久久久久久久久久国产| 亚洲欧美国产va在线影院| 45www国产精品网站| 97视频国产在线| 日韩精品黄色网| 国产精品久久久久影院日本| 91亚洲精品在线| 欧美激情女人20p| 色偷偷av亚洲男人的天堂| 这里只有精品在线播放| 久久久久久久久爱| 国产精品久久久久久av福利| 亚洲视频日韩精品| 97视频免费在线观看| 国产精品你懂得| 久久精品国产亚洲一区二区| 日韩激情片免费| 日韩成人中文字幕在线观看| 国产成人一区二区三区电影| 91av网站在线播放| 国产精品成人va在线观看| 欧美日韩亚洲精品一区二区三区| 久久久久久久久中文字幕| 国产精品一香蕉国产线看观看| 亚洲毛片在线免费观看| 日本免费久久高清视频| 欧美国产极速在线| 欧美日韩一区免费| 色综合亚洲精品激情狠狠| 久久欧美在线电影| www.亚洲天堂| 97成人精品视频在线观看| 成人免费看吃奶视频网站| 福利视频第一区| 中日韩美女免费视频网站在线观看| 亚洲美女福利视频网站| 国内精品中文字幕| 欧美极品少妇xxxxⅹ裸体艺术| 激情久久av一区av二区av三区| 98午夜经典影视| 国内精品久久久久久影视8| 日韩国产欧美精品在线| 国产精品ⅴa在线观看h| 中文字幕亚洲欧美在线| 亚洲国产一区自拍| 亚洲aa在线观看| 国产成人精品a视频一区www| 丝袜美腿亚洲一区二区| 国产欧美精品一区二区三区介绍| 91久久久久久国产精品| 欧美日韩国产123| 美女福利视频一区| 欧美激情日韩图片|