BlueJade

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  官方快速入门,加上了一些注解 [从WORD粘贴后失去了样式]

TImage32 类是关键。

TImage32 对象包含单个图像,所有图像操作都作用于此对象。

uses Img32;  //引用单元

...

img := TImage32.Create;  //创建TImage32对象

//执行一些其它操作

img.Free;  //用完了要释放



图像存储、格式和文件访问。

Image32 分别通过 Img32.Fmt.BMP、Img32.Fmt.PNG 和 Img32.Fmt.JPG 模块提供对 BMP、PNG 和 JPG 存储的文件访问。

uses Img32, Img32.Fmt.PNG;  //要加载什么类型的图片,必需添加什么类型的单元引用

...

img := TImage32.Create;

img.LoadFromFile('beetle.png');   //自动会判断加载不同类型的图片

//执行一些其它操作

img.SaveToFile('beetle_modified.png');  //保存

img.Free;

 

图像处理

Image32 库具有大量处理图像的类和函数列表,包括:色调、亮度和饱和度调整;方框模糊和高斯模糊;擦除颜色;混合合并图像;作物;浮雕;翻转和旋转;缩放;提高;扭曲;转换;和特效

uses Img32, Img32.Fmt.PNG;

  ...

var

  img: TImage32;

begin

  img := TImage32.Create;

  img.LoadFromFile('fruit.png');

  img.Rotate(-angle45);   //旋转

  img.SaveToFile('fruit45.png');

  img.Free;

 

效果如下:

uses Img32, Img32.Extra, Img32.Fmt.PNG;

...

img := TImage32.Create;

img.LoadFromFile('fruit.png'); 

img.SaveToFile('c:\temp\fruit_before.png');

Sharpen(img, 3, 10);   //锐化,图片显示更清晰

img.SaveToFile('c:\temp\fruit_after.png');

img.Free;

uses Img32, Img32.Vector, Img32.Fmt.PNG, Img32.Transform;

...

var

  img: TImage32;

  src, dst: TPathD;

begin

  img := TImage32.Create;

  img.LoadFromFile('clouds.png');

  src := Rectangle(img.Bounds); //将TRect转换为路径

  dst := CopyPath(src);  //复制路径

  dst[1].Y := img.Height div 8;   //修改路径点1的Y轴位置

  dst[2].Y := img.Height * 7 div 8; //修改路径点2的Y轴位置

  if ProjectiveTransform(img, src, dst, NullRect) then //投影变换

    img.SaveToFile('c:\temp\clouds_proj.png');

  img.Free;

end;

 

多边形渲染

Img32 提供了大量的绘图工具。
Img32.Draw 模块提供线条、虚线多边形绘图功能,并包括几个渲染器,可生成:纯色;平铺图像;以及线性和径向渐变渲染。
Img32.Vector 模块还提供了许多矢量绘图功能,包括:矩形;圆形矩形;椭圆;馅饼和弧线;样条和贝塞尔;星;等。

uses Img32, Img32.Fmt.PNG,Img32.vector, Img32.Draw, Img32.Clipper2;

...

var

  img: TImage32;

  rec: TRect;

  path: TPathD;

  paths: TPathsD;

  radGradRend: TRadialGradientRenderer;

begin

  img := TImage32.Create;

  img.SetSize(256,256);

  rec := img.Bounds; //图形区域

  rec := Img32.Vector.InflateRect(rec, -50,-50);

//区域对象缩小[也可以用系统自带函数]

    //绘制一个渐变填充的星形

  path := Star(PointD(128, 128), 50, 100, 7); //获取一个星形的路径

  radGradRend := TRadialGradientRenderer.Create; //创建渐变渲染对象

  radGradRend.SetParameters(rec, clFuchsia32, clYellow32);//设置渲染参数

  DrawPolygon(img, path, frNonZero, radGradRend);//绘制多边形到 img中

  radGradRend.Free;  //释放渐变渲染对象

  DrawLine(img, path, 1, clBlack32, esPolygon); //根据路径绘制线[即星形外边框]

  //画一个星星的虚线轮廓

  paths := InflatePath(path, 7, jsRound);  //路径扩展(放大)

  DrawDashedLine(img, paths,[4,4], nil, 1, clBlack32, esPolygon);

    // 绘制虚线路径线段

  img.SaveToFile('c:\temp\star.png');

  img.Free;

end;

   文本特效

uses Img32, Img32.Fmt.PNG, Img32.Text,Img32.Vector, Img32.Draw, Img32.Extra;

  ...

var

    img: TImage32;

    textOutline: TPathsD;

    impactFont: TFontReader;

    impact48: TFontCache;

begin

    img := TImage32.Create(400,150);

    //Load Windows' Impact TTF font  加载字体

  FontManager.Load('Impact', 800);

  impactFont := FontManager.GetFont('Impact'); //获取字体渲染对象

  impact48 := TFontCache.Create(impactFont, DpiAware(48));

//创建指定大小的字体缓存对象

  try

textOutline := impact48.GetTextGlyphs(20, 130, 'Image32');

        //获取文本 Image32 的路径

    //绘制文本使用阴影和3D效果绘制轮廓

    DrawShadow(img, textOutline, frNonZero, 3);//绘制阴影

    DrawPolygon(img, textOutline, frNonZero, $FF00DD00);//绘制多边形

    Draw3D(img, textOutline, frNonZero, 3,4);//绘制3D效果

    DrawLine(img, textOutline, 1, clBlack32, esPolygon);//绘制边框线

    img.SaveToFile('c:\temp\Image32.png');

  finally

    img.Free;

    impact48.Free;

    //impactFont.Free; //managed by FontManager

  end;

end;

什么!没有 VCL.Graphics

这是一个深思熟虑的设计决策,因此将 Img32 库翻译成另一种语言和不同的操作系统相对容易。但话虽如此,VCL.Graphics 仍然用于 Img32.Fmt.PNG 和 Img32.Fmt.JPG 模块。
那么如何以 Delphi 形式显示图像呢?

Windows中的所有绘图都是使用设备上下文(DC)执行的,Delphi的VCL.Graphics将DC封装在TCanvas对象中,实际的DC是TCanvas.Handle。因此,使用 TImage32 的 CopyToDC 方法,其图像可以在任何具有 TCanvas 属性的 TControl 中显示;其中包括 TForm、TPanel 和 TImage 组件。

uses Img32;

...

img := TImage32.Create;

//做一些其它操作… …

// Image1是Delphi中自带的控件 TImage

Image1.Picture.Bitmap.SetSize(img.Width, img.Height);

Image1.Picture.Bitmap.Canvas.Brush.Color := clBtnFace;

Image1.Picture.Bitmap.Canvas.FillRect(Image1.ClientRect);

//将Image32中的图形复制到 对象的句柄,即可在对象的句柄对象显示图形

img.CopyToDc(Image1.Picture.Bitmap.Canvas.Handle);

img.Free;

否则,请使用包含 TImage32Panel 组件的随附的 Img32.Panels 单元。

   

posted on 2024-06-01 15:19  bluejade2024  阅读(43)  评论(0编辑  收藏  举报