📄 fcimager.tst
字号:
end;
end;
procedure TfcWave.SetWrap(Value: Boolean);
begin
if FWrap <> Value then
begin
FWrap := Value;
FBitmapOptions.Changed;
end;
end;
constructor TfcBitmapOptions.Create(AComponent: TComponent);
begin
inherited Create;
FComponent := AComponent;
FAlphaBlend := TfcAlphaBlend.Create(self);
FRotation := TfcRotate.Create(self);
FColor := clNone;
FTintColor := clNone;
FSaturation := -1;
FWave := TfcWave.Create(self);
end;
destructor TfcBitmapOptions.Destroy;
begin
FAlphaBlend.Free;
FRotation.Free;
FWave.Free;
inherited;
end;
procedure TfcBitmapOptions.Changed;
var TmpBitmap: TfcBitmap;
begin
if (csLoading in FComponent.ComponentState) or DestBitmap.Empty or ((OrigPicture.Graphic = nil) or OrigPicture.Graphic.Empty) or (FUpdateLock > 0) then Exit;
if (DestBitmap.Width = OrigPicture.Width) and (DestBitmap.Height = OrigPicture.Height) then
DestBitmap.Assign(OrigPicture.Graphic)
else begin
if Tile then fcTileDraw(OrigPicture.Graphic, DestBitmap.Canvas, Rect(0, 0, DestBitmap.Width, DestBitmap.Height))
else begin
TmpBitmap := TfcBitmap.Create;
TmpBitmap.Assign(OrigPicture.Graphic);
TmpBitmap.SmoothStretching := TfcCustomImager(FComponent).SmoothStretching;
try
DestBitmap.Canvas.StretchDraw(Rect(0, 0, DestBitmap.Width, DestBitmap.Height), TmpBitmap);
finally
TmpBitmap.Free;
end;
end;
end;
if FGrayScale then DestBitmap.GrayScale;
if FLightness <> 0 then DestBitmap.Brightness(FLightness);
if (FAlphaBlend.Amount <> 0) and not FAlphaBlend.Bitmap.Empty then
DestBitmap.AlphaBlend(FAlphaBlend.Bitmap, FAlphaBlend.Amount, True);
if FColor <> clNone then with fcGetColor(ColorToRGB(FColor)) do
DestBitmap.Colorize(r, g, b);
if FTintColor <> clNone then with fcGetColor(ColorToRGB(FTintColor)) do
DestBitmap.ColorTint(r div 2, g div 2, b div 2);
if FSponge <> 0 then DestBitmap.Sponge(FSponge);
if FSaturation <> -1 then DestBitmap.Saturation(FSaturation);
if FGaussianBlur <> 0 then DestBitmap.GaussianBlur(FGaussianBlur);
if FEmbossed then DestBitmap.Emboss;
if FInverted then DestBitmap.Invert;
if FContrast <> 0 then DestBitmap.Contrast(FContrast);
if FSharpen <> 0 then DestBitmap.Sharpen(FSharpen);
if FHorizontallyFlipped then DestBitmap.Flip(True);
if FVerticallyFlipped then DestBitmap.Flip(False);
with FWave do if (Ratio <> 0) and (XDiv <> 0) and (YDiv <> 0) then
DestBitmap.Wave(XDiv, YDiv, Ratio, Wrap);
if FRotation.Angle <> 0 then with Rotation do
DestBitmap.Rotate(Point(CenterX, CenterY), Angle);
if Assigned(FOnChange) then FOnChange(self);
end;
procedure TfcBitmapOptions.BeginUpdate;
begin
inc(FUpdateLock);
end;
procedure TfcBitmapOptions.EndUpdate;
begin
if FUpdateLock > 0 then dec(FUpdateLock);
Changed;
end;
procedure TfcBitmapOptions.SetColor(Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
Changed;
end;
end;
procedure TfcBitmapOptions.SetTintColor(Value: TColor);
begin
if FTintColor <> Value then
begin
FTintColor := Value;
Changed;
end;
end;
procedure TfcBitmapOptions.SetIntegralProperty(Index: Integer; Value: Integer);
procedure DoCheck(StorageVar: PInteger);
begin
if StorageVar^ <> Value then
begin
StorageVar^ := Value;
Changed;
end;
end;
begin
case Index of
0: DoCheck(@FLightness);
1: DoCheck(@FSaturation);
2: DoCheck(@FSponge);
3: DoCheck(@FGaussianBlur);
4: DoCheck(@FContrast);
5: DoCheck(@FSharpen);
end;
end;
type PBoolean = ^Boolean;
procedure TfcBitmapOptions.SetBooleanProperty(Index: Integer; Value: Boolean);
procedure DoCheck(StorageVar: PBoolean);
begin
if StorageVar^ <> Value then
begin
StorageVar^ := Value;
Changed;
end;
end;
begin
case Index of
0: DoCheck(@FEmbossed);
1: DoCheck(@FInverted);
2: DoCheck(@FGrayScale);
3: DoCheck(@FHorizontallyFlipped);
4: DoCheck(@FVerticallyFlipped);
end;
end;
constructor TfcCustomImager.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// FBitmap := TfcBitmap.Create;
// FBitmap.OnChange := BitmapChange;
FEraseBackground:= True;
FPicture := TPicture.Create;
FPicture.OnChange := BitmapChange;
FWorkBitmap := TfcBitmap.Create;
FRespectPalette:= True;
FWorkBitmap.RespectPalette := True;
FWorkBitmap.UseHalftonePalette:= True;
FBitmapOptions := TfcBitmapOptions.Create(self);
FBitmapOptions.OnChange := BitmapOptionsChange;
FBitmapOptions.DestBitmap := FWorkBitmap;
FBitmapOptions.OrigPicture := FPicture;
ControlStyle := ControlStyle + [csOpaque];
FPreProcess := True;
FChangeLinks := TList.Create;
Width := 100;
Height := 100;
end;
destructor TfcCustomImager.Destroy;
begin
FPicture.Free;
FPicture:= nil;
FBitmapOptions.Free;
FWorkBitmap.Free;
FChangeLinks.Free;
inherited Destroy;
end;
function TfcCustomImager.GetDrawRect: TRect;
begin
case DrawStyle of
dsNormal: result := Rect(0, 0, Picture.Width, Picture.Height);
dsCenter: with Point(Width div 2 - FWorkBitmap.Width div 2,
Height div 2 - FWorkBitmap.Height div 2) do
result := Rect(x, y, Width - x, Height - y);
dsTile, dsStretch: result := Rect(0, 0, Width, Height);
dsProportional: result := fcProportionalRect(Rect(0, 0, Width, Height), FWorkBitmap.Width, FWorkBitmap.Height);
end
end;
procedure TfcCustomImager.SetDrawStyle(Value: TfcImagerDrawStyle);
begin
if FDrawStyle <> Value then
begin
FDrawStyle := Value;
BitmapOptions.Tile := FDrawStyle = dsTile;
Resized;
Invalidate;
end;
end;
procedure TfcCustomImager.SetEraseBackground(Value: Boolean);
var r: TRect;
begin
if FEraseBackground <> Value then
begin
FEraseBackground := Value;
if Parent <> nil then begin
r:= BoundsRect;
InvalidateRect(Parent.Handle, @r, True);
// Parent.Invalidate;
end
end;
end;
procedure TfcCustomImager.SetParent(Value: TWinControl);
begin
inherited;
end;
procedure TfcCustomImager.BitmapOptionsChange(Sender: TObject);
var r: TRect;
begin
if Parent <> nil then
begin
r := BoundsRect;
InvalidateRect(Parent.Handle, @r, Transparent);
end;
NotifyChanges;
end;
procedure TfcCustomImager.NotifyChanges;
var i: Integer;
begin
for i := 0 to FChangeLinks.Count - 1 do with TfcChangeLink(FChangeLinks[i]) do
begin
Sender := WorkBitmap;
Change;
end;
end;
procedure TfcCustomImager.BitmapChange(Sender: TObject);
var r: TRect;
begin
Resized;
r := BoundsRect;
if Parent<>nil then { 8/2/99 }
InvalidateRect(Parent.Handle, @r, True);
NotifyChanges;
end;
procedure TfcCustomImager.Resized;
begin
// if (not InSetBounds) and EraseBackground and not Transparent and not PictureEmpty and not WorkBitmap.Empty and (Parent <> nil) then
// SendMessage(Parent.Handle, WM_ERASEBKGND, Canvas.Handle, 0);
if csLoading in ComponentState then Exit;
if not PreProcess and not (DrawStyle in [dsNormal, dsCenter]) then
FWorkBitmap.SetSize(Width, Height)
else begin
if BitmapOptions.Rotation.Angle <> 0 then { 10/5/99 }
FWorkBitmap.SetSize(fcMax(Picture.Width, Picture.Height), fcMax(Picture.Height, Picture.Width))
else
FWorkBitmap.SetSize(Picture.Width, Picture.Height)
end;
UpdateWorkBitmap;
UpdateAutoSize;
end;
procedure TfcCustomImager.UpdateAutoSize;
begin
if FAutoSize and not PictureEmpty and not (csLoading in ComponentState) and (Align = alNone) then
begin
UpdatingAutosize := True;
{ if DrawStyle = dsProportional then
begin
with fcProportionalRect(Rect(0, 0, Width, Height), Bitmap.Width, Bitmap.Height) do
if (Width <> Right - Left) or (Height <> Bottom - Top) then
SetBounds(self.Left, self.Top, self.Left + (Right - Left), self.Top + (Bottom - Top))
end else }if (Width <> Picture.Width) or (Height <> Picture.Height) then
SetBounds(Left, Top, Picture.Width, Picture.Height);
UpdatingAutosize := False;
end;
end;
procedure TfcCustomImager.UpdateWorkBitmap;
begin
if not PictureEmpty and not (csLoading in ComponentState) then
begin
if FWorkBitmap.Empty then Resized;
BitmapOptions.Changed;
end;
end;
procedure TfcCustomImager.SetPicture(Value: TPicture);
begin
FPicture.Assign(Value);
end;
procedure TfcCustomImager.SetPreProcess(Value: Boolean);
begin
if FPreProcess <> Value then
begin
FPreProcess := Value;
Resized;
end;
end;
procedure TfcCustomImager.SetTransparent(Value: Boolean);
begin
FTransparent:=Value;
if not PictureEmpty then Picture.Graphic.Transparent := Value;
Invalidate;
end;
procedure TfcCustomImager.SetTransparentColor(Value: TColor);
begin
WorkBitmap.TransparentColor := Value;
UpdateWorkBitmap;
Invalidate;
ColorToString(clNone);
end;
function TfcCustomImager.GetRespectPalette;
begin
// result := WorkBitmap.RespectPalette;
result:= FRespectPalette;
end;
function TfcCustomImager.GetSmoothStretching: Boolean;
begin
result := WorkBitmap.SmoothStretching;
end;
function TfcCustomImager.GetTransparent: Boolean;
begin
result:= FTransparent;
// result := False;
// if not PictureEmpty then result := Picture.Graphic.Transparent;
end;
function TfcCustomImager.GetTransparentColor: TColor;
begin
result := WorkBitmap.TransparentColor;
end;
procedure TfcCustomImager.SetAutoSize(Value: Boolean);
begin
if FAutoSize <> Value then
begin
FAutoSize := Value;
UpdateAutoSize;
end;
end;
{
procedure TfcCustomImager.SetBitmap(Value: TfcBitmap);
begin
FBitmap.Assign(Value);
end;
}
function TfcCustomImager.PictureEmpty: Boolean;
begin
result := (FPicture=Nil) or (FPicture.Graphic = nil) or (FPicture.Graphic.Empty);
end;
procedure TfcCustomImager.Invalidate;
var r: TRect;
begin
if InSetBounds then exit;
r := BoundsRect;
if Parent <> nil then InvalidateRect(Parent.Handle, @r, True);
end;
procedure TfcCustomImager.RegisterChanges(ChangeLink: TfcChangeLink);
begin
FChangeLinks.Add(ChangeLink);
end;
procedure TfcCustomImager.UnRegisterChanges(ChangeLink: TfcChangeLink);
begin
FChangeLinks.Remove(ChangeLink);
end;
procedure TfcCustomImager.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var SizeChanged: Boolean;
OldControlStyle: TControlStyle;
begin
SizeChanged := (AWidth <> Width) or (AHeight <> Height);
if SizeChanged and not UpdatingAutosize then begin
InSetBounds:= True; { RSW - Don't erase background when resizing }
{ 5/7/99 - Setting parent to opaque so it doesn't clear background.
This allows imager to not flicker when resizing imager }
if Parent<>nil then
begin
OldControlStyle:= Parent.ControlStyle;
Parent.ControlStyle:= Parent.ControlStyle + [csOpaque];
end;
inherited;
if Parent<>nil then Parent.ControlStyle:= OldControlStyle;
if Visible then Update;
Resized;
InSetBounds:= False;
end
else inherited;
end;
procedure TfcCustomImager.SetRespectPalette(Value: Boolean);
begin
FRespectPalette:= Value;
WorkBitmap.RespectPalette := Value;
if value then
if (BitmapOptions.Color<>clNone) or (BitmapOptions.TintColor<>clNone) then
WorkBitmap.RespectPalette:= False;
Invalidate;
end;
procedure TfcCustomImager.SetSmoothStretching(Value: Boolean);
begin
WorkBitmap.SmoothStretching := Value;
UpdateWorkBitmap;
Invalidate;
end;
procedure TfcCustomImager.Paint;
begin
inherited;
if csDestroying in ComponentState then exit;
if FWorkBitmap.Empty and not PictureEmpty then
begin
UpdateWorkBitmap;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -