图像透明度

发布于 2024-12-03 20:58:03 字数 129 浏览 3 评论 0原文

通常我允许用户在主窗体中放置图像。

因为有些图像会产生很多噪音,所以我想对它们进行一些平滑处理。

我通常会对默认提供的图像进行一些透明度处理。

当用户选择新图像或加载新图像时,如何自动执行此操作?

Usually I allow my users to place an image in the main form.

Because some images cause to much noise, I would like to smooth those a bit.

I usually do some transparency in the images that I give as defaults.

How can I do this automatically as the user selects a new image, or as I load it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑕疵 2024-12-10 20:58:03

将轨迹栏添加到设置透明度级别的 TOpenPictureDialog 派生类:

unit OpenFadedPictureDialog;

interface

uses
  Classes, Controls, ExtDlgs, ComCtrls, StdCtrls, Windows, Graphics, ExtCtrls;

type
  TOpenFadedPictureDialog = class(TOpenPictureDialog)
  private
    FFader: TTrackBar;
    FFaderLabel: TLabel;
    FBlendFunc: BLENDFUNCTION;
    FTimer: TTimer;
    procedure Delayed(Sender: TObject);
    procedure FaderChanged(Sender: TObject);
    procedure UpdateImage;
  protected
    procedure DoShow; override;
    procedure DoSelectionChange; override;
  public
    constructor Create(AOwner: TComponent); override;
    function Picture: TPicture;
    function TransparancyLevel: Byte;
  end;

implementation

{ TOpenFadedPictureDialog }

resourcestring
  SFaderHint = 'Track bar to set image transparancy.';
  SFaderLabelCaption = 'Image transparancy:';

constructor TOpenFadedPictureDialog.Create(AOwner: TComponent);
begin
  inherited Create(Owner);
  FFaderLabel := TLabel.Create(Self);
  FFaderLabel.Name := 'FaderLabel';
  FFaderLabel.Align := alTop;
  FFaderLabel.Caption := SFaderLabelCaption;
  FFader := TTrackBar.Create(Self);
  FFader.Name := 'FaderTrackBar';
  FFader.Align := alTop;
  FFader.Height := 25;
  FFader.TickStyle := tsNone;
  FFader.PageSize := 25;
  FFader.Max := 255;
  FFader.Position := 127;
  FFader.Hint := SFaderHint;
  FFader.OnChange := FaderChanged;
  FBlendFunc.BlendOp := AC_SRC_OVER;
  FBlendFunc.SourceConstantAlpha := 127;
  FTimer := TTimer.Create(Self);
  FTimer.Enabled := False;
  FTimer.Interval := 100;
  FTimer.OnTimer := Delayed;
end;

procedure TOpenFadedPictureDialog.Delayed(Sender: TObject);
begin
  FTimer.Enabled := False;
  FBlendFunc.SourceConstantAlpha := FFader.Position;
  if (ImageCtrl.Picture <> nil) and (ImageCtrl.Picture.Graphic <> nil) then
    ImageCtrl.Picture.LoadFromFile(FileName);
  UpdateImage;
end;

procedure TOpenFadedPictureDialog.DoSelectionChange;
begin
  inherited DoSelectionChange;
  UpdateImage;
end;

procedure TOpenFadedPictureDialog.DoShow;
begin
  with ImageCtrl do
  begin
    Picture := nil;
    Align := alTop;
    Anchors := [akLeft, akTop, akRight, akBottom];
    Height := Height - FFaderLabel.Height + FFader.Height - 15;
    FFaderLabel.Parent := Parent;
    FFader.Parent := Parent;
  end;
  inherited DoShow;
end;

procedure TOpenFadedPictureDialog.FaderChanged(Sender: TObject);
begin
  FTimer.Enabled := False;
  FTimer.Enabled := True;
end;

function TOpenFadedPictureDialog.Picture: TPicture;
begin
  Result := ImageCtrl.Picture;
end;

function TOpenFadedPictureDialog.TransparancyLevel: Byte;
begin
  Result := FBlendFunc.SourceConstantAlpha;
end;

procedure TOpenFadedPictureDialog.UpdateImage;
var
  Src: TBitmap;
  Dst: TBitmap;
begin
  if (ImageCtrl.Picture <> nil) and (ImageCtrl.Picture.Graphic <> nil) then
  begin
    Src := TBitmap.Create;
    Dst := TBitmap.Create;
    try
      Src.Width := ImageCtrl.Picture.Width;
      Src.Height := ImageCtrl.Picture.Height;
      Dst.Width := Src.Width;
      Dst.Height := Src.Height;
      Src.Canvas.Draw(0, 0, ImageCtrl.Picture.Graphic);
      AlphaBlend(Dst.Canvas.Handle, 0, 0, Dst.Width, Dst.Height,
        Src.Canvas.Handle, 0, 0, Src.Width, Src.Height, FBlendFunc);
      ImageCtrl.Picture.Graphic := Dst;
    finally
      Dst.Free;
      Src.Free;
    end;
  end;
end;

end.

创建此对话框以在使用 TransparancyLevel 函数执行后获取用户所需的透明度级别,或将所选图片分配给主表单上的图像:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TOpenFadedPictureDialog.Create(nil) do
    try
      if Execute then
        Image1.Picture := Picture;
    finally
      Free;
    end;
end;

自定义通用对话框的示例图像:

自定义通用对话框

Add a trackbar to a TOpenPictureDialog derivative setting the transparancy level:

unit OpenFadedPictureDialog;

interface

uses
  Classes, Controls, ExtDlgs, ComCtrls, StdCtrls, Windows, Graphics, ExtCtrls;

