unit BuildUnit;interfaceuses Windows, Classes, SysUtils, zlib, ConstUnit;Type TBuild = Class private MyFH: LongWord; procedure PP(Sender: TObject); function ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream; Compress: boolean; Var Count: integer): boolean; public constructor Create(FH: LongWord); overload; published function BuidPkg(FilePath: string): boolean; function DectPkg(FilePath: string): boolean; end;implementationconstructor TBuild.Create(FH: LongWord); begin inherited Create; MyFH := FH; end;function DirExists(Name: string): Boolean; {$IFDEF WIN32} var Code: Integer; begin Code := GetFileAttributes(PChar(Name)); Result := (Code<>-1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); end; {$ELSE} var SR: TSearchRec; begin if Name[Length(Name)] = '\' then Dec(Name[0]); if (Length(Name) = 2) and (Name[2]= ':') then Name := Name + '\*.*'; Result := FindFirst(Name, faDirectory, SR) = 0; Result := Result and (SR.Attr and faDirectory <> 0); end; {$ENDIF}procedure TBuild.PP(Sender: TObject); begin SendMessage(MYFH,PBM_MYSTEPIT,0,0); end;function TBuild.ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream; Compress: boolean; Var Count: integer): boolean; var p: Pchar; TCS: TCompressionStream; TDS: TDecompressionStream; begin Result := false; if not (Assigned(mInputStream) and Assigned(mOutputStream)) then exit; mOutputStream.Clear; if Compress then //其中的clMax表示压缩级别,可以更改,值是下列参数之一:clNone, clFastest, clDefault, clMax begin TCS := TCompressionStream.Create(clMax,mOutputStream); TCS.OnProgress := PP; end else begin TDS := TDecompressionStream.Create(mInputStream); TDS.OnProgress := PP; end; GetMem(p,Count); try if Compress then begin mInputStream.ReadBuffer(p^,Count); TCS.WriteBuffer(p^,Count); end else begin mInputStream.ReadBuffer(p^,mInputStream.Size); //-SizeOf(Count) TDS.ReadBuffer(p^,Count); mOutputStream.WriteBuffer(p^,Count); mOutputStream.Position := 0; end; finally FreeMem(p,Count); if Compress then TCS.Free else TDS.Free; end; Result := true; end;function TBuild.BuidPkg(FilePath: string): boolean; var fsInStream,fsOutStream: TMemoryStream; TmpStream: TMemoryStream; Count: integer; FN: Pchar; SearchResult : TSearchRec; begin Result := false; if not DirExists(FilePath) then exit; if FilePath[length(FilePath)] <> '\' then FilePath := FilePath + '\'; fsInStream := TMemoryStream.Create; fsOutStream := TMemoryStream.Create; TmpStream := TMemoryStream.Create; try if FindFirst(FilePath+'*.mdb', faAnyFile, SearchResult) = 0 then begin repeat fsInStream.Clear; fsInStream.LoadFromFile(FilePath + SearchResult.Name); Count := fsInStream.Size; if Count = 0 then continue; //压缩文件 ZIP(fsInStream,fsOutStream,true,Count); //写入文件名称长度 Count := length(SearchResult.Name)+1; TmpStream.WriteBuffer(Count,sizeof(Count)); //写入文件名称 GetMem(FN,Count); StrCopy(FN,PChar(SearchResult.Name)); TmpStream.WriteBuffer(FN^,Count); FreeMem(FN,Count); //写入原文件长度 Count := fsInStream.Size; TmpStream.WriteBuffer(Count,sizeof(Count)); //写入压缩文件长度 Count := fsOutStream.Size; TmpStream.WriteBuffer(Count,sizeof(Count)); //写入文件内容 TmpStream.CopyFrom(fsOutStream,0); until FindNext(searchResult) <> 0; end; if TmpStream.Size > 0 then begin if FileExists(FilePath+'Update.xqg') then DeleteFile(FilePath+'Update.xqg'); TmpStream.SaveToFile(FilePath+'Update.xqg'); end; finally fsInStream.Free; fsOutStream.Free; TmpStream.Free; FindClose(searchResult); PostMessage(MYFH,PBM_MYSETPOS,0,0); end; Result := true; end;function TBuild.DectPkg(FilePath: string): boolean; var fsInStream,fsOutStream: TMemoryStream; TmpStream: TMemoryStream; Count,LFn: integer; FName: ShortString; FN: Pchar; begin Result := false; if FilePath[length(FilePath)] <> '\' then FilePath := FilePath + '\'; if not FileExists(FilePath+'Update.xqg') then exit; fsInStream := TMemoryStream.Create; fsOutStream := TMemoryStream.Create; TmpStream := TMemoryStream.Create; try TmpStream.LoadFromFile(FilePath+'Update.xqg'); while TmpStream.Position < TmpStream.Size-1 do begin fsInStream.Clear; //获取文件名称长度 TmpStream.ReadBuffer(LFn,SizeOf(LFn)); //获取文件名 GetMem(FN,LFn); TmpStream.ReadBuffer(FN^,LFn); FName := StrPas(FN); FreeMem(FN,LFn); //获取原文件长度 TmpStream.ReadBuffer(Count,SizeOf(Count)); //获取压缩文件长度 TmpStream.ReadBuffer(LFn,SizeOf(LFn)); //获取文件内容 fsInStream.CopyFrom(TmpStream,LFn); fsInStream.Position := 0; if not Zip(fsInStream,fsOutStream,false,Count) then exit; if FileExists(FilePath+FName) then DeleteFile(FilePath+FName); fsOutStream.SaveToFile(FilePath+FName); end; fsInStream.Clear; fsOutStream.Clear; TmpStream.Clear; finally fsInStream.Free; fsOutStream.Free; TmpStream.Free; PostMessage(MYFH,PBM_MYSETPOS,0,0); end; Result := true; end; end.
不是简单的保存图片和读图片的问题的吗?
savetofile,loadfromfile就行了哦
可以看看我的blog
http://blog.csdn.net/ccdarkness/archive/2005/11/22/534324.aspx
感觉还是没有达到目的
因为合并图片后的文件是个独立的文件,可以通过程序来读取出来,不能把图片作为资源文件保存在Exe中,如果这样就不能被外部的程序识别了.
把图片放到dll和放到exe是一个道理从dll读取图片有个例子,还有一个非常详细的
http://www.delphifans.com/SoftView/SoftView_2422.htmlvar
resStream: TResourceStream;
hinst: THandle;
jpg: TJPEGImage;
begin
hinst := LoadLibrary(PChar(AppPath + 'mainRes.dll'));
if hinst <> 0 then
begin
if screen.Width > 800 then
resStream := TResourceStream.Create(hinst,'mainbk768','JPEG')
else
resStream := TResourceStream.Create(hinst,'mainbk600','JPEG');
try
jpg := TJpegImage.Create;
try
jpg.LoadFromStream(resStream);
img_bk.Picture.Assign(jpg);
finally
jpg.Free;
end;
finally
resStream.Free;
end;
FreeLibrary(hinst);
end;
资源定义 RC 文件格式NoSound ICO NoSound.ico
Tick ICO Tick.ico
Tick32 ICO Tick32.icoMainFrame JPG MainFrame.jpg
Call JPG Call.jpg
Management JPG Management.jpg...
var
Stream: TStream;
Jpeg: TJpegImage;
begin
Stream := TResourceStream.Create(HInstance, ResName, PChar('JPG'));
Jpeg := TJpegImage.Create;
try
Jpeg.LoadFromStream(Stream);
Image.Canvas.StretchDraw(Rect(0,0,Image.Width,Image.Height),Jpeg);
finally
Jpeg.Free;
Stream.Free;
end;
end;
Windows, Classes, SysUtils, zlib, ConstUnit;Type
TBuild = Class
private
MyFH: LongWord;
procedure PP(Sender: TObject);
function ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream;
Compress: boolean; Var Count: integer): boolean;
public
constructor Create(FH: LongWord); overload;
published
function BuidPkg(FilePath: string): boolean;
function DectPkg(FilePath: string): boolean;
end;implementationconstructor TBuild.Create(FH: LongWord);
begin
inherited Create;
MyFH := FH;
end;function DirExists(Name: string): Boolean;
{$IFDEF WIN32}
var
Code: Integer;
begin
Code := GetFileAttributes(PChar(Name));
Result := (Code<>-1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
{$ELSE}
var
SR: TSearchRec;
begin
if Name[Length(Name)] = '\' then
Dec(Name[0]);
if (Length(Name) = 2) and (Name[2]= ':') then
Name := Name + '\*.*';
Result := FindFirst(Name, faDirectory, SR) = 0;
Result := Result and (SR.Attr and faDirectory <> 0);
end;
{$ENDIF}procedure TBuild.PP(Sender: TObject);
begin
SendMessage(MYFH,PBM_MYSTEPIT,0,0);
end;function TBuild.ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream;
Compress: boolean; Var Count: integer): boolean;
var
p: Pchar;
TCS: TCompressionStream;
TDS: TDecompressionStream;
begin
Result := false;
if not (Assigned(mInputStream) and Assigned(mOutputStream)) then
exit;
mOutputStream.Clear;
if Compress then //其中的clMax表示压缩级别,可以更改,值是下列参数之一:clNone, clFastest, clDefault, clMax
begin
TCS := TCompressionStream.Create(clMax,mOutputStream);
TCS.OnProgress := PP;
end
else
begin
TDS := TDecompressionStream.Create(mInputStream);
TDS.OnProgress := PP;
end;
GetMem(p,Count);
try
if Compress then
begin
mInputStream.ReadBuffer(p^,Count);
TCS.WriteBuffer(p^,Count);
end
else
begin
mInputStream.ReadBuffer(p^,mInputStream.Size); //-SizeOf(Count)
TDS.ReadBuffer(p^,Count);
mOutputStream.WriteBuffer(p^,Count);
mOutputStream.Position := 0;
end;
finally
FreeMem(p,Count);
if Compress then
TCS.Free
else
TDS.Free;
end;
Result := true;
end;function TBuild.BuidPkg(FilePath: string): boolean;
var
fsInStream,fsOutStream: TMemoryStream;
TmpStream: TMemoryStream;
Count: integer;
FN: Pchar;
SearchResult : TSearchRec;
begin
Result := false;
if not DirExists(FilePath) then
exit;
if FilePath[length(FilePath)] <> '\' then
FilePath := FilePath + '\';
fsInStream := TMemoryStream.Create;
fsOutStream := TMemoryStream.Create;
TmpStream := TMemoryStream.Create;
try
if FindFirst(FilePath+'*.mdb', faAnyFile, SearchResult) = 0 then
begin
repeat
fsInStream.Clear;
fsInStream.LoadFromFile(FilePath + SearchResult.Name);
Count := fsInStream.Size;
if Count = 0 then
continue;
//压缩文件
ZIP(fsInStream,fsOutStream,true,Count);
//写入文件名称长度
Count := length(SearchResult.Name)+1;
TmpStream.WriteBuffer(Count,sizeof(Count));
//写入文件名称
GetMem(FN,Count);
StrCopy(FN,PChar(SearchResult.Name));
TmpStream.WriteBuffer(FN^,Count);
FreeMem(FN,Count);
//写入原文件长度
Count := fsInStream.Size;
TmpStream.WriteBuffer(Count,sizeof(Count));
//写入压缩文件长度
Count := fsOutStream.Size;
TmpStream.WriteBuffer(Count,sizeof(Count));
//写入文件内容
TmpStream.CopyFrom(fsOutStream,0);
until FindNext(searchResult) <> 0;
end;
if TmpStream.Size > 0 then
begin
if FileExists(FilePath+'Update.xqg') then
DeleteFile(FilePath+'Update.xqg');
TmpStream.SaveToFile(FilePath+'Update.xqg');
end;
finally
fsInStream.Free;
fsOutStream.Free;
TmpStream.Free;
FindClose(searchResult);
PostMessage(MYFH,PBM_MYSETPOS,0,0);
end;
Result := true;
end;function TBuild.DectPkg(FilePath: string): boolean;
var
fsInStream,fsOutStream: TMemoryStream;
TmpStream: TMemoryStream;
Count,LFn: integer;
FName: ShortString;
FN: Pchar;
begin
Result := false;
if FilePath[length(FilePath)] <> '\' then
FilePath := FilePath + '\';
if not FileExists(FilePath+'Update.xqg') then
exit;
fsInStream := TMemoryStream.Create;
fsOutStream := TMemoryStream.Create;
TmpStream := TMemoryStream.Create;
try
TmpStream.LoadFromFile(FilePath+'Update.xqg');
while TmpStream.Position < TmpStream.Size-1 do
begin
fsInStream.Clear;
//获取文件名称长度
TmpStream.ReadBuffer(LFn,SizeOf(LFn));
//获取文件名
GetMem(FN,LFn);
TmpStream.ReadBuffer(FN^,LFn);
FName := StrPas(FN);
FreeMem(FN,LFn);
//获取原文件长度
TmpStream.ReadBuffer(Count,SizeOf(Count));
//获取压缩文件长度
TmpStream.ReadBuffer(LFn,SizeOf(LFn));
//获取文件内容
fsInStream.CopyFrom(TmpStream,LFn);
fsInStream.Position := 0;
if not Zip(fsInStream,fsOutStream,false,Count) then
exit;
if FileExists(FilePath+FName) then
DeleteFile(FilePath+FName);
fsOutStream.SaveToFile(FilePath+FName);
end;
fsInStream.Clear;
fsOutStream.Clear;
TmpStream.Clear;
finally
fsInStream.Free;
fsOutStream.Free;
TmpStream.Free;
PostMessage(MYFH,PBM_MYSETPOS,0,0);
end;
Result := true;
end;
end.
DectPkg是将合并好的文件(Update.xqg),解压到指定目录
ZIP是用来压缩/解压缩的,爱用不用都可以。
MyFH: LongWord 是进度条的句柄,爱用不用。
WM_MYUSER = $0400;
PBM_MYSETPOS = WM_MYUSER+2;
PBM_MYSTEPIT = WM_MYUSER + 5;
PBM_SETRANGE32 = WM_MYUSER + 6;