unit DXPictEdit;
interface
uses
Windows, SysUtils, Classes, Forms, Dialogs, Controls, StdCtrls, ExtCtrls,
ExtDlgs, DIB, Menus, Graphics, Clipbrd;
type
{ TDelphiXDIBEditForm }
TDelphiXPictureEditForm = class(TForm)
LoadButton: TButton;
SaveButton: TButton;
ClearButton: TButton;
OKButton: TButton;
CancelButton: TButton;
Panel1: TPanel;
Bevel1: TBevel;
NoneLabel: TLabel;
Shape: TShape;
SizeLabel: TLabel;
BitCountLabel: TLabel;
Bevel2: TBevel;
OpenDialog: TOpenPictureDialog;
SaveDialog: TSavePictureDialog;
BitSizeLabel: TLabel;
ViewBox: TImage;
ConvertToDIB: TButton;
ClassNameLabel: TLabel;
PopupMenu1: TPopupMenu;
geConvertColor: TMenuItem;
N15: TMenuItem;
N41: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
geGreyscale: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
geNegative: TMenuItem;
N1: TMenuItem;
geCompress: TMenuItem;
geDecompress: TMenuItem;
N3: TMenuItem;
geCopy: TMenuItem;
gePaste: TMenuItem;
procedure OKButtonClick(Sender: TObject);
procedure CancelButtonClick(Sender: TObject);
procedure LoadButtonClick(Sender: TObject);
procedure SaveButtonClick(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure geGreyscaleClick(Sender: TObject);
procedure geNegativeClick(Sender: TObject);
procedure geConvertColorClick(Sender: TObject);
procedure geCompressClick(Sender: TObject);
procedure geDecompressClick(Sender: TObject);
procedure ConvertToDIBClick(Sender: TObject);
procedure geCopyClick(Sender: TObject);
procedure gePasteClick(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
private
FChanged: Boolean;
procedure UpdateData;
public
DIBClassOnly: Boolean;
end;
var
DelphiXPictureEditForm: TDelphiXPictureEditForm;
implementation
uses DXConsts;
{$R *.DFM}
{ TDelphiXDIBEditForm }
procedure TDelphiXPictureEditForm.FormShow(Sender: TObject);
begin
ConvertToDIB.Visible := not DIBClassOnly;
UpDateData;
CancelButton.SetFocus;
end;
procedure TDelphiXPictureEditForm.OKButtonClick(Sender: TObject);
begin
if FChanged then
Tag := 1;
Close;
end;
procedure TDelphiXPictureEditForm.CancelButtonClick(Sender: TObject);
begin
Close;
end;
procedure TDelphiXPictureEditForm.ClearButtonClick(Sender: TObject);
begin
FChanged := True;
ViewBox.Picture.Graphic := nil;
UpDateData;
end;
procedure TDelphiXPictureEditForm.LoadButtonClick(Sender: TObject);
var
DIB: TDIB;
begin
if DIBClassOnly then
begin
OpenDialog.Filter := GraphicFilter(TGraphic);
if OpenDialog.Execute then
begin
FChanged := True;
try
DIB := TDIB.Create;
try
DIB.LoadFromFile(OpenDialog.FileName);
ViewBox.Picture.Graphic := DIB;
finally
DIB.Free;
end;
except
ViewBox.Picture.LoadFromFile(OpenDialog.FileName);
ConvertToDIBClick(nil);
end;
UpDateData;
end;
end else
begin
OpenDialog.Filter := GraphicFilter(TGraphic);
if OpenDialog.Execute then
begin
FChanged := True;
try
DIB := TDIB.Create;
try
DIB.LoadFromFile(OpenDialog.FileName);
ViewBox.Picture.Graphic := DIB;
finally
DIB.Free;
end;
except
ViewBox.Picture.LoadFromFile(OpenDialog.FileName);
end;
UpDateData;
end;
end;
end;
procedure TDelphiXPictureEditForm.SaveButtonClick(Sender: TObject);
begin
if ViewBox.Picture.Graphic is TDIB then
begin
SaveDialog.Filter := 'Bitmap file(*.bmp;*.dib)|*.bmp;*.dib';
SaveDialog.DefaultExt := 'bmp';
end else
begin
SaveDialog.Filter := GraphicFilter(TGraphicClass(ViewBox.Picture.Graphic.ClassType));
SaveDialog.DefaultExt := GraphicExtension(TGraphicClass(ViewBox.Picture.Graphic.ClassType));
end;
if SaveDialog.Execute then
ViewBox.Picture.SaveToFile(SaveDialog.FileName);
end;
procedure TDelphiXPictureEditForm.ConvertToDIBClick(Sender: TObject);
var
DIB: TDIB;
begin
if (ViewBox.Picture.Graphic<>nil) and (not (ViewBox.Picture.Graphic is TDIB)) then
begin
DIB := TDIB.Create;
try
DIB.Assign(ViewBox.Picture.Graphic);
ViewBox.Picture.Graphic := DIB;
finally
DIB.Free;
end;
UpdateData;
end;
end;
procedure TDelphiXPictureEditForm.UpdateData;
procedure Draw2(Width, Height: Integer);
begin
ViewBox.Stretch := True;
ViewBox.Left := 6 + -(Width-ViewBox.Width) div 2;
ViewBox.Top := 6 + -(Height-ViewBox.Height) div 2;
ViewBox.Width := Width;
ViewBox.Height := Height;
end;
var
i: Integer;
r, r2: Double;
DIB: TDIB;
begin
if (ViewBox.Picture.Graphic<>nil) and (not ViewBox.Picture.Graphic.Empty) and
(ViewBox.Picture.Width>0) and (ViewBox.Picture.Height>0) then
begin
SizeLabel.Caption := Format(SDIBSize, [ViewBox.Picture.Width, ViewBox.Picture.Height]);
ClassNameLabel.Caption := ViewBox.Picture.Graphic.ClassName;
if ViewBox.Picture.Graphic is TDIB then
begin
i := (ViewBox.Picture.Graphic as TDIB).BitCount;
if i=32 then i := 32;
BitCountLabel.Caption := Format(SDIBColor, [1 shl i]);
DIB := ViewBox.Picture.Graphic as TDIB;
if DIB.BitmapInfo.bmiHeader.biSizeImage>100*1024 then
BitSizeLabel.Caption := Format(SDIBBitSize_K, [DIB.BitmapInfo.bmiHeader.biSizeImage div 1024])
else
BitSizeLabel.Caption := Format(SDIBBitSize, [DIB.BitmapInfo.bmiHeader.biSizeImage]);
end else
begin
BitCountLabel.Caption := '';
BitSizeLabel.Caption := '';
end;
ConvertToDIB.Enabled := not (ViewBox.Picture.Graphic is TDIB);
NoneLabel.Visible := True;
ClearButton.Enabled := True;
NoneLabel.Visible := False;
SaveButton.Enabled := True;
ViewBox.Width := 228;
ViewBox.Height := 228;
if (ViewBox.Picture.Width>ViewBox.Width) or (ViewBox.Picture.Height>ViewBox.Height) then
begin
r := ViewBox.Width/ViewBox.Picture.Width;
r2 := ViewBox.Height/ViewBox.Picture.Height;
if r>r2 then
r := r2;
Draw2(Round(r*ViewBox.Picture.Width), Round(r*ViewBox.Picture.Height));
end else
Draw2(ViewBox.Picture.Width, ViewBox.Picture.Height);
for i:=0 to PopupMenu1.Items.Count-1 do
if PopupMenu1.Items[i].Tag<>0 then
PopupMenu1.Items[i].Enabled := True;
end else
begin
SizeLabel.Caption := '';
BitCountLabel.Caption := '';
BitSizeLabel.Caption := '';
ClassNameLabel.Caption := '';
NoneLabel.Visible := False;
ClearButton.Enabled := False;
NoneLabel.Visible := True;
SaveButton.Enabled := False;
ConvertToDIB.Enabled := False;
for i:=0 to PopupMenu1.Items.Count-1 do
if PopupMenu1.Items[i].Tag<>0 then
PopupMenu1.Items[i].Enabled := False;
end;
PaletteChanged(True);
ViewBox.Invalidate;
end;
procedure TDelphiXPictureEditForm.geConvertColorClick(Sender: TObject);
begin
ConvertToDIBClick(nil);
FChanged := True;
(ViewBox.Picture.Graphic as TDIB).PixelFormat := MakeDIBPixelFormat(8, 8, 8);
(ViewBox.Picture.Graphic as TDIB).BitCount := TMenuItem(Sender).Tag;
UpdateData;
end;
procedure TDelphiXPictureEditForm.geGreyscaleClick(Sender: TObject);
begin
ConvertToDIBClick(nil);
FChanged := True;
(ViewBox.Picture.Graphic as TDIB).PixelFormat := MakeDIBPixelFormat(8, 8, 8);
(ViewBox.Picture.Graphic as TDIB).Greyscale(TMenuItem(Sender).Tag);
UpdateData;
end;
procedure TDelphiXPictureEditForm.geNegativeClick(Sender: TObject);
begin
ConvertToDIBClick(nil);
FChanged := True;
(ViewBox.Picture.Graphic as TDIB).Negative;
UpdateData;
end;
procedure TDelphiXPictureEditForm.geCompressClick(Sender: TObject);
begin
ConvertToDIBClick(nil);
FChanged := True;
(ViewBox.Picture.Graphic as TDIB).Compress;
UpdateData;
end;
procedure TDelphiXPictureEditForm.geDecompressClick(Sender: TObject);
begin
ConvertToDIBClick(nil);
FChanged := True;
(ViewBox.Picture.Graphic as TDIB).Decompress;
UpdateData;
end;
procedure TDelphiXPictureEditForm.geCopyClick(Sender: TObject);
var
AFormat: Word;
AData: THandle;
APalette: HPALETTE;
begin
Clipboard.Open;
try
ViewBox.Picture.Graphic.SaveToClipboardFormat(AFormat, AData, APalette);
Clipboard.SetAsHandle(AFormat, AData);
finally
Clipboard.Close;
end;
end;
procedure TDelphiXPictureEditForm.gePasteClick(Sender: TObject);
var
DIB: TDIB;
begin
if DIBClassOnly then
begin
FChanged := True;
try
DIB := TDIB.Create;
try
Clipboard.Open;
try
DIB.LoadFromClipboardFormat(CF_DIB, Clipboard.GetAsHandle(CF_DIB), 0);
finally
Clipboard.Close;
end;
ViewBox.Picture.Graphic := DIB;
finally
DIB.Free;
end;
except
ViewBox.Picture.Assign(Clipboard);
ConvertToDIBClick(nil);
end;
end else
begin
FChanged := True;
ViewBox.Picture.Assign(Clipboard);
end;
UpdateData;
end;
procedure TDelphiXPictureEditForm.PopupMenu1Popup(Sender: TObject);
var
i: Integer;
begin
if DIBClassOnly then
begin
gePaste.Enabled := False;
for i:=0 to Clipboard.FormatCount-1 do
if Clipboard.Formats[i]=CF_DIB then
begin
gePaste.Enabled := True;
Break;
end;
end else
begin
gePaste.Enabled := False;
for i:=0 to Clipboard.FormatCount-1 do
if ViewBox.Picture.SupportsClipboardFormat(Clipboard.Formats[i]) then
begin
gePaste.Enabled := True;
Break;
end;
end;
end;
end.