我期待在CodeGear Delphi 2010中绘制一个不透明椭圆.

我试图绘制另一个位图,
我设置了位图透明色(用于背景)
调用椭圆方法.

在我的图像中,我使用不透明度参数(来自重载)绘制位图.但它不起作用.

我想要这样的东西http://www.java2s.com/Tutorial/VBImages/WPF-UseOpacityMaskAndRadialGradientBrush.PNG

有人知道一种工作方法吗?

解决方法

这个对我有用:
procedure TForm1.Button1Click(Sender: TObject);
var
  bm1,bm2: TBitmap;
begin
  bm1 := TBitmap.Create;
  bm1.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\portrait.bmp');

  bm2 := TBitmap.Create;
  bm2.SetSize(bm1.Width,bm1.Height);
  bm2.Canvas.Brush.Color := clRed;
  bm2.Canvas.Pen.Style := psClear;
  bm2.Canvas.Ellipse(0,bm2.Width,bm2.Height);

  Canvas.Draw(100,100,bm1);
  Canvas.Draw(100,bm2,127);
end;

Sample 1 http://privat.rejbrand.se/blendimg1.png

如果您想要更多控制,您可以随时手动进行处理:

procedure TForm1.Button1Click(Sender: TObject);
type
  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGBQuad)-1] of TRGBQuad;
  PRGB32Array = ^TRGB32Array;
  TScanline = TRGB32Array;
  PScanline = ^TScanline;
var
  bm1,bm3: TBitmap;
  sc1,sc2,sc3: PScanline;
  i: Integer;
  j: Integer;
var
  transp: real;
const
  opacity = 0.29;
begin
  transp := 1 - opacity;

  bm1 := TBitmap.Create;
  bm1.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\portrait.bmp');

  bm2 := TBitmap.Create;
  bm2.SetSize(bm1.Width,bm2.Height);

  bm3 := TBitmap.Create;
  bm3.SetSize(bm1.Width,bm1.Height);

  bm1.PixelFormat := pf32bit;
  bm2.PixelFormat := pf32bit;
  bm3.PixelFormat := pf32bit;

  for i := 0 to bm1.Height - 1 do
  begin
    sc1 := bm1.ScanLine[i];
    sc2 := bm2.ScanLine[i];
    sc3 := bm3.ScanLine[i];
    for j := 0 to bm1.Width - 1 do
      with sc3^[j] do
      begin
        rgbBlue := round(transP*sc1^[j].rgbBlue + opacity*sc2^[j].rgbBlue);
        rgbGreen := round(transP*sc1^[j].rgbGreen + opacity*sc2^[j].rgbGreen);
        rgbRed := round(transP*sc1^[j].rgbRed + opacity*sc2^[j].rgbRed);
      end;
  end;

  Canvas.Draw(100,bm3);

end;

Sample 2 http://privat.rejbrand.se/blendimg2.png

例如,您可以让背景图像在椭圆外的100%不透明度:

...
  for i := 0 to bm1.Height - 1 do
  begin
    sc1 := bm1.ScanLine[i];
    sc2 := bm2.ScanLine[i];
    sc3 := bm3.ScanLine[i];
    for j := 0 to bm1.Width - 1 do
      if sc2^[j].rgbBlue + sc2^[j].rgbGreen + sc2^[j].rgbRed = 3*255 then
        sc3^[j] := sc1^[j]
      else
        with sc3^[j] do
        begin
          rgbBlue := round(transP*sc1^[j].rgbBlue + opacity*sc2^[j].rgbBlue);
          rgbGreen := round(transP*sc1^[j].rgbGreen + opacity*sc2^[j].rgbGreen);
          rgbRed := round(transP*sc1^[j].rgbRed + opacity*sc2^[j].rgbRed);
        end;
  end;
  ...

Sample 3 http://privat.rejbrand.se/blendimg3.png

更不用说all other cool stuff you can do with pixmap manipulation:

...
  for i := 0 to bm1.Height - 1 do
  begin
    sc1 := bm1.ScanLine[i];
    sc2 := bm2.ScanLine[i];
    sc3 := bm3.ScanLine[i];
    for j := 0 to bm1.Width - 1 do
      if sc2^[j].rgbBlue + sc2^[j].rgbGreen + sc2^[j].rgbRed = 3*255 then
        sc3^[j] := sc1^[j]
      else
        with sc3^[j] do
        begin
          rgbBlue := round(sin(transP*sc1^[j].rgbBlue + opacity*sc2^[j].rgbBlue));
          rgbGreen := round(transP*sc1^[j].rgbGreen + opacity*sc2^[j].rgbGreen);
          rgbRed := round(transP*sc1^[j].rgbRed + opacity*sc2^[j].rgbRed);
        end;
  end;
  ...

Sample 4 http://privat.rejbrand.se/blendimg4.png

如果你真的不想手动操作,我只是想通了,你可以在第一个位图的副本上绘制椭圆,然后混合这两个位图:

procedure TForm1.Button1Click(Sender: TObject);
var
  bm1,bm2: TBitmap;
begin

  bm1 := TBitmap.Create;
  bm1.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\portrait.bmp');

  bm2 := TBitmap.Create;
  bm2.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\portrait.bmp');
  bm2.Canvas.Brush.Color := clRed;
  bm2.Canvas.Pen.Style := psClear;
  bm2.Canvas.Ellipse(0,127);
end;

Sample 5 http://privat.rejbrand.se/blendimg5.png

在Delphi 2010中绘制不透明度椭圆的更多相关文章

  1. ios – CAShapeLayer动画路径毛刺/闪烁(从椭圆到矩形和背面)

    当我创建一个显式动画来将CAShapeLayer的路径值从椭圆更改为矩形时,我遇到了一个问题.在我的画布控制器中,我设置了一个基本的CAShapeLayer并将其添加到根视图的图层:然后,当我为路径设置动画时,在动画的最后几帧中,当形状变为矩形时会出现奇怪的毛刺/闪烁,而在前几帧中,当动画远离矩形时,会出现奇怪的毛刺/闪烁.动画设置如下:我尝试了很多不同的东西,比如锁定/解锁CATransaction,玩各种填充模式等等……

  2. ios – 我在哪里可以找到用于创建IPad应用程序的Delphi资源?

    我之前一直在使用Delphi并且一直都是Windows家伙.我的妻子为我的生日买了一台新的iPad,我昨晚第一次使用它.哇!…

  3. 如何从命令行部署OSX或IOS Delphi项目?

    我正在使用像这样的脚本构建我的Delphi应用程序现在我想添加一个选项将应用程序部署到OSX系统修改这样的脚本,那么可以从命令行部署OSX或IOSDelphi项目吗?

  4. android – 使用marquee ellipsize在TextView上设置textIsSelectable会添加椭圆

    我的应用程序中的屏幕可能会将非常长的字符串发布到TextView中.对于这种情况,我有android:ellipsize=“marquee”设置,因此文本将在TextView上进行选取.但是,我已经决定我也希望这个文本可以选择.在大多数情况下,这没有问题.文本小于TextView,用户可以选择它.但是,如果我有textIsSelectable属性,并且文本大于TextView,则文本将拾取椭圆而不是完整字符串.它仍然是大帐篷,但它不再显示全文.它切断它并显示一个椭圆.有没有办法让文本可选并仍然保持整个字符

  5. 如何检查Android和iOS上的网络是否可用(Delphi XE5)

    解决方法试试这个:

  6. android – 在画布上的文本周围绘制一个椭圆形状

    我想在Canvas上的文本周围画一个椭圆形,我正在使用drawwText()方法在Canvas上显示3个文本.现在,当我单击特定文本时,我需要在该文本周围绘制一个椭圆,当我们单击另一个文本时,椭圆形状应该出现在单击的文本上.为此,给我一些代码建议.谢谢你提前解决方法使用drawoval方法()..这里是方法的签名..RectF是绘制矩形的类…其构造函数定义如下…你可以使它的对象如下现在在drawoval方法中传递此对象…

  7. javascript椭圆旋转相册实现代码

    支持自动和手动两种模式:自动模式下自动旋转展示,手动模式下通过鼠标选择当前图片,或通过提供的接口选择上一张/下一张图片

  8. 使用嵌套线程错误终止应用程序

    如果我使用一个启动了嵌套线程的线程,那么终止应用程序时会遇到问题。如果最深的嵌套线程卡住,则应用程序终止时会发生错误。在其他情况下,问题不会出现。据我所知,tSync.Free不会等待TCP.Connect完成并自行关闭。TCP.Connection在超时结束后无处返回。

  9. 通过gsdll32.dll与Delphi 11组合PDF

    我已经使用这个代码10多年了,它突然停止工作。该程序读取一个pdf文件列表,并输出一个包含列表中所有文件的pdf文件。它使用gsapi.pas包装单元。多年来,我只需要从Ghostscript.t下载一个更新版本的gsdll32.dll文件,就可以兼容更新版本的pdf文件格式。我发现他们有了一个新的翻译,也许这与此有关?请注意,在Ghostscript中使用等效的命令行本身效果良好。在我看来,他们改变了调用API的方式。如果有任何帮助,我将不胜感激。我确实尝试了添加开关“-dNEWPDF=false”,但

  10. 如何处理Windows 7的125%或150%放大率(Delphi)

    Windows7已添加其控制面板,外观和个性化,显示设置,放大文本和其他项目125%或150%的功能.完成后,我的Delphi2009程序的表单和对话框的一些内容被切断.我需要做些哪些更改才能确保在Windows7的任何放大设置下,我的所有表单和对话框都能正常显示.这听起来像是指文本大小设置,它在Windows中以各种形式存在多年,Delphi形成了与此设置的交互以及它们的自动缩放.我没有在这里检

随机推荐

  1. delphi – 主窗口按进程名称处理

    DelphiXe,Win7x64如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口).例:解决方法我同意Petesh的说法,你需要枚举顶级窗口并检查创建它的进程的模块文件名.为了帮助您开始枚举顶级窗口,这是一个delphi实现.首先,当你回调给你时,你需要一些与EnumWindows方法通信的方式.为此声明一条记录,该记录将保存您要查找的模块的文件

  2. 如何在Delphi中纯粹通过RTTI信息(即不使用任何实际对象实例)获取TObjectList的子项类型?

    我正在使用RTTI实现用于流式传输任意Delphi对象的通用代码,并且为了使其工作(更具体地说,为了使加载部分工作),我需要以某种方式获得TObjectList的子项类型<T>不使用任何实际对象实例的字段.要求不使用任何实际对象实例的明显原因是,在从流加载对象的情况下(仅基于要加载的对象的类类型的知识),我将不会有任何实例在加载完成之前完全可用–我宁愿只能访问相关类的纯RTTI数据.我希望能

  3. inno-setup – Inno Setup – 安装程序背景图片

    图像作为安装程序背景如何用inno5.5.9做到这一点?

  4. inno-setup – Inno Setup – 如何添加多个arc文件进行解压缩?

    使用InnoSetup解压缩弧文件.我希望有可能解压缩多个arc文件以从组件选择中安装文件(例如).但仍然显示所有提取的整体进度条.这可能吗?的回答的修改预备是相同的,参考其他答案.在ExtractArc中,为要提取的每个存档调用AddArchive.

  5. delphi – 如何在DataSet的帮助下在TAdvStringGrid中显示数据库中的BLOB图像

    解决方法CreateBlobStream正在创建一个TStream对象,而不是TMemoryStream.由于您不想将JPG写入数据库,因此应使用bmRead而不是bmReadWrite.我不习惯sqlite,但你必须确保使用合适的二进制日期类型.为了确保存储的图像真的是JPG,您应该编写JPG以进行测试,例如:

  6. inno-setup – 在Inno Setup的Code部分下载程序后运行程序

    如何运行我通过Internet下载的应用程序,在代码部分中使用,并等待该应用程序完成运行.我有,使用InnoTools下载程序,下载这两个文件,我想,在第二个完成下载后运行该下载,或jdk-8u111-windows-x64.exe,然后继续安装.解决方法使用其他下载插件,而不是ITD(请参阅下面的原因).例如,InnoDownloadPlugin.当您包含idp.iss时,它定义了一个全局IDP

  7. progress-bar – Inno Setup Run部分的简单进度页面

    我的安装程序非常简单,它基本上是:>欢迎页面>进展页面>最终页面欢迎页面和最终页面是标准页面.在Progress页面,我正在静默安装一堆其他程序.实际的脚本是在[Run]部分中安装每个程序.问题是酒吧达到100%然后停留在那里.我只能更改消息文本.我想要实现的是使用Pascal脚本显示进度,例如:这样我就可以显示更准确的进度条.这就是我所拥有的:问题是,当我构建安装程序时,它不显示欢迎页面.我做错了什么?

  8. delphi – 如何使“显示/隐藏桌面图标”设置生效?

    下面的代码调用SHGetSetSettings函数来隐藏桌面图标但它只是从视图菜单中取消选中“显示桌面图标”.我打电话给SHChangeNotify;更新桌面,但这不起作用?解决方法isa,要刷新桌面,您可以将F5键发送到progman窗口隐藏桌面图标的另一种方法是再次显示

  9. inno-setup – Inno Setup – 避免显示子安装程序的文件名

    我试图使用InnoSetup–Howtohidecertainfilenameswhileinstalling?(FilenameLabel)的想法Theonlysuresolutionistoavoidinstallingthefiles,youdonotwanttoshow,usingthe[Files]section.Installthemusingacodeinstead.UsetheEx

  10. inno-setup – Inno Setup磁力链接下载实施

    我目前正在使用InnoDownloadPlugin为我的安装程序下载文件,这个问题最大的问题是faila正确下载文件.因为连接不良等诸多原因.我想添加一种替代方法来下载文件,因此用户可以选择是否需要常规方式或torrent方式.我知道我可以使用aria2c.exe应用程序(https://aria2.github.io/),有人可以帮我实现它的inno设置代码吗?我需要的是使用torrent(ar

返回
顶部