在Delphi 2010中绘制不透明椭圆 [英] Draw opacity ellipse in Delphi 2010

查看:245
本文介绍了在Delphi 2010中绘制不透明椭圆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找在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,0,bm2.Width,bm2.Height);

Canvas.Draw(100,100,bm1);
Canvas.Draw(100,100,bm2,127);
结束

样品1 http://privat.rejbrand.se/blendimg1.png



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

  procedure TForm1.Button1Click(Sender:TObject); 
type
TRGB32Array =打包数组[0..MaxInt div SizeOf(TRGBQuad)-1]的TRGBQuad;
PRGB32Array = ^ TRGB32Array;
TScanline = TRGB32Array;
PScanline = ^ TScanline;
var
bm1,bm2,bm3:TBitmap;
sc1,sc2,sc3:PScanline;
i:整数;
j:整数;
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,bm1.Height);
bm2.Canvas.Brush.Color:= clRed;
bm2.Canvas.Pen.Style:= psClear;
bm2.Canvas.Ellipse(0,0,bm2.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);
结束
结束

Canvas.Draw(100,100,bm3);

end;

样品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);
结束
结束
...

示例3 http://privat.rejbrand.se/blendimg3.png



更不用说所有其他可以使用pixmap操作的酷的东西

  ... 
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);
结束
结束
...

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,0,bm2.Width,bm2.Height);

Canvas.Draw(100,100,bm1);
Canvas.Draw(100,100,bm2,127);
结束

样品5 http://privat.rejbrand.se/blendimg5.png


I am looking to draw an opacity ellipse in CodeGear Delphi 2010.

I had tried to draw to an another bitmap, I had set the bitmap transparent color(for background) Call the ellipse method.

And in my image I draw the bitmap with opacity parameter(from overload). But it doesn't work.

I want something like this http://www.java2s.com/Tutorial/VBImages/WPF-UseOpacityMaskAndRadialGradientBrush.PNG

Does anybody know an working method?

解决方案

It works for me:

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, 0, bm2.Width, bm2.Height);

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

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

If you want more control, you can always do the processing manually:

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, bm2, 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, bm1.Height);
  bm2.Canvas.Brush.Color := clRed;
  bm2.Canvas.Pen.Style := psClear;
  bm2.Canvas.Ellipse(0, 0, bm2.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, 100, bm3);

end;

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

You can for example let the background image be at 100 % opacity outside the ellipse:

  ...
  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

Not to mention 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

If you really don't want to do it manually, I just figured out, you can draw the ellipse on a copy of the first bitmap, and then blend these two bitmaps:

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, 0, bm2.Width, bm2.Height);

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

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

这篇关于在Delphi 2010中绘制不透明椭圆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