文档章节

Delphi XE2 之 FireMonkey 入门(9) - TBitmap

涂孟超
 涂孟超
发布于 2014/09/26 15:30
字数 1014
阅读 14
收藏 0

TBitmap 主要成员:

{ 方法 }
SetSize();               //设置大小
Clear();                 //取消, 就是用指定颜色覆盖
ClearRect();             //覆盖指定矩形范围, 默认覆盖为透明色
BitmapChanged();         //刷新改变
IsEmpty();               //是否为空
UpdateHandles();         //将 Handles 数组中的对象标记为需要更新
AddFreeNotify();         //将指定对象添加到可以释放的列表; 这一般是针对添加到 Handles 中的对象
RemoveFreeNotify();      //释放指定对象; 这一般是针对添加到 Handles 中的对象
Rotate();                //旋转角度
FlipHorizontal();        //水平翻转
FlipVertical();          //垂直翻转
InvertAlpha();           //翻转透明度, 只适于透明图片
FillColor();             //填充遮罩色, 用于透明图片
CreateMask();            //建立蒙版; 是从 TBitmap 中把各像素的透明度提取为一个数组, 返回数组指针
ApplyMask();             //添加蒙版, 其参数应该是有 CreateMask() 建立的
CreateThumbnail();       //建立略缩图
LoadFromFile();          //从文件载入
LoadFromStream();        //从流中载入
LoadThumbnailFromFile(); //从文件载入为略缩图
SaveToFile();            //保存到文件
SaveToStream();          //保存到流
HandleRemove();          //从 Handles 数组移除对象, 并没有释放
HandleAdd();             //添加对象到 Handles 数组
HandleExists();          //判断指定对象是否已添加到 Handles 数组

{ 属性 }
Width                             : Integer;          //宽
Height                            : Integer;          //高
Handles[AItem: Pointer]           : Pointer;          //访问 Handles 中的对象, 索引是指针; 写入前需要先 HandleAdd();
HandlesNeedUpdate[AItem: Pointer] : Boolean;          //判断 Handles 中的指定对象是否需要更新
Canvas                            : TCanvas;          //获取绘图表面
Pixels[X, Y: Integer]             : TAlphaColor;      //获取或设置指定位置的颜色值
ScanLine[Y: Integer]              : PAlphaColorArray; //获取一条横线上的像素数组的指针
StartLine                         : PAlphaColorArray; //获取像素数组的指针
ResourceBitmap                    : TBitmap;          //该属性应该是内部使用的
StyleLookup                       : string;           //这应该是和控件的造型相关的, 暂不知 TBitmap 要它干嘛

{ 事件 }
OnChange: TNotifyEvent; //


Create()、SetSize()、Clear()、IsEmpty():

procedure TForm1.Button1Click(Sender: TObject);
var
  bit: TBitmap;
begin
  bit := TBitmap.Create(0, 0);
  ShowMessage(BoolToStr(bit.IsEmpty, True));
  bit.SetSize(100, 100);
  ShowMessage(BoolToStr(bit.IsEmpty, True));
  bit.Clear(claRed);
  Image1.Bitmap.Assign(bit);
  bit.Free;
end;


Rotate()、FlipHorizontal()、FlipVertical():

procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
    Image1.WrapMode := TImageWrapMode.iwFit;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Rotate');
  Image1.Bitmap.Rotate(60);

  ShowMessage('FlipHorizontal');
  Image1.Bitmap.FlipHorizontal;

  ShowMessage('FlipVertical');
  Image1.Bitmap.FlipVertical;
end;


FillColor():

procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
    Image1.WrapMode := TImageWrapMode.iwFit;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Bitmap.FillColor($800000FF);
//  Image1.Bitmap.FillColor($FF0000FF);
end;


CreateMask()、ApplyMask():

procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
    Image1.WrapMode := TImageWrapMode.iwFit;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  bit: TBitmap;
  bitAs: PByteArray;
begin
  bit := TBitmap.Create(0, 0);
  bit.Assign(Image1.Bitmap); //从 Image1 复制 TBitmap

  bitAs := bit.CreateMask;
  Image1.Bitmap.Clear(claBlue);
  Image1.Bitmap.ApplyMask(bitAs);

  bit.Free;
end;


StartLine: 尽管该属性是只读的, 但因为是指针, 所以可以直接改写像素.

procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
    Image1.WrapMode := TImageWrapMode.iwFit;
  end;
end;

//点击按钮调整图像的透明度
procedure TForm1.Button1Click(Sender: TObject);
var
  bit: TBitmap;
  bts: PAlphaColorArray;
  i: Integer;
  j: Integer;
