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. poj1007——DNA Sorting

    Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are ...

  2. WIN32汇编语言中位图的使用

    说到位图.我们事实上非常早就接触过.从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比方jpg. gif .png.pcx.bmp等等,当中bmp格式的图片文件 ...

  3. php课程 6-22 字符串格式化函数有哪些(精问)

    php课程 6-22 字符串格式化函数有哪些(精问) 一.总结 一句话总结: 1.猜测一下$_GET()怎么来的? 函数赋值给变量的操作:$_YZM=get();   这样就可以很好的解释哪些全局变量 ...

  4. iOS 利用FZEasyFile本地保存 和 常规保存

    1.常规保存(较麻烦) NSFileManager *fileManager = [NSFileManager defaultManager]; //获取document路径,括号中属性为当前应用程序 ...

  5. 【22.73%】【codeforces 606D】Lazy Student

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. lucene 统计单词次数(词频tf)并进行排序

    public class WordCount { static Directory directory; // 创建分词器 static Analyzer analyzer = new IKAnaly ...

  7. ant的condition任务

    1.istrue isfalse:断言 真 假 <project name="testCondition"> <target name="test&qu ...

  8. template.js小小说明

    教程 template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果. 简介 主 ...

  9. asp.net中c#求百分比

    double m= 50;double n= 100; Response.Write((m/ (m+ n)).ToString("0%"));Response.Write((m/ ...

  10. WPF依赖属性(续)(3)依赖属性存储

    原文:WPF依赖属性(续)(3)依赖属性存储          在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...