We have been developing image processing software for above 14 years with old versions of Delphi, such as Delphi 6 and Delphi 7. We often working on pixels of bitmap by its Scanline property.  We want to do such things with FireMonkey framework in Delphi XE6. But at beginning, we even don't know how to do it with the familiar approach, the Scanline property, because TBitmap class itself in FireMonkey has no the Scanline property anymore.

We have to study how to work with FireMonkey by searching for information from Internet. And we have found a piece of code at Delphi official website: http://docwiki.embarcadero.com/CodeExamples/XE6/en/FMX.AlphaColorToScanline_(Delphi)

The code in the above page illustrated that for accessing the pixels on a bitmap, we have to beg a help from class TBitmapData. The demo code cannot be compiled through XE6, because the compiler reports lack of method GetPixelFormatBytes(). The code is for copying specified amount of lines of pixels from a source bitmap to a destination bitmap written with XE3. We have modified the original code a little bit to copy the all the pixels from the source to a destination, the code could be compiled by XE6 and runs well then.

First of all, creating a FireMonkey Destop project in XE6, drop two TImage components and a TButton component and a TOpenDialog component onto the form. Double click the TButton component and typing in the following code to its code block.

------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
  bd1, bd2 : TBitmapData;
  w, h     : Integer;
begin
  OpenDialog1.Filter := 'JPEG Image|*.jpg';
  if OpenDialog1.Execute then
  begin

    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
    w := Image1.Bitmap.Width;
    h := Image1.Bitmap.Height;
    Image2.Bitmap.PixelFormat := Image1.Bitmap.PixelFormat;
    Image2.Bitmap.SetSize(w, h);
    try
      Image1.Bitmap.Map(TMapAccess.Read, bd1);
      Image2.Bitmap.Map(TMapAccess.Write, bd2);
      AlphaColorToScanline(@PAlphaColorArray(bd1.Data)[0], bd2.Data,
        Round(w * h), Image1.Bitmap.PixelFormat);
    finally
      Image1.Bitmap.Unmap(bd1);
      Image2.Bitmap.Unmap(bd2);
    end;
  end;
end;

------------------------------

As you can see that the TBitmapData class is really great for being as a delegate to accessing data in a TBitmap object. We can mapping a
TBitmap object to be as a TBitmapData object, and then mess up bitmap data around with TBitmapData. And we can even control over the accessing permissions to those bitmap data.

We can copy all the pixels from a bitmap to another, but how can we manipulating each single pixel on a bitmap in our familiar approach,
with the scanline property, separately? The answer is included in TBitmapData class. In the following, we did the same things as above with scanline property.

------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
  bd1, bd2   : TBitmapData;
  x, y, w, h : Integer;
  p1, p2     : PAlphaColorArray;
begin
  OpenDialog1.Filter := 'JPEG Image|*.jpg';
  if OpenDialog1.Execute then
  begin

    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
    w := Image1.Bitmap.Width;
    h := Image1.Bitmap.Height;
    Image2.Bitmap.PixelFormat := Image1.Bitmap.PixelFormat;
    Image2.Bitmap.SetSize(w, h);
    try
      Image1.Bitmap.Map(TMapAccess.Read, bd1);
      Image2.Bitmap.Map(TMapAccess.Write, bd2);
      for y := 0 to (h - 1) do
      begin

        p1 := PAlphaColorArray(bd1.GetScanline(y));
        p2 := PAlphaColorArray(bd2.GetScanline(y));
        for x := 0 to (w - 1) do
        begin

          p2[x] := p1[x];
        end;
      end;

finally

Image1.Bitmap.Unmap(bd1);

Image2.Bitmap.Unmap(bd2);
    end;
  end;
end;

------------------------------

Wow, we can manipulating bitmap's pixels as before in FireMonkey framework. That's cool. The benefits of accessing individual pixel on a bitmap is that we can developing our own image filters now.

We haven't appreciating all the power of FireMonkey. But we believe that we can do more cool things with it. We will keep on studying it, and sharing more as we can.

Ma Xiaoguang and Ma Xiaoming

