www.pudn.com > JPEG_Batch_Compress__V0.18beta.rar > Unit1.pas


 
unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, FileCtrl, ShellApi, Jpeg, ExtCtrls, ComCtrls, ShlObj; 
 
type 
  TForm1 = class(TForm) 
    Button1: TButton; 
    ListBox1: TListBox; 
    Image1: TImage; 
    Edit1: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    ProgressBar1: TProgressBar; 
    Button2: TButton; 
    Button3: TButton; 
     
    procedure StartButton(Sender: TObject); 
    procedure SelectDir(Sender: TObject); 
    procedure StopButton(Sender: TObject); 
	  function SearchFile(sFileName, sRootDir: string; bFileOnly, bRecurse: boolean): TStringList; 
	  function GetFileSize(const FileName: string):Integer; 
  	procedure JpegCompress(sFileName1, sRootDir: string); 
  	procedure DoSearchFile(sFileName, sRootDir: string; bFileOnly, bRecurse: boolean;var FileList: TStringList); 
    procedure FormCreate(Sender: TObject;  var Action: TCloseAction); 
    procedure FormClose(Sender: TObject;  var Action: TCloseAction); 
    procedure Edit1Enter(Sender: TObject); 
    procedure Edit1Exit(Sender: TObject); 
    private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1:  TForm1; 
  FileNumber: Integer; 
  UserStop: Boolean; 
 
implementation 
 
{$R *.DFM} 
 
//取文件大小 (此方法执行完成会自动关闭文件) 
function TForm1.GetFileSize(const FileName: string):Integer; 
var 
  f: TFileStream; 
begin 
  if FileExists(FileName) then 
    begin 
      f:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone); 
      Result:=f.Size; 
      F.Free; 
    end 
  else Result:=0; 
end; 
 
//将 JPEG文件压缩后覆盖原文件 
procedure TForm1.JpegCompress(sFileName1, sRootDir: string); 
var 
  JPEGImage1, JPEGImage2: TJPEGImage; 
  i : integer; 
