import
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
program ImagePreview;
|
||||
|
||||
uses
|
||||
Forms,
|
||||
MainFrm in 'MainFrm.pas' {MainForm};
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TMainForm, MainForm);
|
||||
Application.Run;
|
||||
end.
|
||||
Binary file not shown.
@@ -0,0 +1,135 @@
|
||||
object MainForm: TMainForm
|
||||
Left = 304
|
||||
Top = 165
|
||||
Width = 467
|
||||
Height = 405
|
||||
Caption = 'Image Preview'
|
||||
Color = clWhite
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
KeyPreview = True
|
||||
OldCreateOrder = False
|
||||
Position = poDesktopCenter
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
OnKeyUp = FormKeyUp
|
||||
OnMouseWheel = ScrollBoxMouseWheel
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object ImgView32: TImgView32
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 459
|
||||
Height = 371
|
||||
Align = alClient
|
||||
ParentShowHint = False
|
||||
PopupMenu = PopupMenu
|
||||
Scale = 1
|
||||
ScrollBars.Color = clScrollBar
|
||||
ScrollBars.ShowHandleGrip = True
|
||||
ScrollBars.Style = rbsDefault
|
||||
ShowHint = True
|
||||
SizeGrip = sgAuto
|
||||
TabOrder = 0
|
||||
OnScroll = ImgView32Scroll
|
||||
object AlphaView: TImgView32
|
||||
Left = 8
|
||||
Top = 8
|
||||
Width = 161
|
||||
Height = 145
|
||||
Scale = 1
|
||||
ScrollBars.Color = clScrollBar
|
||||
ScrollBars.ShowHandleGrip = True
|
||||
ScrollBars.Style = rbsDefault
|
||||
SizeGrip = sgAuto
|
||||
TabOrder = 2
|
||||
Visible = False
|
||||
end
|
||||
end
|
||||
object PopupMenu: TPopupMenu
|
||||
Left = 304
|
||||
Top = 28
|
||||
object ZoomInItem: TMenuItem
|
||||
Caption = 'Zoom In'
|
||||
OnClick = ZoomInItemClick
|
||||
end
|
||||
object ZoomOutItem: TMenuItem
|
||||
Caption = 'Zoom Out'
|
||||
OnClick = ZoomOutItemClick
|
||||
end
|
||||
object ActualSizeItem: TMenuItem
|
||||
Caption = 'Actual Size'
|
||||
OnClick = ActualSizeItemClick
|
||||
end
|
||||
object N1: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object RotateClockwiseItem: TMenuItem
|
||||
Caption = 'Rotate Clockwise'
|
||||
OnClick = RotateClockwiseItemClick
|
||||
end
|
||||
object RotateAntiClockwiseItem: TMenuItem
|
||||
Caption = 'Rotate Anti-Clockwise'
|
||||
OnClick = RotateAntiClockwiseItemClick
|
||||
end
|
||||
object N4: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object FlipHorizontalItem: TMenuItem
|
||||
Caption = 'Flip Horizontal'
|
||||
OnClick = FlipHorizontalItemClick
|
||||
end
|
||||
object FilpVerticalItem: TMenuItem
|
||||
Caption = 'Filp Vertical'
|
||||
OnClick = FilpVerticalItemClick
|
||||
end
|
||||
object N3: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object ShowAlphaItem: TMenuItem
|
||||
Caption = 'Show Just Alpha Channel'
|
||||
OnClick = ShowAlphaItemClick
|
||||
end
|
||||
object ShowWithAlphaItem: TMenuItem
|
||||
Caption = 'Show With Alpha Channel'
|
||||
OnClick = ShowWithAlphaItemClick
|
||||
end
|
||||
object N2: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object OpenImageItem: TMenuItem
|
||||
Caption = 'Open New Image'
|
||||
OnClick = OpenImageItemClick
|
||||
end
|
||||
end
|
||||
object FilterTimer: TTimer
|
||||
Interval = 500
|
||||
OnTimer = FilterTimerTimer
|
||||
Left = 308
|
||||
Top = 84
|
||||
end
|
||||
object OpenDialog: TOpenDialog
|
||||
Filter =
|
||||
'All image files|*.bmp;*.cut;*.ico;*.iff;*.lbm;*.jng;*.jpg;*.jpeg' +
|
||||
';*.koa;*.mng;*.pbm;*.pcd;*.pcx;*.pgm;*.png;*.ppm;*.psd;*.ras;*.t' +
|
||||
'ga;*.tif;*.tiff;.wbmp;*.xbm;*.xpm)|Windows or OS/2 Bitmap File (' +
|
||||
'*.BMP)|*.BMP|Dr. Halo (*.CUT)|*.CUT|Windows Icon (*.ICO)|*.ICO|A' +
|
||||
'miga IFF (*.IFF, *.LBM)|*.IFF;*.LBM|JPEG Network Graphics (*.JNG' +
|
||||
')|*.JNG|Independent JPEG Group (*.JPG)|*.JPG|Commodore 64 Koala ' +
|
||||
'(*.KOA)|*.KOA|Multiple Network Graphics (*.MNG)|*.MNG|Portable B' +
|
||||
'itmap (*.PBM)|*.PBM|Kodak PhotoCD (*.PCD)|*.PCD|PCX bitmap forma' +
|
||||
't (*.PCX)|*.PCX|Portable Graymap (*.PGM)|*.PGM|Portable Network ' +
|
||||
'Graphics (*.PNG)|*.PNG|Portable Pixelmap (*.PPM)|*.PPM|Photoshop' +
|
||||
' (*.PSD)|*.PSD|Sun Rasterfile (*.RAS)|*.RAS|Targa files (*.TGA)|' +
|
||||
'*.TGA|Tagged Image File Format (*.TIF)|*.TIF;*.TIFF|Wireless Bit' +
|
||||
'map (*.WBMP)|*.WBMP|X11 Bitmap Format (*.XBM)|*.XBM|X11 Pixmap F' +
|
||||
'ormat (*.XPM)|*.XPM'
|
||||
Title = 'Open Image File'
|
||||
Left = 328
|
||||
Top = 228
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,518 @@
|
||||
unit MainFrm;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, Menus, ExtCtrls, Math, GR32, GR32_Image, GR32_Transforms,
|
||||
ExtDlgs;
|
||||
|
||||
type
|
||||
TMainForm = class(TForm)
|
||||
PopupMenu: TPopupMenu;
|
||||
ZoomInItem: TMenuItem;
|
||||
ZoomOutItem: TMenuItem;
|
||||
ActualSizeItem: TMenuItem;
|
||||
ImgView32: TImgView32;
|
||||
N1: TMenuItem;
|
||||
AlphaView: TImgView32;
|
||||
ShowAlphaItem: TMenuItem;
|
||||
RotateClockwiseItem: TMenuItem;
|
||||
RotateAntiClockwiseItem: TMenuItem;
|
||||
N3: TMenuItem;
|
||||
ShowWithAlphaItem: TMenuItem;
|
||||
N4: TMenuItem;
|
||||
FlipHorizontalItem: TMenuItem;
|
||||
FilpVerticalItem: TMenuItem;
|
||||
FilterTimer: TTimer;
|
||||
OpenImageItem: TMenuItem;
|
||||
N2: TMenuItem;
|
||||
OpenDialog: TOpenDialog;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure ZoomInItemClick(Sender: TObject);
|
||||
procedure ZoomOutItemClick(Sender: TObject);
|
||||
procedure ActualSizeItemClick(Sender: TObject);
|
||||
procedure ScrollBoxMouseWheel(Sender: TObject; Shift: TShiftState;
|
||||
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||||
procedure FormKeyUp(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
procedure ShowAlphaItemClick(Sender: TObject);
|
||||
procedure RotateClockwiseItemClick(Sender: TObject);
|
||||
procedure RotateAntiClockwiseItemClick(Sender: TObject);
|
||||
procedure ShowWithAlphaItemClick(Sender: TObject);
|
||||
procedure FlipHorizontalItemClick(Sender: TObject);
|
||||
procedure FilpVerticalItemClick(Sender: TObject);
|
||||
procedure FilterTimerTimer(Sender: TObject);
|
||||
procedure ImgView32Scroll(Sender: TObject);
|
||||
procedure OpenImageItemClick(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
OrigWidth : integer;
|
||||
OrigHeight : integer;
|
||||
BPP : longword;
|
||||
|
||||
procedure LoadImage( Name : string);
|
||||
procedure RecalcWindowSize;
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
MainForm: TMainForm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
uses FreeImage;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
AlphaView.Visible := False;
|
||||
AlphaView.Align := alClient;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FormDestroy(Sender: TObject);
|
||||
begin
|
||||
// ...
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FormShow(Sender: TObject);
|
||||
begin
|
||||
ImgView32.Bitmap.StretchFilter := sfSPline;
|
||||
if ParamCount = 1 then
|
||||
LoadImage(ParamStr(1));
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.LoadImage( Name : string);
|
||||
var
|
||||
dib : PFIBITMAP;
|
||||
PBH : PBITMAPINFOHEADER;
|
||||
PBI : PBITMAPINFO;
|
||||
t : FREE_IMAGE_FORMAT;
|
||||
Ext : string;
|
||||
BM : TBitmap;
|
||||
x, y : integer;
|
||||
BP : PLONGWORD;
|
||||
DC : HDC;
|
||||
begin
|
||||
try
|
||||
t := FreeImage_GetFileType(PChar(Name), 16);
|
||||
|
||||
if t = FIF_UNKNOWN then
|
||||
begin
|
||||
// Check for types not supported by GetFileType
|
||||
Ext := UpperCase(ExtractFileExt(Name));
|
||||
if (Ext = '.TGA') or(Ext = '.TARGA') then
|
||||
t := FIF_TARGA
|
||||
else if Ext = '.MNG' then
|
||||
t := FIF_MNG
|
||||
else if Ext = '.PCD' then
|
||||
t := FIF_PCD
|
||||
else if Ext = '.WBMP' then
|
||||
t := FIF_WBMP
|
||||
else if Ext = '.CUT' then
|
||||
t := FIF_CUT
|
||||
else
|
||||
raise Exception.Create('The file "' + Name + '" cannot be displayed because SFM does not recognise the file type.');
|
||||
end;
|
||||
|
||||
dib := FreeImage_Load(t, PChar(name), 0);
|
||||
if Dib = nil then
|
||||
Close;
|
||||
PBH := FreeImage_GetInfoHeader(dib);
|
||||
PBI := FreeImage_GetInfo(dib^);
|
||||
|
||||
BPP := FreeImage_GetBPP(dib);
|
||||
|
||||
ShowWithAlphaItem.Enabled := BPP = 32;
|
||||
ShowAlphaItem.Enabled := BPP = 32;
|
||||
|
||||
if BPP = 32 then
|
||||
begin
|
||||
ImgView32.Bitmap.SetSize(FreeImage_GetWidth(dib), FreeImage_GetHeight(dib));
|
||||
|
||||
BP := PLONGWORD(FreeImage_GetBits(dib));
|
||||
for y := ImgView32.Bitmap.Height - 1 downto 0 do
|
||||
for x := 0 to ImgView32.Bitmap.Width - 1 do
|
||||
begin
|
||||
ImgView32.Bitmap.Pixel[x, y] := BP^;
|
||||
inc(BP);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
BM := TBitmap.Create;
|
||||
|
||||
BM.Assign(nil);
|
||||
DC := GetDC(Handle);
|
||||
|
||||
BM.handle := CreateDIBitmap(DC,
|
||||
PBH^,
|
||||
CBM_INIT,
|
||||
PChar(FreeImage_GetBits(dib)),
|
||||
PBI^,
|
||||
DIB_RGB_COLORS);
|
||||
|
||||
ImgView32.Bitmap.Assign(BM);
|
||||
AlphaView.Bitmap.Assign(BM);
|
||||
|
||||
BM.Free;
|
||||
ReleaseDC(Handle, DC);
|
||||
end;
|
||||
FreeImage_Unload(dib);
|
||||
|
||||
OrigWidth := ImgView32.Bitmap.Width;
|
||||
OrigHeight := ImgView32.Bitmap.Height;
|
||||
|
||||
Caption := ExtractFileName( Name ) + ' (' + IntToStr(OrigWidth) +
|
||||
' x ' + IntToStr(OrigHeight) + ')';
|
||||
if BPP = 32 then
|
||||
Caption := Caption + ' + Alpha';
|
||||
|
||||
AlphaView.Bitmap.SetSize(OrigWidth, OrigWidth);
|
||||
|
||||
ImgView32.Hint := 'Name: ' + Name + #13 +
|
||||
'Width: ' + IntToStr(OrigWidth) + #13 +
|
||||
'Height: ' + IntToStr(OrigHeight) + #13 +
|
||||
'BPP: ' + IntToStr(BPP);
|
||||
|
||||
RecalcWindowSize;
|
||||
|
||||
Show;
|
||||
except
|
||||
on e:exception do
|
||||
begin
|
||||
Application.BringToFront;
|
||||
MessageDlg(e.message, mtInformation, [mbOK], 0);
|
||||
Close;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ZoomInItemClick(Sender: TObject);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
|
||||
ImgView32.Scale := ImgView32.Scale * 2.0;
|
||||
RecalcWindowSize;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ZoomOutItemClick(Sender: TObject);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
|
||||
ImgView32.Scale := ImgView32.Scale / 2.0;
|
||||
RecalcWindowSize;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ActualSizeItemClick(Sender: TObject);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
|
||||
ImgView32.Scale := 1.0;
|
||||
|
||||
RecalcWindowSize;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.RecalcWindowSize;
|
||||
var
|
||||
Rect : TRect;
|
||||
CW, CH : integer;
|
||||
WSH, WSW : integer;
|
||||
TitleH : integer;
|
||||
BorderY : integer;
|
||||
BorderX : integer;
|
||||
begin
|
||||
CW := ImgView32.Bitmap.Width + GetSystemMetrics(SM_CXVSCROLL);
|
||||
CH := ImgView32.Bitmap.Height + GetSystemMetrics(SM_CYVSCROLL);
|
||||
|
||||
SystemParametersInfo( SPI_GETWORKAREA, 0, @Rect, 0);
|
||||
|
||||
WSH := Rect.Bottom - Rect.Top;
|
||||
WSW := Rect.Right - Rect.Left;
|
||||
TitleH := GetSystemMetrics(SM_CYCAPTION);
|
||||
BorderY := GetSystemMetrics(SM_CYSIZEFRAME) * 2;
|
||||
BorderX := GetSystemMetrics(SM_CXSIZEFRAME) * 2;
|
||||
|
||||
if (Top + CH + TitleH + BorderY > WSH) or (CH + TitleH + BorderY > WSH) then
|
||||
begin
|
||||
Top := Rect.Bottom - CH - BorderY;
|
||||
if Top < 0 then
|
||||
begin
|
||||
Top := 0;
|
||||
CH := WSH - TitleH - BorderY;
|
||||
CW := CW + GetSystemMetrics(SM_CXVSCROLL);
|
||||
|
||||
if CW + BorderX > WSW then
|
||||
CH := CH - GetSystemMetrics(SM_CYVSCROLL);
|
||||
end;
|
||||
end;
|
||||
|
||||
if (Left + CW + BorderX > WSW) or (CW + BorderX > WSW) then
|
||||
begin
|
||||
Left := Rect.Right - CW - BorderX;
|
||||
if Left < 0 then
|
||||
begin
|
||||
Left := 0;
|
||||
CW := WSW - BorderX;
|
||||
CH := CH + GetSystemMetrics(SM_CYVSCROLL);
|
||||
|
||||
if CH + TitleH + BorderY > WSH then
|
||||
CW := CW + GetSystemMetrics(SM_CXVSCROLL);
|
||||
end
|
||||
end;
|
||||
|
||||
ClientWidth := CW;
|
||||
ClientHeight := CH;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ScrollBoxMouseWheel(Sender: TObject;
|
||||
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
|
||||
var Handled: Boolean);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
|
||||
if WheelDelta < 0 then
|
||||
ImgView32.Scroll(0, 20)
|
||||
else
|
||||
ImgView32.Scroll(0, -20);
|
||||
Handled := True;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
var
|
||||
Amount : integer;
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
|
||||
if ssShift in Shift then
|
||||
Amount := 20 * 2
|
||||
else
|
||||
Amount := 20;
|
||||
|
||||
case Key of
|
||||
VK_ESCAPE:
|
||||
Close;
|
||||
VK_UP:
|
||||
ImgView32.Scroll(0, -Amount);
|
||||
VK_DOWN:
|
||||
ImgView32.Scroll(0, Amount);
|
||||
VK_LEFT:
|
||||
ImgView32.Scroll(-Amount, 0);
|
||||
VK_RIGHT:
|
||||
ImgView32.Scroll(Amount, 0);
|
||||
VK_HOME:
|
||||
ImgView32.ScrollToCenter(0, 0);
|
||||
VK_END:
|
||||
ImgView32.ScrollToCenter(ImgView32.Bitmap.Width, ImgView32.Bitmap.Height);
|
||||
VK_NEXT:
|
||||
ImgView32.Scroll(0, (Trunc(ImgView32.Bitmap.Height div 4)));
|
||||
VK_PRIOR:
|
||||
ImgView32.Scroll(0, -(Trunc(ImgView32.Bitmap.Height div 4)));
|
||||
end;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ShowAlphaItemClick(Sender: TObject);
|
||||
var
|
||||
x, y : integer;
|
||||
Col : TColor32;
|
||||
Alpha : TColor;
|
||||
begin
|
||||
if ShowAlphaItem.Checked then
|
||||
begin
|
||||
AlphaView.Visible := False;
|
||||
AlphaView.Bitmap.Delete;
|
||||
end
|
||||
else
|
||||
begin
|
||||
AlphaView.Bitmap.Width := ImgView32.Bitmap.Width;
|
||||
AlphaView.Bitmap.Height := ImgView32.Bitmap.Height;
|
||||
|
||||
for x := 0 to AlphaView.Bitmap.Width - 1 do
|
||||
for y := 0 to AlphaView.Bitmap.Height - 1 do
|
||||
begin
|
||||
Col := ImgView32.Bitmap.Pixel[x, y];
|
||||
Alpha := Col shr 24;
|
||||
AlphaView.Bitmap.Pixel[x, y] := Alpha + (Alpha shl 8) + (Alpha shl 16);
|
||||
end;
|
||||
AlphaView.Visible := True;
|
||||
end;
|
||||
ShowAlphaItem.Checked := not ShowAlphaItem.Checked;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.RotateClockwiseItemClick(Sender: TObject);
|
||||
var
|
||||
x : integer;
|
||||
y : integer;
|
||||
DestX : integer;
|
||||
DestY : integer;
|
||||
C : TColor32;
|
||||
begin
|
||||
AlphaView.Bitmap.Assign(ImgView32.Bitmap);
|
||||
|
||||
ImgView32.BeginUpdate;
|
||||
ImgView32.Bitmap.Width := AlphaView.Bitmap.Height;
|
||||
ImgView32.Bitmap.Height := AlphaView.Bitmap.Width;
|
||||
|
||||
for x := 0 to AlphaView.Bitmap.Width - 1 do
|
||||
for y := 0 to AlphaView.Bitmap.Height - 1 do
|
||||
begin
|
||||
C := AlphaView.Bitmap.Pixel[x, y];
|
||||
|
||||
DestX := (ImgView32.Bitmap.Width - 1) - Y;
|
||||
DestY := X;
|
||||
|
||||
ImgView32.Bitmap.Pixels[DestX, DestY] := C;
|
||||
end;
|
||||
|
||||
ImgView32.EndUpdate;
|
||||
ImgView32.Refresh;
|
||||
end;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.RotateAntiClockwiseItemClick(Sender: TObject);
|
||||
var
|
||||
x : integer;
|
||||
y : integer;
|
||||
DestX : integer;
|
||||
DestY : integer;
|
||||
C : TColor32;
|
||||
begin
|
||||
AlphaView.Bitmap.Assign(ImgView32.Bitmap);
|
||||
|
||||
ImgView32.BeginUpdate;
|
||||
ImgView32.Bitmap.Width := AlphaView.Bitmap.Height;
|
||||
ImgView32.Bitmap.Height := AlphaView.Bitmap.Width;
|
||||
|
||||
for x := 0 to AlphaView.Bitmap.Width - 1 do
|
||||
for y := 0 to AlphaView.Bitmap.Height - 1 do
|
||||
begin
|
||||
C := AlphaView.Bitmap.Pixel[x, y];
|
||||
|
||||
DestX := Y;
|
||||
DestY := (ImgView32.Bitmap.Height - 1) -X;
|
||||
|
||||
ImgView32.Bitmap.Pixels[DestX, DestY] := C;
|
||||
end;
|
||||
|
||||
ImgView32.EndUpdate;
|
||||
ImgView32.Refresh;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ShowWithAlphaItemClick(Sender: TObject);
|
||||
begin
|
||||
if ShowWithAlphaItem.Checked then
|
||||
ImgView32.Bitmap.DrawMode := dmOpaque
|
||||
else
|
||||
ImgView32.Bitmap.DrawMode := dmBlend;
|
||||
ShowWithAlphaItem.Checked := not ShowWithAlphaItem.Checked;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FlipHorizontalItemClick(Sender: TObject);
|
||||
var
|
||||
x : integer;
|
||||
y : integer;
|
||||
DestX : integer;
|
||||
DestY : integer;
|
||||
C : TColor32;
|
||||
begin
|
||||
AlphaView.Bitmap.Assign(ImgView32.Bitmap);
|
||||
|
||||
ImgView32.BeginUpdate;
|
||||
ImgView32.Bitmap.Width := AlphaView.Bitmap.Width;
|
||||
ImgView32.Bitmap.Height := AlphaView.Bitmap.Height;
|
||||
|
||||
for x := 0 to AlphaView.Bitmap.Width - 1 do
|
||||
for y := 0 to AlphaView.Bitmap.Height - 1 do
|
||||
begin
|
||||
C := AlphaView.Bitmap.Pixel[x, y];
|
||||
|
||||
DestX := (ImgView32.Bitmap.Width - 1) -X;
|
||||
DestY := Y;
|
||||
|
||||
ImgView32.Bitmap.Pixels[DestX, DestY] := C;
|
||||
end;
|
||||
|
||||
ImgView32.EndUpdate;
|
||||
ImgView32.Refresh;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FilpVerticalItemClick(Sender: TObject);
|
||||
var
|
||||
x : integer;
|
||||
y : integer;
|
||||
DestX : integer;
|
||||
DestY : integer;
|
||||
C : TColor32;
|
||||
begin
|
||||
AlphaView.Bitmap.Assign(ImgView32.Bitmap);
|
||||
|
||||
ImgView32.BeginUpdate;
|
||||
ImgView32.Bitmap.Width := AlphaView.Bitmap.Width;
|
||||
ImgView32.Bitmap.Height := AlphaView.Bitmap.Height;
|
||||
|
||||
for x := 0 to AlphaView.Bitmap.Width - 1 do
|
||||
for y := 0 to AlphaView.Bitmap.Height - 1 do
|
||||
begin
|
||||
C := AlphaView.Bitmap.Pixel[x, y];
|
||||
|
||||
DestX := X;
|
||||
DestY := (ImgView32.Bitmap.Height - 1) - Y;
|
||||
|
||||
ImgView32.Bitmap.Pixels[DestX, DestY] := C;
|
||||
end;
|
||||
|
||||
ImgView32.EndUpdate;
|
||||
ImgView32.Refresh;
|
||||
end;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.FilterTimerTimer(Sender: TObject);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
ImgView32.Bitmap.StretchFilter := sfSPline;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.ImgView32Scroll(Sender: TObject);
|
||||
begin
|
||||
FilterTimer.Enabled := False;
|
||||
if ImgView32.Bitmap.StretchFilter <> sfNearest then
|
||||
ImgView32.Bitmap.StretchFilter := sfNearest;
|
||||
FilterTimer.Enabled := True;
|
||||
end;
|
||||
// -----------------------------------------------------------------------------
|
||||
procedure TMainForm.OpenImageItemClick(Sender: TObject);
|
||||
begin
|
||||
if OpenDialog.Execute then
|
||||
begin
|
||||
try
|
||||
Screen.Cursor := crHourGlass;
|
||||
LoadImage(OpenDialog.FileName);
|
||||
finally
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,8 @@
|
||||
This is a simple image viewing application that uses the FreeImage library to display images in many different formats.
|
||||
|
||||
The app displays the image whose name is passed in as a command line argument.
|
||||
|
||||
|
||||
To compile the app you will also need the Graphics32 library available from www.g32.org. It has been tested with version 1.5.1 of Graphics32.
|
||||
|
||||
SJB.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
@@ -0,0 +1,13 @@
|
||||
program MultiBitmap;
|
||||
|
||||
uses
|
||||
Forms,
|
||||
mbMainForm in 'mbMainForm.pas' {MainForm};
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TMainForm, MainForm);
|
||||
Application.Run;
|
||||
end.
|
||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
||||
[Stats]
|
||||
EditorSecs=82
|
||||
DesignerSecs=5
|
||||
InspectorSecs=1
|
||||
CompileSecs=850
|
||||
OtherSecs=5
|
||||
StartTime=20.12.2004 11:40:22
|
||||
RealKeys=0
|
||||
EffectiveKeys=0
|
||||
DebugSecs=19
|
||||
@@ -0,0 +1,89 @@
|
||||
object MainForm: TMainForm
|
||||
Left = 203
|
||||
Top = 192
|
||||
Width = 696
|
||||
Height = 480
|
||||
Caption = 'MultiBitmap Demo'
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Shell Dlg 2'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
OnPaint = FormPaint
|
||||
OnResize = FormResize
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object ToolBar: TToolBar
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 688
|
||||
Height = 25
|
||||
AutoSize = True
|
||||
ButtonHeight = 21
|
||||
ButtonWidth = 33
|
||||
Caption = 'ToolBar'
|
||||
EdgeBorders = [ebLeft, ebTop, ebRight, ebBottom]
|
||||
Flat = True
|
||||
Indent = 3
|
||||
ShowCaptions = True
|
||||
TabOrder = 0
|
||||
object tbLoad: TToolButton
|
||||
Left = 3
|
||||
Top = 0
|
||||
Caption = 'Load'
|
||||
ImageIndex = 0
|
||||
OnClick = tbLoadClick
|
||||
end
|
||||
object ToolButton1: TToolButton
|
||||
Left = 36
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton1'
|
||||
ImageIndex = 1
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object tbClose: TToolButton
|
||||
Left = 44
|
||||
Top = 0
|
||||
Caption = 'Close'
|
||||
ImageIndex = 1
|
||||
OnClick = tbCloseClick
|
||||
end
|
||||
object ToolButton2: TToolButton
|
||||
Left = 77
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton2'
|
||||
ImageIndex = 2
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object Label1: TLabel
|
||||
Left = 85
|
||||
Top = 0
|
||||
Width = 36
|
||||
Height = 21
|
||||
Caption = 'Pages: '
|
||||
Layout = tlCenter
|
||||
end
|
||||
object cbPages: TComboBox
|
||||
Left = 121
|
||||
Top = 0
|
||||
Width = 60
|
||||
Height = 21
|
||||
Style = csDropDownList
|
||||
DropDownCount = 15
|
||||
ItemHeight = 13
|
||||
TabOrder = 0
|
||||
OnChange = cbPagesChange
|
||||
end
|
||||
end
|
||||
object OD: TOpenDialog
|
||||
Filter = 'TIFF multibitmap (*.tiff, *.tif)|*.tiff; *.tif|ICO|*.ico'
|
||||
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing]
|
||||
Title = 'Open multibitmap..'
|
||||
Left = 64
|
||||
Top = 96
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,150 @@
|
||||
unit mbMainForm;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, ComCtrls, ToolWin, StdCtrls, FreeBitmap;
|
||||
|
||||
type
|
||||
TMainForm = class(TForm)
|
||||
ToolBar: TToolBar;
|
||||
tbLoad: TToolButton;
|
||||
ToolButton1: TToolButton;
|
||||
tbClose: TToolButton;
|
||||
ToolButton2: TToolButton;
|
||||
cbPages: TComboBox;
|
||||
Label1: TLabel;
|
||||
OD: TOpenDialog;
|
||||
procedure tbLoadClick(Sender: TObject);
|
||||
procedure FormPaint(Sender: TObject);
|
||||
procedure tbCloseClick(Sender: TObject);
|
||||
procedure cbPagesChange(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
private
|
||||
FMultiBitmap: TFreeMultiBitmap;
|
||||
FPage: TFreeWinBitmap;
|
||||
|
||||
procedure PageBitmapChangeHandler(Sender: TObject);
|
||||
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure OpenMultiBitmap(const FileName: string);
|
||||
procedure CloseMultiBitmap;
|
||||
procedure OpenPage(Number: Integer);
|
||||
end;
|
||||
|
||||
var
|
||||
MainForm: TMainForm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
{ TMainForm }
|
||||
|
||||
procedure TMainForm.CloseMultiBitmap;
|
||||
begin
|
||||
if FPage.IsValid then
|
||||
FMultiBitmap.UnlockPage(Fpage, False);
|
||||
FMultiBitmap.Close;
|
||||
cbPages.Clear;
|
||||
end;
|
||||
|
||||
constructor TMainForm.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited;
|
||||
FMultiBitmap := TFreeMultiBitmap.Create;
|
||||
FPage := TFreeWinBitmap.Create;
|
||||
FPage.OnChange := PageBitmapChangeHandler;
|
||||
end;
|
||||
|
||||
destructor TMainForm.Destroy;
|
||||
begin
|
||||
if FMultiBitmap.IsValid then
|
||||
CloseMultiBitmap;
|
||||
FMultiBitmap.Free;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TMainForm.OpenMultiBitmap(const FileName: string);
|
||||
var
|
||||
I, Cnt: Integer;
|
||||
begin
|
||||
if FMultiBitmap.IsValid then CloseMultiBitmap;
|
||||
|
||||
FMultiBitmap.Open(FileName, False, True);
|
||||
|
||||
Cnt := FMultiBitmap.GetPageCount;
|
||||
cbPages.OnChange := nil;
|
||||
cbPages.Clear;
|
||||
for I := 0 to Cnt - 1 do
|
||||
cbPages.Items.Add(IntToStr(I));
|
||||
cbPages.OnChange := cbPagesChange;
|
||||
end;
|
||||
|
||||
procedure TMainForm.OpenPage(Number: Integer);
|
||||
begin
|
||||
if not FMultiBitmap.IsValid then Exit;
|
||||
|
||||
if FPage.IsValid then
|
||||
FMultiBitmap.UnlockPage(FPage, False);
|
||||
|
||||
FMultiBitmap.LockPage(Number, FPage);
|
||||
end;
|
||||
|
||||
procedure TMainForm.PageBitmapChangeHandler(Sender: TObject);
|
||||
begin
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TMainForm.tbLoadClick(Sender: TObject);
|
||||
begin
|
||||
if OD.Execute then
|
||||
begin
|
||||
try
|
||||
OpenMultiBitmap(OD.FileName);
|
||||
except
|
||||
raise Exception.CreateFmt('Can not load file %s', [OD.FileName]);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMainForm.WMEraseBkgnd(var Message: TWMEraseBkgnd);
|
||||
begin
|
||||
Message.Result := 1;
|
||||
end;
|
||||
|
||||
procedure TMainForm.FormPaint(Sender: TObject);
|
||||
begin
|
||||
if not FPage.IsValid then
|
||||
begin
|
||||
Canvas.Brush.Color := clBtnFace;
|
||||
Canvas.FillRect(ClientRect);
|
||||
end
|
||||
else
|
||||
FPage.Draw(Canvas.Handle, ClientRect);
|
||||
end;
|
||||
|
||||
procedure TMainForm.tbCloseClick(Sender: TObject);
|
||||
begin
|
||||
if FMultiBitmap.IsValid then
|
||||
CloseMultiBitmap;
|
||||
end;
|
||||
|
||||
procedure TMainForm.cbPagesChange(Sender: TObject);
|
||||
var
|
||||
Page: Integer;
|
||||
begin
|
||||
Page := StrToInt(cbPages.Text);
|
||||
OpenPage(Page);
|
||||
end;
|
||||
|
||||
procedure TMainForm.FormResize(Sender: TObject);
|
||||
begin
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,22 @@
|
||||
TargaImage.pas is a TGraphic descendant for Delphi. Installing it
|
||||
will allow Delphi TImage and TDBImage components to read Targa files
|
||||
just like BMP & WMF files with no coding on your part.
|
||||
|
||||
It also adds the TGA file type to the Delphi Open/Save Picture dialog
|
||||
boxes.
|
||||
|
||||
To install this unit, place it in your one of your library folders
|
||||
and make it available to all your Delphi projects by using
|
||||
Component>Install Component from the Delphi menus.
|
||||
|
||||
NOTE: any Delphi applications using this *must* have FreeImage.dll
|
||||
installed in your application's folder, or somewhere in the path.
|
||||
|
||||
-----------------------
|
||||
|
||||
Tommy
|
||||
Edinburgh, Scotland
|
||||
LeTene@battlefieldeurope.org
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
unit TargaImage;
|
||||
|
||||
// ==========================================================
|
||||
//
|
||||
// This file is part of FreeImage 3
|
||||
//
|
||||
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
|
||||
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
|
||||
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
|
||||
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
|
||||
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
|
||||
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
|
||||
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
|
||||
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
||||
// THIS DISCLAIMER.
|
||||
//
|
||||
// Use at your own risk!
|
||||
//
|
||||
// ==========================================================
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows,
|
||||
Classes,
|
||||
FreeImage,
|
||||
Graphics,
|
||||
Types;
|
||||
|
||||
type
|
||||
TTargaImage = class(TGraphic)
|
||||
private
|
||||
fImage: PFIBITMAP;
|
||||
fWidth: Integer;
|
||||
fHeight: Integer;
|
||||
protected
|
||||
procedure Draw(ACanvas: TCanvas; const ARect: TRect); override;
|
||||
function GetEmpty: Boolean; override;
|
||||
function GetHeight: Integer; override;
|
||||
function GetWidth: Integer; override;
|
||||
procedure SetHeight(Value: Integer); override;
|
||||
procedure SetWidth(Value: Integer); override;
|
||||
public
|
||||
constructor Create; override;
|
||||
destructor Destroy; override;
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE); override;
|
||||
procedure LoadFromStream(Stream: TStream); override;
|
||||
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE); override;
|
||||
procedure SaveToStream(Stream: TStream); override;
|
||||
end;
|
||||
|
||||
procedure Register;
|
||||
|
||||
implementation
|
||||
|
||||
{ Design-time registration }
|
||||
|
||||
procedure Register;
|
||||
begin
|
||||
TPicture.RegisterFileFormat('tga', 'TARGA Files', TTargaImage);
|
||||
end;
|
||||
|
||||
{ IO functions }
|
||||
|
||||
function FI_ReadProc(buffer : pointer; size : Cardinal; count : Cardinal; handle : fi_handle) : UInt; stdcall;
|
||||
var
|
||||
stream: TStream;
|
||||
bytesToRead: Cardinal;
|
||||
begin
|
||||
stream := TStream(handle);
|
||||
bytesToRead := size*count;
|
||||
Result := stream.Read(buffer^, bytesToRead);
|
||||
end;
|
||||
|
||||
function FI_WriteProc(buffer : pointer; size, count : Cardinal; handle : fi_handle) : UInt; stdcall;
|
||||
var
|
||||
stream: TStream;
|
||||
bytesToWrite: Cardinal;
|
||||
begin
|
||||
stream := TStream(handle);
|
||||
bytesToWrite := size*count;
|
||||
Result := stream.Write(buffer^, bytesToWrite);
|
||||
end;
|
||||
|
||||
function FI_SeekProc(handle : fi_handle; offset : longint; origin : integer) : Integer; stdcall;
|
||||
begin
|
||||
TStream(handle).Seek(offset, origin);
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
function FI_TellProc(handle : fi_handle) : LongInt; stdcall;
|
||||
begin
|
||||
Result := TStream(handle).Position;
|
||||
end;
|
||||
|
||||
{ TTargaImage }
|
||||
|
||||
constructor TTargaImage.Create;
|
||||
begin
|
||||
fImage := nil;
|
||||
fWidth := 0;
|
||||
fHeight := 0;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
destructor TTargaImage.Destroy;
|
||||
begin
|
||||
if Assigned(fImage) then
|
||||
FreeImage_Unload(fImage);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.Assign(Source: TPersistent);
|
||||
begin
|
||||
if Source is TTargaImage then begin
|
||||
fImage := FreeImage_Clone(TTargaImage(Source).fImage);
|
||||
fWidth := FreeImage_GetWidth(fImage);
|
||||
fHeight := FreeImage_GetHeight(fImage);
|
||||
Changed(Self);
|
||||
end else
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.Draw(ACanvas: TCanvas; const ARect: TRect);
|
||||
var
|
||||
pbi: PBitmapInfo;
|
||||
begin
|
||||
if Assigned(fImage) then begin
|
||||
pbi := FreeImage_GetInfo(fImage);
|
||||
SetStretchBltMode(ACanvas.Handle, COLORONCOLOR);
|
||||
StretchDIBits(ACanvas.Handle, ARect.left, ARect.top,
|
||||
ARect.right-ARect.left, ARect.bottom-ARect.top,
|
||||
0, 0, fWidth, fHeight,
|
||||
FreeImage_GetBits(fImage), pbi^, DIB_RGB_COLORS, SRCCOPY);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TTargaImage.GetEmpty: Boolean;
|
||||
begin
|
||||
Result := Assigned(fImage);
|
||||
end;
|
||||
|
||||
function TTargaImage.GetHeight: Integer;
|
||||
begin
|
||||
Result := fHeight;
|
||||
end;
|
||||
|
||||
function TTargaImage.GetWidth: Integer;
|
||||
begin
|
||||
Result := fWidth;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE);
|
||||
begin
|
||||
if Assigned(fImage) then begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.LoadFromStream(Stream: TStream);
|
||||
var
|
||||
io: FreeImageIO;
|
||||
begin
|
||||
with io do begin
|
||||
read_proc := FI_ReadProc;
|
||||
write_proc := FI_WriteProc;
|
||||
seek_proc := FI_SeekProc;
|
||||
tell_proc := FI_TellProc;
|
||||
end;
|
||||
fImage := FreeImage_LoadFromHandle(FIF_TARGA, @io, Stream);
|
||||
if Assigned(fImage) then begin
|
||||
fWidth := FreeImage_GetWidth(fImage);
|
||||
fHeight := FreeImage_GetHeight(fImage);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE);
|
||||
begin
|
||||
end;
|
||||
|
||||
procedure TTargaImage.SaveToStream(Stream: TStream);
|
||||
var
|
||||
io: FreeImageIO;
|
||||
begin
|
||||
with io do begin
|
||||
read_proc := FI_ReadProc;
|
||||
write_proc := FI_WriteProc;
|
||||
seek_proc := FI_SeekProc;
|
||||
tell_proc := FI_TellProc;
|
||||
end;
|
||||
FreeImage_SaveToHandle(FIF_TARGA, fImage, @io, Stream);
|
||||
end;
|
||||
|
||||
procedure TTargaImage.SetHeight(Value: Integer);
|
||||
begin
|
||||
if Assigned(fImage) then begin
|
||||
fHeight := Value;
|
||||
FreeImage_Rescale(fImage, fWidth, fHeight, FILTER_BICUBIC);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTargaImage.SetWidth(Value: Integer);
|
||||
begin
|
||||
if Assigned(fImage) then begin
|
||||
fWidth := Value;
|
||||
FreeImage_Rescale(fImage, fWidth, fHeight, FILTER_BICUBIC);
|
||||
end;
|
||||
end;
|
||||
|
||||
initialization
|
||||
TPicture.RegisterFileFormat('tga', 'TARGA Files', TTargaImage);
|
||||
end.
|
||||
@@ -0,0 +1,13 @@
|
||||
program MainDemo;
|
||||
|
||||
uses
|
||||
Forms,
|
||||
MainForm in 'MainForm.pas' {fwbMainForm};
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TfwbMainForm, fwbMainForm);
|
||||
Application.Run;
|
||||
end.
|
||||
Binary file not shown.
@@ -0,0 +1,607 @@
|
||||
object fwbMainForm: TfwbMainForm
|
||||
Left = 205
|
||||
Top = 206
|
||||
Width = 696
|
||||
Height = 480
|
||||
Caption = 'FreeWinBitmap - MainDemo'
|
||||
Color = clCaptionText
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
Menu = MainMenu
|
||||
OldCreateOrder = False
|
||||
ShowHint = True
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
OnPaint = FormPaint
|
||||
OnResize = FormResize
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object StatusBar: TStatusBar
|
||||
Left = 0
|
||||
Top = 411
|
||||
Width = 688
|
||||
Height = 23
|
||||
Panels = <
|
||||
item
|
||||
Alignment = taCenter
|
||||
Width = 120
|
||||
end
|
||||
item
|
||||
Alignment = taCenter
|
||||
Width = 80
|
||||
end
|
||||
item
|
||||
Width = 50
|
||||
end>
|
||||
end
|
||||
object tbTools: TToolBar
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 688
|
||||
Height = 29
|
||||
Caption = 'ToolBar'
|
||||
Color = clBtnFace
|
||||
EdgeBorders = [ebTop, ebBottom]
|
||||
Flat = True
|
||||
Images = ImageList1
|
||||
ParentColor = False
|
||||
TabOrder = 1
|
||||
object ToolButton1: TToolButton
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton1'
|
||||
ImageIndex = 1
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object btnOpen: TToolButton
|
||||
Left = 8
|
||||
Top = 0
|
||||
Hint = 'Open image file...'
|
||||
Caption = 'Open...'
|
||||
ImageIndex = 0
|
||||
OnClick = mnuFileOpenClick
|
||||
end
|
||||
object ToolButton4: TToolButton
|
||||
Left = 31
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton4'
|
||||
ImageIndex = 4
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object btnCopy: TToolButton
|
||||
Left = 39
|
||||
Top = 0
|
||||
Hint = 'Copy to clipboard'
|
||||
Caption = 'Copy'
|
||||
ImageIndex = 1
|
||||
OnClick = btnCopyClick
|
||||
end
|
||||
object btnPaste: TToolButton
|
||||
Left = 62
|
||||
Top = 0
|
||||
Hint = 'Paste from from clipboard'
|
||||
Caption = 'Paste'
|
||||
ImageIndex = 2
|
||||
OnClick = btnPasteClick
|
||||
end
|
||||
object ToolButton3: TToolButton
|
||||
Left = 85
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton3'
|
||||
ImageIndex = 4
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object btnClear: TToolButton
|
||||
Left = 93
|
||||
Top = 0
|
||||
Caption = 'Clear'
|
||||
ImageIndex = 3
|
||||
OnClick = btnClearClick
|
||||
end
|
||||
end
|
||||
object MainMenu: TMainMenu
|
||||
Left = 120
|
||||
Top = 48
|
||||
object mnuFile: TMenuItem
|
||||
Caption = '&File'
|
||||
object mnuFileOpen: TMenuItem
|
||||
Caption = '&Open'
|
||||
OnClick = mnuFileOpenClick
|
||||
end
|
||||
object mnuExit: TMenuItem
|
||||
Caption = 'E&xit'
|
||||
OnClick = mnuExitClick
|
||||
end
|
||||
end
|
||||
object mnuImage: TMenuItem
|
||||
Caption = 'Image'
|
||||
object mnuImageFlip: TMenuItem
|
||||
Caption = 'Flip'
|
||||
object mnuFlipHorz: TMenuItem
|
||||
Caption = 'Horizontal'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuFlipVert: TMenuItem
|
||||
Caption = 'Vertical'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
end
|
||||
object mnuConvert: TMenuItem
|
||||
Caption = 'Convert'
|
||||
object mnuTo4Bits: TMenuItem
|
||||
Caption = 'To 4 Bits'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuTo8Bits: TMenuItem
|
||||
Caption = 'To 8 Bits'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuTo16Bits555: TMenuItem
|
||||
Caption = 'To 16 Bits (555)'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuTo16Bits565: TMenuItem
|
||||
Caption = 'To 16 Bits (565)'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuTo24Bits: TMenuItem
|
||||
Caption = 'To 24 Bits'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuTo32Bits: TMenuItem
|
||||
Caption = 'To 32 Bits'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuDither: TMenuItem
|
||||
Caption = 'Dither'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuQuantize: TMenuItem
|
||||
Caption = 'Quantize'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuGrayScale: TMenuItem
|
||||
Caption = 'GrayScale'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
end
|
||||
object mnuRotate: TMenuItem
|
||||
Caption = 'Rotate'
|
||||
object mnuClockwise: TMenuItem
|
||||
Caption = 'Clockwise'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuAntiClockwise: TMenuItem
|
||||
Caption = 'AntiClockwise'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
end
|
||||
object mnuInvert: TMenuItem
|
||||
Caption = 'Invert'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
object mnuClear: TMenuItem
|
||||
Caption = 'Clear'
|
||||
OnClick = mnuFlipHorzClick
|
||||
end
|
||||
end
|
||||
end
|
||||
object OD: TOpenDialog
|
||||
Title = 'Open file ...'
|
||||
Left = 152
|
||||
Top = 48
|
||||
end
|
||||
object ImageList1: TImageList
|
||||
Left = 184
|
||||
Top = 48
|
||||
Bitmap = {
|
||||
494C010104000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
|
||||
0000000000003600000028000000400000003000000001002000000000000030
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000007088900060809000607880005070
|
||||
8000506070004058600040485000303840002030300020203000101820001010
|
||||
1000101020000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000080685000203040002030400020304000203040002030
|
||||
4000203040002030400020304000203040000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000DFE2F700EFF0FB0000000000000000007088900090A0B00070B0D0000090
|
||||
D0000090D0000090D0000090C0001088C0001080B0001080B0002078A0002070
|
||||
900020486000B9BEBE0000000000000000000000000000000000000000000000
|
||||
00000000000000000000C0704000B0583000B0583000A0502000A05020009048
|
||||
2000904820009040200080402000000000007086900060809000506070004050
|
||||
6000304050002030400090706000F0E0D000B0A09000B0A09000B0A09000B0A0
|
||||
9000B0A09000B0A09000B0A0900020304000000000000000000000000000EFF1
|
||||
FF001F3BF100EFF1FF000000000000000000000000000000000000000000CFD3
|
||||
F3001F2DB900CFD2F30000000000000000008088900080C0D00090A8B00080E0
|
||||
FF0060D0FF0050C8FF0050C8FF0040C0F00030B0F00030A8F00020A0E0001090
|
||||
D00020688000656A700000000000000000000000000000000000000000000000
|
||||
00000000000000000000C0785000FFF8F000D0B0A000D0B0A000D0B0A000C0B0
|
||||
A000C0A8A000C0A8900090402000000000007080900020B8F0000090D0000090
|
||||
D0000090D0000090D00090786000F0E8E000F0D8D000E0D0C000E0C8C000D0C0
|
||||
B000D0B8B000D0B8B000B0A09000203040000000000000000000F0F2FF00576F
|
||||
FF001030FF001E34FF00EFF1FF00000000000000000000000000DFE2F7003F51
|
||||
CF000018C0000F1EB400DFE2F700000000008090A00080D0F00090A8B00090C0
|
||||
D00070D8FF0060D0FF0060D0FF0050C8FF0050C0FF0040B8F00030B0F00030A8
|
||||
F0001088D00020486000E1E4E500000000000000000000000000000000000000
|
||||
00000000000000000000D0886000FFFFFF00E0906000D0805000D0805000D080
|
||||
5000D0805000C0A8A00090482000000000007088900070C8F00010B8F00010B0
|
||||
F00000A8E0000098D000A0807000F0F0F000C0B0A000C0B0A000C0A8A000B0A0
|
||||
9000D0C0B000B0A09000B0A0900020304000000000000000000000000000F1F2
|
||||
FF002D52FF001030FF000028FF00CFD5FF0000000000CFD3F3001F34C7000018
|
||||
D0000F25C300BFC5EF0000000000000000008090A00080D8F00080C8E00090A8
|
||||
B00080E0FF0070D0FF0060D8FF0060D0FF0060D0FF0050C8FF0040C0F00040B8
|
||||
F00030B0F000206880007897A50000000000B0A0900060483000604830006048
|
||||
30006048300060483000D0907000FFFFFF00FFFFFF00FFF0F000F0E0D000F0D0
|
||||
C000F0C0B000C0B0A00090482000000000008088900070D0F00030C0F00010B8
|
||||
F00000A8F00000A0E000A0888000FFF8FF00F0F0F000F0E8E000F0D8D000E0D0
|
||||
C000705850006050400050484000404040000000000000000000000000000000
|
||||
0000F1F2FF002D52FF001030FF000F2DFF00CFD3F6001F34D5000020E0000F25
|
||||
D200DFE2F7000000000000000000000000008098A00090E0F00090E0FF0090A8
|
||||
B00090B8C00070D8FF0060D8FF0060D8FF0060D8FF0060D0FF0050D0FF0050C8
|
||||
FF0040B8F00030A0E0004B697800DEE1E400B0A09000FFF0F000F0E0D000E0D8
|
||||
D000E0D0C000E0C8C000E0A08000FFFFFF00F0A88000E0987000E0906000D080
|
||||
5000D0805000D0B0A000A0482000000000008090A00080D8F00040C8F00030C0
|
||||
F00010B8F00000A0E000B0908000FFFFFF00C0B0A000C0B0A000C0A8A000F0E0
|
||||
D00080605000D0C8C00060504000000000000000000000000000000000000000
|
||||
000000000000E3E6FF005669FF001038FF000020F0000F2DF0002F42D800DFE2
|
||||
F700000000000000000000000000000000008098A00090E0F000A0E8FF0080C8
|
||||
E00090A8B00080E0FF0080E0FF0080E0FF0080E0FF0080E0FF0080E0FF0080E0
|
||||
FF0070D8FF0070D8FF0050A8D000919BA500B0A09000FFF8F000E0B08000E0A0
|
||||
7000E0A07000D0987000E0A89000FFFFFF00FFFFFF00FFFFFF00FFF8F000F0E8
|
||||
E000F0D0C000D0B0A000A0502000000000008098A00090E0F00060D8F00050C8
|
||||
F00030C0F00010B0F000B0989000FFFFFF00FFFFFF00FFF8FF00F0F0F000F0E8
|
||||
E000806850008060500000000000000000000000000000000000000000000000
|
||||
00000000000000000000C3CAFF002048FF001030FF000F2DF000CFD3F6000000
|
||||
00000000000000000000000000000000000090A0A000A0E8F000A0E8FF00A0E8
|
||||
FF0090B0C00090B0C00090A8B00090A8B00080A0B00080A0B0008098A0008098
|
||||
A0008090A0008090A0008088900070889000C0A89000FFFFFF00FFF8F000F0F0
|
||||
F000F0E8E000F0E0D000E0B8A000FFFFFF00FFB09000FFB09000F0D8D000E090
|
||||
6000B0583000B0583000A0502000000000008098A000A0E8F00080E0F00070D8
|
||||
F00050D0F00010B0F000B0A09000B0989000B0908000A0888000A08070009078
|
||||
6000907060000000000000000000000000000000000000000000000000000000
|
||||
000000000000CFD7FF004060FF003050FF002D4BFF001038FF000020F000DFE3
|
||||
FD000000000000000000000000000000000090A0B000A0E8F000A0F0FF00A0E8
|
||||
FF00A0E8FF0080D8FF0060D8FF0060D8FF0060D8FF0060D8FF0060D8FF0060D8
|
||||
FF0070889000000000000000000000000000C0A8A000FFFFFF00FFC8A000F0B8
|
||||
9000E0B08000E0A07000F0C0A000FFFFFF00FFFFFF00FFFFFF00FFFFFF00F098
|
||||
7000F0C8B000B0583000EBD5CB000000000090A0A000B0F0FF00A0E8FF0090E0
|
||||
F00070D0F00010A0D00010A0D00010A0D0001098D0000090D0000090D0000090
|
||||
D000303840000000000000000000000000000000000000000000000000000000
|
||||
0000DBE1FF004060FF004058FF004B70FF00CFD5FF004B69FF002040FF000020
|
||||
F000CFD5FC0000000000000000000000000090A0B000A0F0F000B0F0F000A0F0
|
||||
FF00A0E8FF00A0E8FF0070D8FF0090A0A0008098A0008098A0008090A0008090
|
||||
900070889000000000000000000000000000C0B0A000FFFFFF00FFFFFF00FFF8
|
||||
FF00FFF0F000F0E8E000F0C8B000FFFFFF00FFFFFF00FFFFFF00FFFFFF00F0A8
|
||||
8000C0683000EFD9CB00000000000000000090A0B000B0F0FF00A0F0FF006080
|
||||
9000607080005070800050687000506870005060700040587000207090000090
|
||||
D00040486000000000000000000000000000000000000000000000000000E7EB
|
||||
FF005070FF005078FF00708AFF00E7EBFF0000000000DBDFFF004B69FF003048
|
||||
FF000020F000CFD5FC00000000000000000090A8B000A0D0E000B0F0F000B0F0
|
||||
F000A0F0FF00A0E8FF0090A0B000B3C7CB000000000000000000000000000000
|
||||
000000000000906850009068500090685000D0B8B000FFFFFF00FFD8C000FFD0
|
||||
B000F0E0D000B0A09000F0C8B000F0C0B000F0C0B000F0B8A000F0B09000F0B0
|
||||
9000F7E3D70000000000000000000000000090A8B000B0F0FF00B0F0FF006088
|
||||
900090C8D00090E8F00080D8E00060C8E0005098B000405860002080A0000090
|
||||
D000505870000000000000000000000000000000000000000000F3F5FF006078
|
||||
FF006078FF00697FFF00F3F5FF00000000000000000000000000E7EAFF004B69
|
||||
FF003050FF000028FF00DFE3FD0000000000DCE3E60090A8B00090A8B00090A8
|
||||
B00090A8B00090A8B000AAB3B400000000000000000000000000000000000000
|
||||
000000000000E1D4D2009068500090685000D0C0B000FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00C0A89000D0C8C00090706000E1DCD80000000000000000000000
|
||||
00000000000000000000000000000000000090A8B000B0F0F000B0F0FF00A0F0
|
||||
F0007098A000A0F0F00060757C0080C8D000507080003060800060C0F00020B8
|
||||
F00050607000000000000000000000000000000000000000000000000000E7EB
|
||||
FF006987FF00F3F5FF000000000000000000000000000000000000000000E7EA
|
||||
FF005773FF00E1E5FF0000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000090786000B7A498000000
|
||||
0000F9F6F600A0908000E1D9D20090786000E0C0B000FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00C0B0A000A0806000E1DCD8000000000000000000000000000000
|
||||
000000000000000000000000000000000000CED8DC0090A8B00090A8B00090A8
|
||||
B0006090A000A0E8F000A0E8F00090D8E0004068700070889000808890007088
|
||||
9000D7DADC000000000000000000000000000000000000000000000000000000
|
||||
0000F3F5FF000000000000000000000000000000000000000000000000000000
|
||||
0000E7EAFF000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000D1CFC900A0908000A088
|
||||
8000B0988000CFC7BF000000000000000000E0C0B000E0C0B000D0C0B000D0C0
|
||||
B000D0B8B000D0B0A000E6DEDC00000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
00000000000080B0C00080B0C00080A0B000DEE1E40000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000424D3E000000000000003E000000
|
||||
2800000040000000300000000100010000000000800100000000000000000000
|
||||
000000000000000000000000FFFFFF0000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000FFFFFFFFFFFFFFFF0007FFFFFC00FFF3
|
||||
0003FC010000E3E30003FC010000C1C10001FC010000E083000100010000F007
|
||||
000000010001F80F000000010003FC1F000000010007F80F000700010007F007
|
||||
000700030007E08300F800070007C1C101F8007F0007E3E3FF9000FF0007F7F7
|
||||
FF8301FFF87FFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
|
||||
000000000000}
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,227 @@
|
||||
unit MainForm;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, Menus, FreeBitmap, ComCtrls, ImgList, ToolWin;
|
||||
|
||||
type
|
||||
TfwbMainForm = class(TForm)
|
||||
MainMenu: TMainMenu;
|
||||
mnuFile: TMenuItem;
|
||||
mnuFileOpen: TMenuItem;
|
||||
mnuExit: TMenuItem;
|
||||
OD: TOpenDialog;
|
||||
StatusBar: TStatusBar;
|
||||
mnuImage: TMenuItem;
|
||||
mnuImageFlip: TMenuItem;
|
||||
mnuFlipHorz: TMenuItem;
|
||||
mnuFlipVert: TMenuItem;
|
||||
mnuConvert: TMenuItem;
|
||||
mnuTo8Bits: TMenuItem;
|
||||
mnuTo16Bits555: TMenuItem;
|
||||
mnuTo16Bits565: TMenuItem;
|
||||
mnuTo24Bits: TMenuItem;
|
||||
mnuTo32Bits: TMenuItem;
|
||||
mnuDither: TMenuItem;
|
||||
mnuQuantize: TMenuItem;
|
||||
mnuGrayScale: TMenuItem;
|
||||
mnuRotate: TMenuItem;
|
||||
mnuClockwise: TMenuItem;
|
||||
mnuAntiClockwise: TMenuItem;
|
||||
mnuInvert: TMenuItem;
|
||||
mnuClear: TMenuItem;
|
||||
mnuTo4Bits: TMenuItem;
|
||||
tbTools: TToolBar;
|
||||
btnCopy: TToolButton;
|
||||
ImageList1: TImageList;
|
||||
ToolButton1: TToolButton;
|
||||
btnPaste: TToolButton;
|
||||
btnClear: TToolButton;
|
||||
btnOpen: TToolButton;
|
||||
ToolButton3: TToolButton;
|
||||
ToolButton4: TToolButton;
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure FormPaint(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure mnuExitClick(Sender: TObject);
|
||||
procedure mnuFileOpenClick(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
procedure mnuFlipHorzClick(Sender: TObject);
|
||||
procedure btnCopyClick(Sender: TObject);
|
||||
procedure btnClearClick(Sender: TObject);
|
||||
procedure btnPasteClick(Sender: TObject);
|
||||
private
|
||||
FBitmap: TFreeWinBitmap;
|
||||
procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
fwbMainForm: TfwbMainForm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
uses
|
||||
FreeUtils, FreeImage, Math;
|
||||
|
||||
procedure TfwbMainForm.FormDestroy(Sender: TObject);
|
||||
begin
|
||||
if Assigned(FBitmap) then
|
||||
FBitmap.Free;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.FormPaint(Sender: TObject);
|
||||
var
|
||||
dx, dy, w, h: Integer;
|
||||
r1, r2: Double;
|
||||
R: TRect;
|
||||
begin
|
||||
if FBitmap.IsValid then // draw the bitmap
|
||||
begin
|
||||
// determine paint rect
|
||||
r1 := FBitmap.GetWidth / FBitmap.GetHeight;
|
||||
r2 := ClientWidth / ClientHeight;
|
||||
if r1 > r2 then // fit by width
|
||||
begin
|
||||
w := ClientWidth;
|
||||
h := Floor(w / r1);
|
||||
dx := 0;
|
||||
dy := (ClientHeight - h) div 2;
|
||||
end
|
||||
else // fit by height
|
||||
begin
|
||||
h := ClientHeight;
|
||||
w := Floor(h * r1);
|
||||
dy := 0;
|
||||
dx := (ClientWidth - w) div 2;
|
||||
end;
|
||||
with ClientRect do
|
||||
R := Bounds(Left + dx, Top + dy, w, h);
|
||||
FBitmap.Draw(Canvas.Handle, R);
|
||||
|
||||
// erase area around the image
|
||||
Canvas.Brush.Color := Color;
|
||||
if dx > 0 then
|
||||
begin
|
||||
with ClientRect do
|
||||
R := Bounds(Left, Top, dx, ClientHeight);
|
||||
Canvas.FillRect(R);
|
||||
with ClientRect do
|
||||
R := Bounds(Right - dx, Top, dx, ClientHeight);
|
||||
Canvas.FillRect(R);
|
||||
end else
|
||||
if dy > 0 then
|
||||
begin
|
||||
with ClientRect do
|
||||
R := Bounds(Left, Top, ClientWidth, dy);
|
||||
Canvas.FillRect(R);
|
||||
with ClientRect do
|
||||
R := Bounds(Left, Bottom - dy, ClientWidth, dy);
|
||||
Canvas.FillRect(R);
|
||||
end
|
||||
end
|
||||
else // clear
|
||||
begin
|
||||
Canvas.Brush.Color := Color;
|
||||
Canvas.FillRect(ClientRect);
|
||||
end
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
FBitmap := TFreeWinBitmap.Create;
|
||||
|
||||
mnuImage.Enabled := FBitmap.IsValid;
|
||||
OD.Filter := FIU_GetAllFilters;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.mnuExitClick(Sender: TObject);
|
||||
begin
|
||||
Close;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.mnuFileOpenClick(Sender: TObject);
|
||||
var
|
||||
t: Cardinal;
|
||||
begin
|
||||
if OD.Execute then
|
||||
begin
|
||||
t := GetTickCount;
|
||||
FBitmap.Load(OD.FileName);
|
||||
t := GetTickCount - t;
|
||||
mnuImage.Enabled := FBitmap.IsValid;
|
||||
StatusBar.Panels[0].Text := 'Loaded in ' + IntToStr(t) + ' msec.';
|
||||
StatusBar.Panels[1].Text := Format('%dx%d', [FBitmap.GetWidth, FBitmap.GetHeight]);
|
||||
Invalidate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.FormResize(Sender: TObject);
|
||||
begin
|
||||
Invalidate
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.WMEraseBkgnd(var Message: TMessage);
|
||||
begin
|
||||
Message.Result := 1;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.mnuFlipHorzClick(Sender: TObject);
|
||||
begin
|
||||
with FBitmap do
|
||||
if Sender = mnuFlipHorz then
|
||||
FLipHorizontal else
|
||||
if Sender = mnuFlipVert then
|
||||
FlipVertical else
|
||||
if Sender = mnuTo4Bits then
|
||||
ConvertTo4Bits else
|
||||
if Sender = mnuTo8Bits then
|
||||
ConvertTo8Bits else
|
||||
if Sender = mnuTo16Bits555 then
|
||||
ConvertTo16Bits555 else
|
||||
if Sender = mnuTo16Bits565 then
|
||||
ConvertTo16Bits565 else
|
||||
if Sender = mnuTo24Bits then
|
||||
ConvertTo24Bits else
|
||||
if Sender = mnuTo32Bits then
|
||||
ConvertTo32Bits else
|
||||
if Sender = mnuDither then
|
||||
Dither(FID_FS) else
|
||||
if Sender = mnuQuantize then
|
||||
ColorQuantize(FIQ_WUQUANT) else
|
||||
if Sender = mnuGrayScale then
|
||||
ConvertToGrayscale else
|
||||
if Sender = mnuClockwise then
|
||||
Rotate(-90) else
|
||||
if Sender = mnuAntiClockwise then
|
||||
Rotate(90) else
|
||||
if Sender = mnuInvert then
|
||||
Invert else
|
||||
if Sender = mnuClear then
|
||||
Clear;
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.btnCopyClick(Sender: TObject);
|
||||
begin
|
||||
if FBitmap.IsValid then FBitmap.CopyToClipBoard(Handle);
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.btnClearClick(Sender: TObject);
|
||||
begin
|
||||
FBitmap.Clear;
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TfwbMainForm.btnPasteClick(Sender: TObject);
|
||||
begin
|
||||
FBitmap.PasteFromClipBoard;
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user