【问题标题】:Make only one round corner antialiased to an image仅对图像进行一个圆角抗锯齿处理
【发布时间】:2015-06-28 20:54:53
【问题描述】:

每个人 我一直在尝试在 Delphi 中解决以下问题。 我想拍一张照片并只制作一个抗锯齿圆角。 我知道如何使用 RoundRect 使所有 4 个角都变圆。但是,我似乎不知道如何制作一个。 我一直在尝试解决这样的问题:

procedure RoundCorner(var image: TBitmap;  w,h : integer);
//w - width of an image
//h - height of an image
//radius can be set at 150 (rounded rect radius)
// image is the timage object received as var parameter
var
   i, j :integer;
   x, y :double;
begin    
   i:= w - Trunc(radius);
   x:= 0;
   y:= radius - sqrt(sqr(radius) - sqr(x));
   while(i < w) do
   begin
      j:=0;
      while(j <= y) do
      begin
         image.Canvas.Pixels[i-1,j]:=clWhite; //a colour of your choosing or just erase this line
         j := j + 1;
      end;
     y:= radius - sqrt(sqr(radius) - sqr(x));
     x := x + 1;
     i := i + 1;
   end;
end;

这可行,但是我面临两个问题:

  • 角没有抗锯齿
  • 我想用不同的颜色填充剪切区域

欢迎提出任何建议 谢谢。

【问题讨论】:

  • 你说你知道如何用RoundRect把四个角都弄圆。你为什么不简单地让roundRect 比你的图像大并移动它的位置,以便只有它的一个角放在你的图像上方?
  • 我不明白这个问题。您发布了一些描述模糊的不完整代码。您能否edit the question 并发布一个最小的、可编译的代码,我们可以复制并在我们的 IDE 中运行以查看问题,好吗?还可以选择显示您描述的问题的图像(它可能只是指向上传图像的链接;我们可以为您嵌入)。
  • @SilverWarrior:我认为这也切断了边界。可能不是他或她想要的。
  • @TLama:但我愿意。只有一个角应该是圆形的。其他人应该是直的。该代码是绘制四分之一圆的相当简单的尝试。问题是:如何通过锯齿获得像这样的部分圆角矩形。
  • @Rudy,好吧,答案是,忘记 GDI(如果你想保持简单的话)。

标签: image delphi bitmap


【解决方案1】:

首先,在您的情况下,“抗锯齿”确实意味着您的图像必须具有 32 位像素格式才能制作圆形透明角。第二件事是您无法通过 Canvas 访问 Alpha 通道,您需要直接通过 Scanline 属性访问位图像素,或者可能使用 Graphics32 或 AGG 之类的库。

实现圆角的另一种“现代”方法是使用 FMX 并将图像放在一个圆形矩形内并通过圆形矩形对其进行剪辑。

【讨论】:

  • 感谢您的提示。您能否详细介绍一下使用 FMX 的“现代”方法?
  • 嗨,我试图在评论中写代码,但不知道该怎么做。所以基本上你需要创建一个矩形 TRectangle 和 TImage 矩形作为父级。设置矩形和图像的大小等于您的位图,将矩形的 ClipChildren 属性设置为 True,将位图分配给图像位图。最后一件事是将整个事物绘制到一个新的位图上。您可以使用矩形的 PaintTo 方法。
  • 会试一试,让你知道
猜你喜欢
  • 2023-03-20
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多