📄 unit1.pas
字号:
STGM_SHARE_EXCLUSIVE,0,0, stgSmallImage));
//在根存储stgRoot下创建子存储stgLargeImage
OleCheck(stgRoot.CreateStorage('LargeImage',STGM_CREATE or STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,0, stgLargeImage));
end;
procedure TForm1.ConvertImageToThumb(AImageFileName: string;
AThumbBmp: Tbitmap);
var
ThumbBmpLeft:integer;
ThumbBmpTop:integer;
ThumbBmpHeight:integer;
ThumbBmpWidth:integer;
begin
if IsJpgFile(AImageFileName) then
try
jpgtobmp(AImageFileName,FThumbJpg,FOriginalBmp);
if FOriginalBmp.Height>=FOriginalBmp.Width then
begin
ThumbBmpWidth:=64*FOriginalBmp.Width div FOriginalBmp.Height;
ThumbBmpLeft:=(64-ThumbBmpWidth ) div 2;
AThumbBmp.Canvas.Brush.Color :=clBtnFace;
AThumbBmp.Canvas.FillRect(AThumbBmp.Canvas.ClipRect);
DrawPanel(AThumbBmp.Canvas,0,0,79,79,RaisedPanel);
DrawPanel(AThumbBmp.Canvas,7+ThumbBmpLeft,7,ThumbBmpWidth+1,64,LoweredPanel);
AThumbBmp.Canvas.StretchDraw(Rect(8+ThumbBmpLeft,8,8+ThumbBmpLeft+ThumbBmpWidth,71),FOriginalBmp);
{***************8}
end
else
begin
ThumbBmpHeight:=64*FOriginalBmp.Height div FOriginalBmp.Width;
ThumbBmpTop:=(64-ThumbBmpHeight ) div 2;
AThumbBmp.Canvas.Brush.Color :=clBtnFace;
AThumbBmp.Canvas.FillRect(AThumbBmp.Canvas.ClipRect);
DrawPanel(AThumbBmp.Canvas,0,0,79,79,RaisedPanel);
DrawPanel(AThumbBmp.Canvas,7,7+ThumbBmpTop,64,ThumbBmpHeight+1,LoweredPanel);
AThumbBmp.Canvas.StretchDraw(Rect(8,8+ThumbBmpTop,71,8+ThumbBmpTop+ThumbBmpHeight),FOriginalBmp);
{*****************}
end;
except
MessageDlg('读取文件:'+AImageFileName+'时发生错误!'+#13
+'该文件不是标准格式的文件,或者该文件已经被损坏!',mtError,[mbYes],0);
end
else
try
FOriginalBmp.LoadFromFile(AImageFileName);
if FOriginalBmp.Height>=FOriginalBmp.Width then
begin
ThumbBmpWidth:=64*FOriginalBmp.Width div FOriginalBmp.Height;
ThumbBmpLeft:=(64-ThumbBmpWidth ) div 2;
AThumbBmp.Canvas.Brush.Color :=clBtnFace;
AThumbBmp.Canvas.FillRect(AThumbBmp.Canvas.ClipRect);
DrawPanel(AThumbBmp.Canvas,0,0,79,79,RaisedPanel);
DrawPanel(AThumbBmp.Canvas,7+ThumbBmpLeft,7,ThumbBmpWidth+1,64,LoweredPanel);
AThumbBmp.Canvas.StretchDraw(Rect(8+ThumbBmpLeft,8,8+ThumbBmpLeft+ThumbBmpWidth,71),FOriginalBmp);
{************}
end
else
begin
ThumbBmpHeight:=64*FOriginalBmp.Height div FOriginalBmp.Width;
ThumbBmpTop:=(64-ThumbBmpHeight ) div 2;
AThumbBmp.Canvas.Brush.Color :=clBtnFace;
AThumbBmp.Canvas.FillRect(AThumbBmp.Canvas.ClipRect);
DrawPanel(AThumbBmp.Canvas,0,0,79,79,RaisedPanel);
DrawPanel(AThumbBmp.Canvas,7,7+ThumbBmpTop,64,ThumbBmpHeight+1,LoweredPanel);
AThumbBmp.Canvas.StretchDraw(Rect(8,8+ThumbBmpTop,71,8+ThumbBmpTop+ThumbBmpHeight),FOriginalBmp);
{*************}
end;
except
MessageDlg('读取文件:'+AImageFileName+'时发生错误!'+#13
+'该文件不是标准格式的文件,或者该文件已经被损坏!',mtError,[mbYes],0);
end;
end;
procedure TForm1.AddSmallImage(AStructureStorageFileName,
ASmallImageFileName: string; ABmp: Tbitmap);
var
stgRoot:IStorage;
stgSmallImage:IStorage;
stmSmallImage:IStream;
OleStream:Tolestream;
begin
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('SmallImage',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgSmallImage));
//在子存储stgSmallImage下创建流
OleCheck(stgSmallImage.CreateStream(StringToOleStr(ASmallImageFileName),STGM_CREATE or STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,0, stmSmallImage));
OleStream:=TOleStream.Create(stmSmallImage);
try
ABmp.SaveToStream(OleStream);
finally
OleStream.Free;
end;
end;
procedure TForm1.AddLargeImage(AStructureStorageFileName,
ALargeImageFileName: string);
var
stgRoot:IStorage;
stgLargeImage:IStorage;
stmLargeImage:IStream;
OleStream:Tolestream;
begin
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('LargeImage',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgLargeImage));
//在子存储stgLargeImage下创建流
OleCheck(stgLargeImage.CreateStream(StringToOleStr(ExtractFileName(ALargeImageFileName)),STGM_CREATE or STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,0, stmLargeImage));
if LowerCase(ExtractFileExt(ALargeImageFileName))='.bmp' then
begin
FOriginalBmp.LoadFromFile(ALargeImageFileName);
OleStream:=TOleStream.Create(stmLargeImage);
try
FOriginalBmp.SaveToStream(OleStream);
finally
OleStream.Free;
end;
end
else if (LowerCase(ExtractFileExt(ALargeImageFileName))='.jpg') or
(LowerCase(ExtractFileExt(ALargeImageFileName))='.jpeg') then
begin
FOriginalJpeg.LoadFromFile(ALargeImageFileName);
OleStream:=TOleStream.Create(stmLargeImage);
try
FOriginalJpeg.SaveToStream(OleStream);
finally
OleStream.Free;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
str:string;
begin
FImageFileList:=TStringList.Create;
FThumbBmp:=TBitmap.Create;
//缩略图的边框为:80*80,显示图片大小为:64*64
FThumbBmp.Height:=80;
FThumbBmp.Width:=80;
FThumbBmp.PixelFormat:=pf24bit;
FOriginalBmp:=Tbitmap.Create;
FOriginalJpeg:=TJpegImage.Create;
FThumbJpg:=TJpegImage.Create;
CheckBox1.Checked:=false;
label1.Enabled:=false;
label2.Enabled:=false;
edit3.Enabled:=false;
edit4.Enabled:=false;
self.Top:=(screen.Height-self.Height) div 2;
self.Left:=(screen.Width-self.Width) div 2;
if ParamCount>0 then
begin
edit7.Text:=ParamStr(1);
str:=ExtractFileName(ParamStr(1));
str:=copy(str,1,pos('.',str)-1);
try
MkDir(ExtractFilePath(ParamStr(1))+str);
except
showmessage('创建目录'+ExtractFilePath(ParamStr(1))+str+'发生错误!');
exit;
end;
edit6.Text:=ExtractFilePath(ParamStr(1))+str;
PageControl1.ActivePage:=PageControl1.Pages[1];
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FImageFileList.Free;
FThumbBmp.Free;
FOriginalBmp.Free;
FOriginalJpeg.Free;
FThumbJpg.Free
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
label1.Enabled:=CheckBox1.Checked;
label2.Enabled:=CheckBox1.Checked;
edit3.Enabled:=CheckBox1.Checked;
edit4.Enabled:=CheckBox1.Checked;
if CheckBox1.Checked then
edit3.SetFocus;
end;
procedure TForm1.ButtonOpenSSPFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
edit7.Text:=OpenDialog1.FileName;
end;
procedure TForm1.ButtonSelectOutPutDirClick(Sender: TObject);
var
dir:string;
begin
dir:='c:\';
if SelectDirectory( dir,[sdAllowCreate, sdPerformCreate, sdPrompt],0) then
edit6.Text:=dir;
end;
procedure TForm1.ButtonBeginExtractPackageClick(Sender: TObject);
begin
if not FileExists(edit7.Text) then
begin
showmessage('文件'+edit7.Text+'不存在!');
exit;
end;
if not DirectoryExists(edit6.Text) then
begin
showmessage('目录'+edit6.Text+'不存在!');
exit;
end;
if IsRequrePassWord(edit7.Text) then
begin
FormPassword.EditPassword.Text:='';
FormPassword.ShowModal;
if FormPassword.IsCancel then
exit;
//FormPassword.EditPassword.SetFocus;
if not IsCorrectPassWord(edit7.Text,FormPassword.EditPassword.Text) then
begin
showmessage('密码错误!');
exit;
end;
end;
//showmessage('total:'+inttostr(GetTotalImageFileNumInSSP(edit7.Text)));
ProgressBar2.Max:=GetTotalImageFileNumInSSP(edit7.Text);
ExtractSSPFile(edit7.Text,edit6.Text,ProgressBar2);
ProgressBar2.Visible:=false;
showmessage('解包成功!');
end;
procedure TForm1.ExtractSSPFile(SSPFileName, OutPutDir: string;
AProgressBar:TProgressBar);
var
stgRoot:IStorage;
stgLargeImage:IStorage;
stmLargeImage:IStream;
OleStream:Tolestream;
EnumStatStg:IEnumStatStg;
StatStg:TStatStg;
s:string;
bmp:Tbitmap;
jpg:TjpegImage;
i:integer;
begin
if OutPutDir[length(OutPutDir)]<>'\' then
OutPutDir:=OutPutDir+'\';
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(SSPFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgLargeImage
OleCheck(stgRoot.OpenStorage('LargeImage',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgLargeImage));
OleCheck(stgLargeImage.EnumElements(0,nil,0,EnumStatStg));
bmp:=Tbitmap.Create;
bmp.PixelFormat:=pf24bit;
jpg:=TjpegImage.Create;
i:=0;
while EnumStatStg.Next(1,StatStg,nil)=S_OK do
begin
if StatStg.dwType=STGTY_STREAM then
begin
OleCheck(stgLargeImage.OpenStream(StatStg.pwcsName,nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmLargeImage));
if LowerCase(ExtractFileExt(StatStg.pwcsName))='.bmp' then
begin
OleStream:=TOleStream.Create(stmLargeImage);
try
bmp.LoadFromStream(OleStream);
bmp.SaveToFile(OutPutDir+StatStg.pwcsName);
finally
OleStream.Free;
end;
end
else if (LowerCase(ExtractFileExt(StatStg.pwcsName))='.jpg') or
(LowerCase(ExtractFileExt(StatStg.pwcsName))='.jpeg') then
begin
OleStream:=TOleStream.Create(stmLargeImage);
try
Jpg.LoadFromStream(OleStream);
jpg.SaveToFile(OutPutDir+StatStg.pwcsName);
finally
OleStream.Free;
end;
end;
end; //end if StatStg.dwType=STGTY_STREAM then
inc(i);
AProgressBar.Position:=i;
end; //end while
bmp.Free;
jpg.Free;
end;
function TForm1.GetTotalImageFileNumInSSP(SSPFileName: string): integer;
var
stgRoot:IStorage;
stgTotalFiles:IStorage;
stmTotalFiles:IStream;
begin
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(SSPFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('TotalFiles',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0,stgTotalFiles));
OleCheck(stgTotalFiles.OpenStream('TotalFilesValue',nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmTotalFiles));
stmTotalFiles.Read(@result,sizeof(integer),nil);
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
Application.Terminate;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -