图像“淡入淡出”进/出(不透明)

时间:2014-07-08 18:08:26

标签: delphi bitmap bezier

我想"淡出"输入/输出图像。但不是不透明。

图片说的不仅仅是文字:

原始图片:

enter image description here

所需图片:

enter image description here

我怎么能以编程方式做到这一点?不像"使用Bitmap.Canvas"但数学方法。 ("对于傻瓜和#34;如果可能的话......:D)

我希望图像具有淡入/淡出区域,而不是线性增加但是"曲线"。我想这与Bezier曲线有关?如果是,我如何设置点以获得这样的曲线?

或者你的方法是什么?

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:5)

以下是您将如何进行此操作(正如您所说,您正在寻找逻辑而不是完整的实现)

  1. 创建基本形状轮廓:创建部分正弦波,使半周期(半波长:P1 = L / 2)等于长度(x坐标大小)你的形象。
  2. 添加Overtones:添加另一个正弦函数。此时波长由P2 = P1 / 2 + rnd给出,其中rnd是区间(-P1/4 , +P1 / 4)中的随机实数
  3. 重复:现在P2成为新的P1。
  4. 这样你就可以通过调制主波来产生'波浪波',你将获得顶部边界。

    您可以更改符号并获得下边界。

    您可能正在寻找的单词(对于形状,即) Overtones 。您可以更多地了解为光学或声学产生的泛音。

    这个将泛音添加到直线的例子可以提供更好的主意。上面的代码将这些随机缩短周期的正弦波相加,以产生波浪效应(sourceenter image description here

答案 1 :(得分:2)

再次感谢, hnk 。你给了我正确的想法。 :)

我做了一点工作并最终得到了这个:

procedure GenerateOverlayEdges(ABitmap: TBitmap; ARadiusX, ARadiusY: Integer);
const
  MAX_ANGLE = 90;
var
  ShapePosition, ShapeIndex, ShapesCount,
  Angle, X, Y, RadiusX, RadiusY, CenterY: Integer;
  PolyPoints: Array of TPoint;
begin
  ABitmap.Canvas.Pen.Color := clBlack;
  ABitmap.Canvas.Brush.Color := clBlack;

  //ABitmap.Canvas.Pen.Color := clWhite;
  //ABitmap.Canvas.Brush.Color := clWhite;

  RadiusX := ARadiusX;
  RadiusY := ARadiusY;
  CenterY := Round(ABitmap.Height / 2);
  ShapesCount := Ceil(CenterY / RadiusY);

  for ShapePosition := 1 to 4 do // 1 = TopLeft, 2 = BottomLeft, 3 = TopRight, 4 = BottomRight
    for ShapeIndex := 0 to ShapesCount - 1 do  // Index of current "stair"
      begin
        Finalize(PolyPoints);
        SetLength(PolyPoints, MAX_ANGLE + 1);
        for Angle := 0 to MAX_ANGLE do
          begin
            case ShapePosition of
              1, 3:
              begin
                RadiusX := Abs(RadiusX);
                RadiusY := Abs(RadiusY);                
              end;
              2, 4:
              begin
                RadiusX := Abs(RadiusX);
                RadiusY := -Abs(RadiusY);
              end;
            end;

            X := Trunc(RadiusX * Cos(Angle * 2 * Pi / 360));
            Y := Trunc(RadiusY * Sin(Angle * 2 * Pi / 360));
            case ShapePosition of
              1:
              begin
                X := X + ShapeIndex * RadiusX;
                Y := Y + CenterY - RadiusY - ShapeIndex * RadiusY;
              end;
              2:
              begin
                X := X + ShapeIndex * RadiusX;
                Y := Y + CenterY - RadiusY + ShapeIndex * Abs(RadiusY);
              end;
              3:
              begin
                X := ABitmap.Width - X - ShapeIndex * Abs(RadiusX);
                Y := Y + CenterY - RadiusY - ShapeIndex * RadiusY;
              end;
              4:
              begin
                X := ABitmap.Width - X - ShapeIndex * Abs(RadiusX);
                Y := Y + CenterY + Abs(RadiusY) + ShapeIndex * Abs(RadiusY);
              end;
            end;

            // Add points as part of a Polyon
            PolyPoints[Angle] := Point(X, Y);
          end;

        // Set Y to the Y borders for the very first and last point of the polygon so we will get a "closed" shape
        case ShapePosition of
          1, 3:  
          begin
            PolyPoints[0] := Point(PolyPoints[0].X, 0);
            PolyPoints[Angle - 1] := Point(PolyPoints[Angle - 1].X, 0);
          end;
          2, 4:  
          begin
            PolyPoints[0] := Point(PolyPoints[0].X, ABitmap.Height);
            PolyPoints[Angle - 1] := Point(PolyPoints[Angle - 1].X, ABitmap.Height);
          end;
        end;

        // Draw the poly points ... and fill the background at the same time
        ABitmap.Canvas.Polygon(PolyPoints);  
      end;

  Finalize(PolyPoints);
end;

用法:

var
    Bmp: TBitmap;
begin
    Bmp := TBitmap.Create;
    try
        Bmp.LoadFromFile('C:\Temp\Osc 2.bmp'); // Original Oscilloscope Image
        GenerateOverlayEdges(Bmp, 15, 20);
        Bmp.SaveToFile('C:\Temp\Osc 3.bmp');
    finally
        Bmp.Free;
    end;
end;

通过更改RadiusX功能的RadiusYGenerateOverlayEdges参数,我可以调整结果:

8×8:

enter image description here

15x20:

enter image description here

20×10:

enter image description here