Приложение для просмотра изображений JPEG и BMP
01.01.2007
unit mainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ComCtrls, ExtCtrls, Buttons, ToolWin, ImgList; type TForm1 = class(TForm) SavePictureDialog1: TSavePictureDialog; OpenPictureDialog1: TOpenPictureDialog; ScrollBox1: TScrollBox; Image1: TImage; ToolBar1: TToolBar; OpenBtn: TToolButton; SaveBtn: TToolButton; Panel2: TPanel; ProgressBar1: TProgressBar; ImageList1: TImageList; procedure SavePictureDialog1TypeChange(Sender: TObject); procedure Image1Progress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string); procedure SavePictureDialog1Close(Sender: TObject); procedure FormCreate(Sender: TObject); procedure OpenBitBtnClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject); procedure ToolBar1Resize(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} uses jpeg; const DeltaH: Integer = 80; var Quality: TJpegQualityRange; ProgressiveEnc: Boolean; procedure TForm1.FormCreate(Sender: TObject); var s: string; begin s := GraphicFilter(TBitmap) + '|' + GraphicFilter(TJpegImage); OpenPictureDialog1.Filter := s; SavePictureDialog1.Filter := s; end; procedure TForm1.OpenBitBtnClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); SaveBtn.Enabled := True; end; end; procedure TForm1.SaveBitBtnClick(Sender: TObject); var ji: TJpegImage; begin with SavePictureDialog1 do begin FilterIndex := 1; FileName := ''; if not Execute then Exit; if Pos('.', FileName) = 0 then if (FilterIndex = 1) then FileName := FileName + '.bmp' else FileName := FileName + '.jpg'; if (FilterIndex = 1) then Image1.Picture.Bitmap.SaveToFile(FileName) else begin ji := TJpegImage.Create; ji.CompressionQuality := Quality; ji.ProgressiveEncoding := ProgressiveEnc; ji.OnProgress := Image1Progress; ji.Assign(Image1.Picture.Bitmap); ji.SaveToFile(FileName); ji.Free; end; end; end; procedure TForm1.SavePictureDialog1TypeChange(Sender: TObject); var ParentHandle: THandle; wRect: TRect; PicPanel, PaintPanel: TPanel; QEdit: TEdit; begin with Sender as TSavePictureDialog do begin //родительская панель PicPanel := (FindComponent('PicturePanel') as TPanel); if not Assigned(PicPanel) then Exit; ParentHandle := GetParent(Handle); //панель-сосед сверху PaintPanel := (FindComponent('PaintPanel') as TPanel); PaintPanel.Align := alNone; if FilterIndex > 1 then begin GetWindowRect(ParentHandle, WRect); SetWindowPos(ParentHandle, 0, 0, 0, WRect.Right - WRect.Left, WRect.Bottom - WRect.Top + DeltaH, SWP_NOMOVE + SWP_NOZORDER); GetWindowRect(Handle, WRect); SetWindowPos(handle, 0, 0, 0, WRect.Right - WRect.Left, WRect.Bottom - WRect.Top + DeltaH, SWP_NOMOVE + SWP_NOZORDER); PicPanel.Height := PicPanel.Height + DeltaH; if FindComponent('JLabel') = nil then with TLabel.Create(Sender as TSavePictureDialog) do begin Parent := PicPanel; Name := 'JLabel'; Caption := 'Quality'; Left := 5; //Width := PicPanel.Width - 10; Height := 25; Top := PaintPanel.Top + PaintPanel.Height + 5; end; if FindComponent('JEdit') = nil then begin QEdit := TEdit.Create(Sender as TSavePictureDialog); with QEdit do begin Parent := PicPanel; Name := 'JEdit'; Text := '75'; Left := 50; Width := 50; Height := 25; Top := PaintPanel.Top + PaintPanel.Height + 5; end; end; if FindComponent('JUpDown') = nil then with TUpDown.Create(Sender as TSavePictureDialog) do begin Parent := PicPanel; Name := 'JUpDown'; Associate := QEdit; Increment := 5; Min := 1; Max := 100; Position := 75; end; if FindComponent('JCheck') = nil then with TCheckBox.Create(Sender as TSavePictureDialog) do begin Name := 'JCheck'; Caption := 'Progressive Encoding'; Parent := PicPanel; Left := 5; Width := PicPanel.Width - 10; Height := 25; Top := PaintPanel.Top + PaintPanel.Height + 35; end; end else SavePictureDialog1Close(Sender); end; end; procedure TForm1.Image1Progress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string); begin case Stage of psStarting: begin Progressbar1.Position := 0; Progressbar1.Max := 100; end; psEnding: begin Progressbar1.Position := 0; end; psRunning: begin Progressbar1.Position := PercentDone; end; end; end; procedure TForm1.SavePictureDialog1Close(Sender: TObject); var PicPanel: TPanel; ParentHandle: THandle; WRect: TRect; begin with Sender as TSavePictureDialog do begin PicPanel := (FindComponent('PicturePanel') as TPanel); if not Assigned(PicPanel) then Exit; ParentHandle := GetParent(Handle); if ParentHandle = 0 then Exit; if FindComponent('JLabel') <> nil then try FindComponent('JLabel').Free; FindComponent('JEdit').Free; ProgressiveEnc := (FindComponent('JCheck') as TCheckBox).Checked; FindComponent('JCheck').Free; Quality := (FindComponent('JUpDown') as TUpDown).Position; FindComponent('JUpDown').Free; PicPanel.Height := PicPanel.Height - DeltaH; GetWindowRect(Handle, WRect); SetWindowPos(Handle, 0, 0, 0, WRect.Right - WRect.Left, WRect.Bottom - WRect.Top - DeltaH, SWP_NOMOVE + SWP_NOZORDER); GetWindowRect(ParentHandle, WRect); SetWindowPos(ParentHandle, 0, 0, 0, WRect.Right - WRect.Left, WRect.Bottom - WRect.Top - DeltaH, SWP_NOMOVE + SWP_NOZORDER); FilterIndex := 1; except ShowMessage('Dialog resizing error'); end; end; end; procedure TForm1.ToolBar1Resize(Sender: TObject); begin Panel2.Width := ToolBar1.Width - Panel2.Left; end; end.