http://blog.csdn.net/gmbros/article/details/39047769

http://blog.sina.cn/dpool/blog/u/1282411531#type=-1

https://community.embarcadero.com/answers/how-do-i-get-at-individual-pixels-in-a-firemonkey-tbitmap

How to manipulate pixels on a bitmap by scanline property(Ma Xiaoguang and Ma Xiaoming)的更多相关文章

  1. 加快Bitmap的访问速度

    引言 在对Bitmap图片操作的时候,有时需要用到获取或设置像素颜色方法:GetPixel 和 SetPixel, 如果直接对这两个方法进行操作的话速度很慢,这里我们可以通过把数据提取出来操作,然后操 ...

  2. 以Lockbits的方式访问bitmap

    转载自:http://www.cnblogs.com/xiashengwang/p/4225848.html 2015-01-15 11:38 by xiashengwang, 585 阅读, 0 评 ...

  3. C#加快Bitmap的访问速度

    在对Bitmap图片操作的时候,有时需要用到获取或设置像素颜色方法:GetPixel 和 SetPixel, 如果直接对这两个方法进行操作的话速度很慢,这里我们可以通过把数据提取出来操作,然后操作完在 ...

  4. .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压

    以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  5. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)

    Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...

  6. Android开发学习之路-图片颜色获取器开发(1)

    系列第一篇,从简单的开始,一步一步完成这个小项目. 颜色获取就是通过分析图片中的每个像素的颜色,来分析整个图片的主调颜色,有了主调颜色,我们可以用于图片所在卡片的背景或者标题颜色,这样整体感更加强烈. ...

  7. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  8. inno setup介绍及官方网站地址

    使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞 ...

  9. JNI,NDK

    jni的调用过程 1)安装和下载Cygwin,下载Android NDK 2)在ndk项目中JNI接口的设计 3)使用C/C++实现本地方法 4)JNI生成动态链接库.so文件 5)将动态链接库复制到 ...

随机推荐

  1. 微服务学习笔记(1)——使用MagicOnion实现gRPC

    原文:微服务学习笔记(1)--使用MagicOnion实现gRPC 1.什么是gRPC 官方文档:https://grpc.io/docs/guides/index.html 2.什么是MagicOn ...

  2. SWIFT学习笔记04

    1.在实际编译时,Swift 编译器会优化字符串的使用.使实际的复制仅仅发生在绝对必要的情况下,这意味着您将字符串作为值类型的同一时候能够获得极高的性能. 2.for character in &qu ...

  3. Android菜鸟的成长笔记(24)——Android中的振动器

    在某些时候,程序需要启动系统振动器,比如手机静音时使用振动提示用户:再比如玩游戏时,当系统碰撞.爆炸时使用振动带给用户更逼真的体验等.总之,振动是除视频.声音之外的另一种"多媒体" ...

  4. kindeditor 4 上传下载文件

    jsp代码 1 <script type="text/javascript" src="${pageContext.request.contextPath}/kin ...

  5. 【Cocos2d-x Lua】数据库封装类型的操作

    Lua数据库封装类型的操作 使用演示样例 lua代码: require("DB") -- 保存一个字符串(数据库中存储的数据都是以字符串的形式保存的) DB:getInstance ...

  6. C# 使用Emit深克隆

    原文:C# 使用Emit深克隆 有人问,复制一个类所有属性到另一个类有多少方法?这也就是问深克隆有多少个方法,容易想的有三个.直接复制,反射复制,序列化复制.但是性能比较快的有表达式树复制 IL复制两 ...

  7. 《modern operating system》 chapter 5 Input and output 注意事项

    Input / Output It should also provide an interface between the devices and the rest of the system th ...

  8. Maven软件项目管理工具

    http://my.oschina.net/jgy/blog/125503 拷贝mavne安装文件夹conf以下的settings.xml到用户主文件夹下 改动改文件 <localReposit ...

  9. UVA - 10312 Expression Bracketing

    Description Problem A Expression Bracketing Input: standard input Output: standard output Time Limit ...

  10. Python算法(含源代码下载)

    关键字:Python Algorithms Python算法  Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...