Проект состоит из двух форм. Главная форма - FormMain содержит компоненты для настройки свойств картинки и кнопку - чтобы открыть файл с картинкой. Цель - показать основные возможности Делфи при работе с картинками JPEG. (В последне время появились файлы с расширением .jpe - после переименования в .jpg их тоже можно смотреть). Файлы .bmp тоже просматриваются, но настройки для них не работают.
Для картинок JPEG сделаны настройки:
Другая форма - FKart содержит компонент Image1 и служит для показа картинки. Форма прячется при
щелчке по картинке.
Текст обоих модулей и проекта:
{ ************** ShowJpeg.dpr *****************}
program ShowJpeg;
uses
Forms,
ServerMain in 'ServerMain.pas' {FormMain},
UKarta in 'UKarta.pas' {FKarta};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
Application.CreateForm(TFKarta, FKarta);
Application.Run;
end.
{ ************** ServerMain.pas *****************}
unit ServerMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls, ComCtrls,
ExtCtrls, ExtDlgs;
type
TFormMain = class(TForm)
OPD1: TOpenPictureDialog;
btnSelect: TButton;
gray: TCheckBox;
gbPerformance: TGroupBox;
rbBestSpeed: TRadioButton;
rbBestQuality: TRadioButton;
gbPixelFormat: TGroupBox;
rb24Bit: TRadioButton;
rb8Bit: TRadioButton;
gbScale: TGroupBox;
rbFullSize: TRadioButton;
rbHalf: TRadioButton;
rbQuarter: TRadioButton;
rbEighth: TRadioButton;
cbSmooth: TCheckBox;
procedure SetJPEGOptions2(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnSelectClick(Sender: TObject);
procedure btnRepeatClick(Sender: TObject);
procedure grayClick(Sender: TObject);
procedure rbFullSizeClick(Sender: TObject);
procedure rbHalfClick(Sender: TObject);
procedure rbQuarterClick(Sender: TObject);
procedure rbEighthClick(Sender: TObject);
procedure rb8BitClick(Sender: TObject);
procedure rb24BitClick(Sender: TObject);
private
{ Private declarations TJPegImage }
public
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation uses JPeg, UKarta;
{$R *.dfm}
Var aJpeg:TJpegImage=nil; MStream: TMemoryStream=nil;
procedure TFormMain.FormCreate(Sender: TObject);
begin
Top := 10; Left := 10;
end;
procedure TFormMain.btnSelectClick(Sender: TObject);
var
FName: string;
begin
if OPD1.Execute then FName := OPD1.FileName else exit;
try
FKarta.Image1.Picture.LoadFromFile(FName);
except
on EInvalidGraphic do
FKarta.Image1.Picture.Graphic := nil;
end;
SetJPEGOptions2(self);
FKarta.ClientHeight:= FKarta.Image1.Height;
FKarta.ClientWidth:= FKarta.Image1.Width;
FKarta.Show;
end;
procedure TFormMain.SetJPEGOptions2(Sender: TObject);
var
Temp: Boolean;
begin
Temp := FKarta.Image1.Picture.Graphic is TJPEGImage;
if Temp then
with TJPEGImage(FKarta.Image1.Picture.Graphic) do
begin
if Gray.Checked then Grayscale:= true
else Grayscale:= false;
if rbBestSpeed.Checked then Performance:= jpBestSpeed else
if rbBestQuality.Checked then Performance:= jpBestQuality;
if rb24Bit.Checked then PixelFormat:= jf24Bit else
if rb8Bit.Checked then PixelFormat:= jf8Bit;
if rbFullSize.Checked then Scale:= jsFullSize else
if rbHalf.Checked then Scale:= jsHalf else
if rbQuarter.Checked then Scale:= jsQuarter else
if rbEighth.Checked then Scale:= jsEighth;
ProgressiveDisplay := true;
if cbSmooth.Checked then Smoothing:= true else
Smoothing:= false;
end;
FKarta.Image1.IncrementalDisplay := true;
end;
procedure TFormMain.btnRepeatClick(Sender: TObject);
begin // Эта кнопка уже не нужна, а процедура осталась (нужна)!
if not (FKarta.Image1.Picture.Graphic is TJPEGImage) then
exit; // т е если картинка не загружена или типа TBitMap, TIcon
SetJPEGOptions2(Sender);
FKarta.ClientHeight:= FKarta.Image1.Height;
FKarta.ClientWidth:= FKarta.Image1.Width;
FKarta.Show;
end;
{ ****** СПРАВКА: TJPEGImage.Properties: *******
property Grayscale: Boolean; // серая картинка
property Performance: TJPEGPerformance;
type TJPEGPerformance = (jpBestQuality, jpBestSpeed);
// наилучшее: качество или скорость
property PixelFormat: TJPEGPixelFormat;
type TJPEGPixelFormat = (jf24Bit, jf8Bit);
property Scale: TJPEGScale; // Масштаб: 100%, 50%, 25%, 12,5%
// (Масштаб мож быть меньше, если уменьшить окно, НО НЕ БОЛЬШЕ !!
type TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);
property Smoothing: Boolean;
}
procedure TFormMain.grayClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rbFullSizeClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rbHalfClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rbQuarterClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rbEighthClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rb8BitClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
procedure TFormMain.rb24BitClick(Sender: TObject);
begin
btnRepeatClick(Sender);
end;
end.
{ ************** UKarta.pas *****************}
unit UKarta;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TFKarta = class(TForm)
Image1: TImage;
procedure Image1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FKarta: TFKarta;
implementation
{$R *.dfm}
procedure TFKarta.Image1Click(Sender: TObject);
begin
Hide;
end;
end.
(Имя ServerMain.pas - это след переделки из сетевого приложения,
которое, возможно, будет представлено)