type
  TOpenFadedPictureDialog = class(TOpenPictureDialog)
  private
    FFader: TTrackBar;
    FFaderLabel: TLabel;
    FBlendFunc: BLENDFUNCTION;
    FTimer: TTimer;
    procedure Delayed(Sender: TObject);
    procedure FaderChanged(Sender: TObject);
    procedure UpdateImage;
  protected
    procedure DoShow; override;
    procedure DoSelectionChange; override;
  public
    constructor Create(AOwner: TComponent); override;
    function Picture: TPicture;
    function TransparancyLevel: Byte;
  end;

implementation

{ TOpenFadedPictureDialog }

resourcestring
  SFaderHint = 'Track bar to set image transparancy.';
  SFaderLabelCaption = 'Image transparancy:';

constructor TOpenFadedPictureDialog.Create(AOwner: TComponent);
begin
  inherited Create(Owner);
  FFaderLabel := TLabel.Create(Self);
  FFaderLabel.Name := 'FaderLabel';
  FFaderLabel.Align := alTop;
  FFaderLabel.Caption := SFaderLabelCaption;
  FFader := TTrackBar.Create(Self);
  FFader.Name := 'FaderTrackBar';
  FFader.Align := alTop;
  FFader.Height := 25;
  FFader.TickStyle := tsNone;
  FFader.PageSize := 25;
  FFader.Max := 255;
  FFader.Position := 127;
  FFader.Hint := SFaderHint;
  FFader.OnChange := FaderChanged;
  FBlendFunc.BlendOp := AC_SRC_OVER;
  FBlendFunc.SourceConstantAlpha := 127;
  FTimer := TTimer.Create(Self);
  FTimer.Enabled := False;
  FTimer.Interval := 100;
  FTimer.OnTimer := Delayed;
end;

procedure TOpenFadedPictureDialog.Delayed(Sender: TObject);
begin
  FTimer.Enabled := False;
  FBlendFunc.SourceConstantAlpha := FFader.Position;
  if (ImageCtrl.Picture <> nil) and (ImageCtrl.Picture.Graphic <> nil) then
    ImageCtrl.Picture.LoadFromFile(FileName);
  UpdateImage;
end;

procedure TOpenFadedPictureDialog.DoSelectionChange;
begin
  inherited DoSelectionChange;
  UpdateImage;
end;

procedure TOpenFadedPictureDialog.DoShow;
begin
  with ImageCtrl do
  begin
    Picture := nil;
    Align := alTop;
    Anchors := [akLeft, akTop, akRight, akBottom];
    Height := Height - FFaderLabel.Height + FFader.Height - 15;
    FFaderLabel.Parent := Parent;
    FFader.Parent := Parent;
  end;
  inherited DoShow;
end;

procedure TOpenFadedPictureDialog.FaderChanged(Sender: TObject);
begin
  FTimer.Enabled := False;
  FTimer.Enabled := True;
end;

function TOpenFadedPictureDialog.Picture: TPicture;
begin
  Result := ImageCtrl.Picture;
end;

function TOpenFadedPictureDialog.TransparancyLevel: Byte;
begin
  Result := FBlendFunc.SourceConstantAlpha;
end;

procedure TOpenFadedPictureDialog.UpdateImage;
var
  Src: TBitmap;
  Dst: TBitmap;
begin
  if (ImageCtrl.Picture <> nil) and (ImageCtrl.Picture.Graphic <> nil) then
  begin
    Src := TBitmap.Create;
    Dst := TBitmap.Create;
    try
      Src.Width := ImageCtrl.Picture.Width;
      Src.Height := ImageCtrl.Picture.Height;
      Dst.Width := Src.Width;
      Dst.Height := Src.Height;
      Src.Canvas.Draw(0, 0, ImageCtrl.Picture.Graphic);
      AlphaBlend(Dst.Canvas.Handle, 0, 0, Dst.Width, Dst.Height,
        Src.Canvas.Handle, 0, 0, Src.Width, Src.Height, FBlendFunc);
      ImageCtrl.Picture.Graphic := Dst;
    finally
      Dst.Free;
      Src.Free;
    end;
  end;
end;

end.

Create this dialog to obtain the user's desired transparancy level after execution with the TransparancyLevel function, or assign the chosen picture to the image on your main form:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TOpenFadedPictureDialog.Create(nil) do
    try
      if Execute then
        Image1.Picture := Picture;
    finally
      Free;
    end;
end;

Example image of customized common dialog:

Customized common dialog

幸福还没到 2024-12-10 20:58:03

自从我在 Delphi 中这样做以来已经很长时间了(自从我使用 Delphi 以来已经很长时间了!)但是如果我没记错的话,delphi 中的所有 TBitmap 和 TImage 类型都使用图像中最左上角的像素来知道什么透明度的关键是。

基本上,您找到背景颜色(如果不是相同的像素,通常是相邻的),确保左上角的像素是该颜色,然后将图像透明度键设置为该像素的 RGB 值。

就像我说的,已经有一段时间了,你可能需要挖掘一下这些细节,但我相当确定这是类似的东西。

Been a long time since I did this in Delphi (It's been a long time since I used Delphi!!) however if memory serves me right, all TBitmap and TImage types in delphi use the top left most pixel in the image to know what the transparency key is.

Basically, you find the background colour (Usually adjacent if not already the same pixel) make sure the top left pixel is that colour, then set the images transparency key to the RGB value of that pixel.

Like I say it's been a while, you may have to dig a bit with those details, but I'm fairly sure it's something similar.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文