是图像本身的放大缩小还是Image:TImage?如果是图像本身,那么就会有失真,可以用Image :TImage来承载着幅图像。以达到视觉的放大缩小,但是图像本身不会发生变化。
我写了一个类:
unit imageinfo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, StdCtrls, ExtCtrls, Buttons,RTLConsts,
CSBitBtn, CSComboBox, CSEdit,JPEG;
type
TImageShow = class
private
FStream: TMemoryStream;
FImage: TImage;
FMsgStr : string;
FZoomStep : integer;
FImageStrBox: TScrollBox;
FSize: Integer;
FWidth : integer;
FHeight : Integer;
NWidth : Integer;
NHeight : Integer;
procedure ImageInit;
procedure changeMsg;
public
constructor Create(Image: TImage; OwnerPanel: TScrollBox);
destructor Destroy; override;
public
property Size: Integer read FSize write FSize;
property MsgStr: string read FMsgStr write FMsgStr;
property Stream: TMemoryStream read FStream write FStream;
public
function GetImageSize: LongInt;
procedure ShowImage(Stream: TMemoryStream);
procedure ZoomOut;
procedure ZoomIn;
procedure TrueSize;
function GetImageMsgStr: string;
end;
implementation
{TImageShow}
constructor TImageShow.Create(Image: TImage; OwnerPanel: TScrollBox);
begin
FZoomStep := 0;
FImage := Image;
FStream := TMemoryStream.Create;
if Assigned(FImage) then
begin
ImageInit;
end;
FImageStrBox := OwnerPanel;
end;
destructor TImageShow.Destroy;
begin
if FStream <> nil then
begin
FStream.Free;
FStream := nil;
end;
inherited;
end;
procedure TImageShow.ShowImage(Stream: TMemoryStream);
var
ajpeg:TJpegImage;
begin
if Stream.Size<=0 then exit;
ajpeg:=TJpegImage.Create;
stream.Position := 0;
ajpeg.LoadFromStream(Stream);
FStream := Stream;
Fsize :=FStream.Size;
FWidth := ajpeg.Width;
FHeight := ajpeg.Height;
FImage.Width:= FWidth;
FImage.Height:= FHeight;
NWidth := FWidth;
NHeight := FHeight;
FMsgStr := Format('尺寸:%dx%d 像素, 大小:%d字节, 状态:[%s]',[FWidth,FHeight,FSize,'原始大小']);
FImage.Picture.Assign(ajpeg);
FreeAndNil(ajpeg);
end;
function TImageShow.GetImageMsgStr: string;
begin
result :=MsgStr;
end;
procedure TImageShow.ImageInit;
begin
FImage.Align := alNone;
FImage.Stretch := True;
FImage.AutoSize := False;
FImage.Center := False;
FImage.Proportional := true;
end;
procedure TImageShow.changeMsg;
begin
if FZoomStep>0 then
FMsgStr := Format('尺寸:%dx%d 像素, 大小:%d字节, 状态:[放大百分之%d]',[NWidth,NHeight,FSize,FZoomStep*10]);
if FZoomStep=0 then
FMsgStr := Format('尺寸:%dx%d 像素, 大小:%d字节, 状态:[%s]',[NWidth,NHeight,FSize,'原始大小']);
if FZoomStep<0 then
FMsgStr := Format('尺寸:%dx%d 像素, 大小:%d字节, 状态:[缩小百分之%d]',[NWidth,NHeight,FSize,-FZoomStep*10]);
end;
procedure TImageShow.ZoomOut;
begin
if Fimage.Picture<>nil then
begin
FZoomStep := FZoomStep + 1;
NWidth := trunc(FWidth * (1.0+FZoomStep*0.1));
NHeight := trunc(FHeight * (1.0+FZoomStep*0.1));
changeMsg;
FImage.Width := NWidth;
FImage.Height := NHeight;
end;
end;
procedure TImageShow.ZoomIn;
begin
if Fimage.Picture<>nil then
begin
FZoomStep := FZoomStep - 1;
if FZoomStep<-9 then FZoomStep:=-9;
NWidth := trunc(FWidth * (1.0+FZoomStep*0.1));
NHeight := trunc(FHeight * (1.0+FZoomStep*0.1));
changeMsg;
FImage.Width := NWidth;
FImage.Height := NHeight;
end;
end;
procedure TImageShow.TrueSize;
begin
if Fimage.Picture<>nil then
begin
FZoomStep := 0;
NWidth := FWidth;
NHeight := FHeight;
changeMsg;
FImage.Width := NWidth;
FImage.Height := NHeight;
FImage.Left:=1;
FImage.Top:=1;
end;
end;
function TImageShow.GetImageSize: LongInt;
begin
result := Fsize;
end;
end.