首页 > 其他分享 >Delphi图像处理中ScanLine的使用

Delphi图像处理中ScanLine的使用

时间:2023-11-14 22:12:18浏览次数:25  
标签:字节 Delphi 像素 图像处理 图像 ScanLine TPixelFormat 赋值

一般我们在Delphi中进行图像处理时采用Pixels像素点赋值的方法,Delphi代码如下:

var
x,y:Integer;
cColor:TColor;
begin
  for y:=0 to Image1.Height-1 do
    for x:=0 to Image1.Width-1 do
      cColor:=Image1.Canvas.Pixels[i,j];
end;


但是这种方法有个缺点,处理速度很慢,小图像还可以,对于大点的图像来说就太慢了。
Delphi提供了一种扫描线ScanLine方法是对图像的一行进行扫描,获取本行中各像素的内存地址。众所周知,内存操作肯定会比常规的像素点赋值速度快很多,所以将大大提高图像的处理速度。

Delphi代码如下:

var
P:array[0..100] of PByteArray;//像素数组       
y:Integer;
begin
  for y:=0 to Bmp.Height-1 do
  begin
    P[y]:=Bmp.ScanLine[y];//将图片所有像素值存入P
  end;
end;


这样就将一个图像的所有像素都存入了P这个数组
在SysUtils单元中可以看出PByteArray实际上是一个Byte类型的数组
所以我们声明的P:array[0..100] of PByteArray;实际上可以看成是一个二维数组
P数组就是一个图像像素的缓冲区,它的一维是图像Y坐标,二维是图像的X坐标。
这样,如果我们要对图像的某个像素赋值,例如将第一行、第二列的像素赋值为白色,可用下面的Delphi代码

var
P:array[0..100] of PByteArray;//像素数组
x,y:Integer;
begin
  for y:=0 to Bmp.Height-1 do
  begin
    P[y]:=Bmp.ScanLine[y];//将图片所有像素值存入P
  end;
  y:=0;//第一行
  x:=1;//第二列
  P[y][x*3]:=255;//像素的第一字节
  P[y][x*3+1]:=255;//像素的第二字节
  P[y][x*3+2]:=255;//像素的第三字节
end;


上面的代码中,我们使用的图像是24位色的(TPixelFormat:=pf24bit),也就是一张真彩色的图片,pf24bit的图像中,每个像素在内存中占用三个字节,分别表示RGB值的分量,所以我们可以对三个字节直接赋值

在其它类型的图像中就不一定能这样赋值了

TPixelFormat:=pf1bit的图像(单色图)中每像素用1位来表示,所以要使用位操作来给像素赋值

TPixelFormat:=pf4bit的图像中每像素用4位来表示,也要使用位操作来给像素赋值

TPixelFormat:=pf8bit的图像中每像素用8位来表示,可以使用Byte类型的值给像素赋值,不过这类图像比较特殊,它的像素值并不是真正的颜色值,而只是调色板上颜色的索引值,这点要注意

TPixelFormat:=pf15bit的图像也是一种比较特殊的图像,它每像素用16位来表示,第1位为0,后15位每5位分别表示RGB值,所以也要使用位操作来给像素赋值

TPixelFormat:=pf16bit的图像中每像素用16位来表示,绿色占6位,其它红、蓝两种颜色占5位(为什么要这样?我也不知道,要问制定Bitmap格式的人了,据说是因为人眼对绿色比较敏感)

TPixelFormat:=pf24bit的图像每个像素用3个字节表示,这就不说了,参看上面的代码

TPixelFormat:=pf32bit的图像每个像素用4个字节表示,前面3个字节分别表示RGB值的分量,最后一个字节表示Alpha值

标签:字节,Delphi,像素,图像处理,图像,ScanLine,TPixelFormat,赋值
From: https://www.cnblogs.com/xionda/p/17832713.html

相关文章

  • 【scipy 基础】--图像处理
    SciPy库本身是针对科学计算而不是图像处理的,只是图像处理也包含了很多数学计算,所以Scipy也提供了一个专门的模块ndimage用于图像处理。ndimage模块提供的功能包括输入/输出图像、显示图像、基本操作(如裁剪、翻转、旋转等)、图像过滤(如去噪、锐化等)、图像分割、分类、特征提取以及......
  • 【C++】【图像处理】均值滤波和高斯滤波(低通滤波)算法解析(以.raw格式的图像为基础进行
    1voidmeanFilter(BYTE*image,intwidth,intheight,BYTE*outImg)2{3//均值滤波4intsmth[9];5inti,j,m,n;6BYTEblock[9];78//高斯卷积核初始化9smth[0]=1,smth[1]=2,smth[2]=1,10smth[3]=2,......
  • Delphi TNetHTTPClient使用递归方式取所有分页数据
    DelphiTNetHTTPClient使用递归方式取所有分页数据   业务系统提供的一个查询数据接口,可以通过分页方式取得数据,如果一次性取得所有数据,将页大小增大即可,但如果数据太多怕会造成内存溢出。   综合考虑每次只取一个分页,分页数据不要太大,用递归方式来获取是比较合理的解......
  • ISP图像处理Pipeline
    参考:1.键盘摄影(七)——深入理解图像信号处理器ISP2.UnderstandingISPPipeline3.ISP图像处理流程介绍4.ISP系统综述5.ISP(图像信号处理)之——图像处理概述6.ISP框架7.ISP(图像信号处理)算法概述、工作原理、架构、处理流程8.ISP全流程简介9.ISP流程介绍(Raw格式......
  • delphi 官方例子 simples 路径
     公用文件件可能是隐藏的若是的话则显示隐藏    ......
  • Delphi 用TDatasetToJSONBridge原生支持DataSet导出Json(转红鱼儿)
    Xalion发现data.DBJson单元,不知什么时候加的,官方帮助中也没有写。1procedureTForm18.Button2Click(Sender:TObject);2var3cV:TDatasetToJSONBridge;4jo:Tjsonobject;5begin6cV:=TDatasetToJSONBridge.Create;7try8cV.Dataset:=mt;......
  • 调用Delphi DLL 注意事项
    1.使用统一的调用约束(__stdcall)2.arrayof 调用delphi接口:procedureProcessArray(constArr:arrayofInteger);stdcall; VC:typedefvoid(__stdcall*ProcessArrayFunc)(constint*,int);ProcessArrayFuncprocessArray=(ProcessArrayFunc)GetProcAddress(......
  • Delphi 10.x 提示脚本错误的解决方法
    Delphi10.x提示脚本错误的解决方法解决办法如下:10.1版本修改方法:打开注册表,在cmd中输入regedit,以管理员的身份运行,找到HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\KnownIDEPackages项,找到$(BDS)\Bin\CommunityToolbar240.bpl这个子项目将其内容由Embarcade......
  • Delphi10.4 Android调用相机返回图片调试
    Delphi10.4Android调用相机返回图片调试使用Delphi封装的“StandardAction”这些标准操作,可以非常方便我们调用Android系统功能。在Android上会存在各类权限问题造成应用无法运行创建工程 File->New->Multi-DeviceApplication-Delphi选择" BlankApplication",点击"OK"完成......
  • Pixelmator Pro:轻松实现您的图像处理梦想
    PixelmatorPro是一款功能强大的图像处理软件,它具有专业的图像编辑功能,可以轻松实现各种高质量的图像处理任务。该软件拥有先进的图像处理技术,可以让用户在短时间内完成各种复杂的图像处理任务。→→↓↓载PixelmatorProPixelmatorPro支持多种图像格式,包括JPEG、PNG、TIFF等,......