begin
  bit := TBitmap.Create(0, 0);
  bit.Assign(Image1.Bitmap);
  bts := bit.StartLine;

  for i := 0 to bit.Width - 1 do
    for j := 0 to bit.Height - 1 do
      TAlphaColorRec(bts[i*j]).A := TAlphaColorRec(bts[i*j]).A div 2; //现在通过数组指针可以直接索引元素了, 太好

  Image1.Bitmap.Assign(bit);
  bit.Free;
end;


Pixels[X, Y: Integer]:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName); //要个透明图片
    Image1.WrapMode := TImageWrapMode.iwFit;
    Image1.Position.X := 0;
    Image1.Position.Y := 0;
    Image1.Width := Image1.Bitmap.Width;
    Image1.Height := Image1.Bitmap.Height;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  bit: TBitmap;
  W,H,i,j: Integer;
  R: TRectF;
begin
  W := Trunc(Image1.Width);
  H := Trunc(Image1.Height);
  bit := TBitmap.Create(W div 2, H div 2);

  for i := 0 to W - 1 do
    for j := 0 to H - 1 do
    begin
      if Odd(i) and Odd(j) then //复制单数行以缩小图像一倍
        bit.Pixels[i div 2, j div 2] := Image1.Bitmap.Pixels[i, j];
    end;
  Image1.Width := bit.Width;
  Image1.Height := bit.Height;
  Image1.Bitmap.Assign(bit);
  Realign;
  bit.Free;
end;


Handles 相关: TBitmap 内部管理着一个对象数组, 访问索引也是一个指针.

var
  bit1,bit2,bit3: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bit1 := TBitmap.Create(100, 100);
  bit2 := TBitmap.Create(100, 100);
  bit3 := TBitmap.Create(100, 100);
  bit1.Clear(claRed);
  bit2.Clear(claGreen);
  bit3.Clear(claBlue);

  Image1.Width := 100;
  Image1.Height := 100;

  Image1.Bitmap.HandleAdd(Button1);
  Image1.Bitmap.Handles[Button1] := bit1;

  Image1.Bitmap.HandleAdd(Button2);
  Image1.Bitmap.Handles[Button2] := bit2;

  Image1.Bitmap.HandleAdd(Button3);
  Image1.Bitmap.Handles[Button3] := bit3;

  Button2.OnClick := Button1.OnClick;
  Button3.OnClick := Button1.OnClick;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Bitmap := Image1.Bitmap.Handles[Sender];
end;


通过 FMX.Types 单元中的 GetMeasureBitmap() 函数可以快速获取 1*1 的 TBitmap 对象.

本文转载自:http://www.cnblogs.com/del/archive/2011/09/22/2185460.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Delphi XE2:这就是我们所期待的Delphi吗?

版权声明:本文为 OSChina.NET 原创编译 转载务必注明出处,并保留链接! 作者:蒂姆.安德森 Delphi是被一些人遗忘了的快速应用程序开发工具,但它与可视组件库相结合,依然是开发Windows本机...

虫虫
2011/10/31
40.9K
49
使用 Delphi 开发移动应用

引言 现在移动设备的发展现在变成了趋势. 我们可以考虑本地语言开发 (例如ObjectiveC for IOS或 Java for Android), 但通常对新开发者的学习代价高. 另一个选择是第三方代理 (例如Titanium,...

oschina
2012/12/11
10.5K
21
Delphi XE2 新功能:LiveBindings --- 把对象之间的属性绑定起来

Delphi XE2 新功能:LiveBindings --- 把对象之间的属性绑定起来日期:2011年9月9日 作者: 人气:5340 查看:[大字体 中字体 小字体] XE2 有了 FireMonkey 框架,它不同于 VCL ,以往的数据感...

vga
2016/08/09
53
0
PostgreDAC 2.8.0,Delphi的PostgreSQL组件

PostgreDAC 2.8.0 发布了,该版本首次通过 RAD Studio XE2 支持 Mac OS X 系统,大大提升了 FireMonkey 支持,修复了关于 TPSQLMonitor 的 bug。 完整改进记录: [!] FireMonkey and cross p...

红薯
2012/03/20
691
1
最全面的常用Delphi第三方控件汇总—报表、图表、界面、数据库等

有网友问我常用Delphi第三方控件及功能。我先大概整理一下,以后会在文章里面碰到时再仔细介绍。 报表图表方面: TeeChart Pro 在delphi 的图形显示方面目前唯一的选择,虽然从delphi 3 就随...

Leamontea
2012/12/03
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
31分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
38分钟前
5
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
45分钟前
6
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
48分钟前
4
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部