begin 
  JPEGImage1:=TJPEGImage.Create; 
  JPEGImage2:=TJPEGImage.Create; 
  Image1.Picture.Assign(nil); 
  JPEGImage1.LoadFromFile(sRootDir + '\' + sFileName1); 
  Form1.Image1.Hide; 
  //判断图片大小,是否按原比例缩小 
  if (JPEGImage1.Width>1024) and (JPEGImage1.Height>1024) then 
    begin 
      if JPEGImage1.Width <= JPEGImage1.Height then 
        begin 
          Image1.Width := Round(JPEGImage1.Width * (1024/JPEGImage1.Width)); 
          Image1.Height:= Round(JPEGImage1.Height * (1024/JPEGImage1.Width)); 
        end 
      else 
        begin 
          Image1.Height:= Round(JPEGImage1.Height * (768/JPEGImage1.Height)); 
          Image1.Width := Round(JPEGImage1.Width * (768/JPEGImage1.Height)); 
        end; 
      Image1.Proportional := True; 
    end 
  else 
    begin 
      Image1.Width   := JPEGImage1.Width; 
      Image1.Height  := JPEGImage1.Height; 
      //Image1.Left    := Round((Image1.Parent.Width-JPEGImage1.Width)/2);//横向居中显示 
      Image1.Proportional := True; 
      ShowMessage('原图显示'+IntToStr(Image1.Width)+' X '+IntToStr(Image1.Height)); 
    end; 
  Form1.Image1.Canvas.StretchDraw(Form1.Image1.ClientRect,JPEGImage1); 
  JPEGImage2.Assign(Form1.Image1.Picture.Graphic); 
  JPEGImage2.CompressionQuality:=75;                    //图片压缩率 
  JPEGImage2.Compress; 
  for i := 0 to 100 do 
    begin 
      Form1.ProgressBar1.Position := i; 
      Sleep(2); 
    end; 
  JPEGImage2.SaveToFile(sRootDir + '\' + sFileName1); 
  JPEGImage1.Free; 
  JPEGImage2.Free; 
end; 
 
//内嵌文件查找递归过程 
procedure TForm1.DoSearchFile(sFileName, sRootDir: string; bFileOnly, bRecurse: boolean;var FileList: TStringList); 
var 
  Found, FSize1, FSize2: Integer; 
  SearchRec: TSearchRec; 
begin 
//开始查找 
  Found := FindFirst(sRootDir + '\*.*', faAnyFile, SearchRec);    //搜索成功则返回0 
  while (Found = 0) and (UserStop = False) do 
    begin 
      Application.ProcessMessages; //循环中接收按键 
      //遇到子目录时确定是否查找子目录和是否将符合条件的子目录加入查找结果 (SearchRec.Attr = faDirectory 表示为目录) 
      if (SearchRec.Attr = faDirectory) and (SearchRec.Name <> '.') and 
        (SearchRec.Name <> '..') then 
        begin 
          if (AnsiCompareText(sFileName, ExtractFileExt(SearchRec.Name)) = 0) and 
            ((Form1.GetFileSize(sRootDir + '\' + SearchRec.Name)) > 488200) and not bFileOnly 
            then 
              FileList.Add(sRootDir + '\' + SearchRec.Name);                        //  如果扩展名相符AND不只找文件,就加到列表 ??? 
          if bRecurse then                                                        // 如果bRecurse是TRUE就再查找子目录 
              Form1.DoSearchFile(sFileName,sRootDir+'\'+ SearchRec.Name,bFileOnly,bRecurse,FileList); 
          end 
      else if (AnsiCompareText(sFileName, ExtractFileExt(SearchRec.Name)) = 0) 
        and ((Form1.GetFileSize(sRootDir + '\' + SearchRec.Name)) > 488200)             // 大于500KB 
        then 
          begin 
            FSize1 := Form1.GetFileSize(sRootDir + '\' + SearchRec.Name); 
            Form1.JpegCompress(SearchRec.Name, sRootDir); 
            FSize2 := Form1.GetFileSize(sRootDir + '\' + SearchRec.Name); 
            FileList.Add(sRootDir + '\' + SearchRec.Name + '  ' + IntToStr(FSize1)+ '  ' + IntToStr(FSize2));  //  如果扩展名相符AND不只找文件,就加到列表 
            FileNumber := FileNumber+1; 
            Form1.Label3.Caption := IntToStr(FileNumber); 
            Form1.refresh; 
          end; 
      Found := FindNext(SearchRec);          //FindNext() 搜索成功反回0 
    end; 
  FindClose(SearchRec); 
end; 
 
//选择目录 
procedure TForm1.SelectDir(Sender: TObject); 
var 
  TitleName : string; 
  lpItemID : PItemIDList; 
  BrowseInfo : TBrowseInfo; 
  DisplayName : array[0..MAX_PATH] of char; 
  TempPath : array[0..MAX_PATH] of char; 
begin 
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0); 
  BrowseInfo.hwndOwner := Form1.Handle; 
  BrowseInfo.pszDisplayName := @DisplayName; 
  TitleName := 'Please specify a directory'; 
  BrowseInfo.lpszTitle := PChar(TitleName); 
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS; 
  lpItemID := SHBrowseForFolder(BrowseInfo); 
  if lpItemId <> nil then 
    begin 
      SHGetPathFromIDList(lpItemID, TempPath); 
      Edit1.Text := TempPath; 
      GlobalFreePtr(lpItemID); 
    end; 
end; 
 
 
//文件查找函数 SearchFile 
{--------------------------------------- 
 参数说明: 
     sFileName: 要查找的文件名称 
     sRootDir:  指定在哪个目录中查找 
     bFileOnly: 是否只查找文件 
     bRecurse:  是否查找子目录 
 
 返回值: 
     FileList:  查找结果列表 
----------------------------------------} 
function TForm1.SearchFile(sFileName, sRootDir: string; bFileOnly, bRecurse: boolean): TStringList; 
var 
  FileList: TStringList; 
begin 
  FileList := TStringList.Create; 
  FileList.Clear; 
  Form1.DoSearchFile(sFileName, sRootDir, bFileOnly, bRecurse, FileList); 
  Result := FileList; 
end; 
 
procedure TForm1.StartButton(Sender: TObject); 
{按Button时进行查找,结果显示到ListBox中} 
begin 
  FileNumber := 0; 
  UserStop := False; 
  Button1.Enabled := False; 
  Button2.Enabled := True; 
  Form1.ListBox1.Items.Assign(Form1.SearchFile('.jpg', Edit1.Text, True, True)); 
  Form1.ListBox1.Items.SaveToFile(ExtractFilePath(application.ExeName)+'LOG_'+Formatdatetime('yyyymmddhhmm',Now)+'.txt'); 
  ShowMessage('Compress Finish!'); 
  Button2.Enabled := False; 
  Button1.Enabled := True; 
end; 
 
 
procedure TForm1.StopButton(Sender: TObject); 
begin 
  if application.messagebox('你真的要停止吗?','请确认对话',mb_yesno+mb_iconquestion)=mryes then 
    begin 
      UserStop := True; 
      ShowMessage('You has click STOP button! Program Stop!'); 
    end; 
end; 
 
 
procedure TForm1.Edit1Enter(Sender: TObject); 
begin 
  Edit1.Clear; 
end; 
 
procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
  Edit1.Text := 'Input Start Directory'; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject;  var Action: TCloseAction); 
  begin 
    Button2.Enabled := False; 
  end; 
 
procedure TForm1.FormClose(Sender: TObject;  var Action: TCloseAction); 
  begin 
    Button2.Enabled := False; 
  end; 
 
 
end.