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. 【27.22%】【poj2991】Crane

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5772   Accepted: 1571   Special Judge D ...

  2. [Django] The admin interface

    Now let's see how to access admin interface. 1. Create a super user which can access admin interface ...

  3. js进阶 9-5 js如何确认form的提交和重置按钮

    js进阶 9-5 js如何确认form的提交和重置按钮 一.总结 一句话总结: 1.这个并不好做:onsubmit 里面的代码必须返回false才能取消onsubmit方法的执行,所以,有return ...

  4. 新技能 get —— 使用 python 生成词云

    什么是词云(word cloud)呢?词云又叫文字云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据 ...

  5. 【BZOJ 1018】 [SHOI2008]堵塞的交通traffic

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 [题意] [题解] 按照这里的题解写的http://blog.csdn.net/ ...

  6. 【P084】立体图

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请 ...

  7. request.getSession().getServletContext().getRealPath()的一些坑

    今天是学校机房的服务器上对之前的一个网站升级时发现了一个bug,我自己的机器上用的tomcat8,机房上是tomcat7,结果一运行就开始报找不到文件,最后发现是文件分隔符的问题 原来在代码中涉及到路 ...

  8. WPF 通过位处理合并图片

    原文:WPF 通过位处理合并图片 本文告诉大家,在使用 WPF 合并两张图片的处理,可以使用像素之间的与或和异或的方式,对三个颜色的通道进行处理. 先给大家看一下软件的界面 这就是通过将左边的两张图片 ...

  9. HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)

    职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...

  10. 在vs code中使用dotnet watch run

    只需要在csproj文件中加入一行: <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App&quo ...