获取TBitMap图像缓冲区,提高图像处理速度
来源:互联网 发布:淘宝网蔻丽针织开衫女 编辑:程序博客网 时间:2024/05/01 10:14
使用Dephi进行图像处理可以有多种方法,最常用的应该算是TBitmap,它提供方便的图像存取能力,结合Canvas可进行画线、画圆、图像拷贝等操作。不过在进行大量的图像处理操作时,为了获得更高的速度,我们希望能够直接对图像缓冲区进行读写。查阅Dephi的帮助手册没有发现直接取得整个图像缓冲区的功能,但提供的ScanLine属性可以取得指定行图像数据的指针,比较接近我们的要求,先看看ScanLine的描述:
Provides indexed access to each line of pixels.
property ScanLine[Row: Integer]: Pointer;
Description
ScanLine is used only with DIBs (Device Independent Bitmaps) for image editing tools that do low-level pixel work.
让我们再看看ScanLine[0]、ScanLine[1]的关系:
procedure TForm1.Button1Click(Sender: TObject);
var
BitMap: TBitmap;
S: String;
begin
BitMap := TBitmap.Create;
try
BitMap.PixelFormat := pf24bit; //24位色,每像素点3个字节
BitMap.Width := 1000;
BitMap.Height := 2;
FmtStr(S, 'ScanLine[0]:%8x'#13'ScanLine[1]:%8x'#13'ScanLine[1]-ScanLine[0]:%d'
, [Integer(BitMap.ScanLine[0]), Integer(BitMap.ScanLine[1])
, Integer(BitMap.ScanLine[1]) - Integer(BitMap.ScanLine[0])]);
MessageBox(Handle, PChar(S), 'ScanLine', MB_OK);
finally
if Assigned(BitMap) then FreeAndNil(BitMap);
end;
end;
下面是运行结果:
前两个结果因机器不同而不同,第三个结果很特别,ScanLine[0]与ScanLine[1]之间相差3000=1000像素宽×3字节这很容易理解,但为什么是负数呢?因为BMP图像数据是“按行存放,每行按双字对齐,行按倒序方式存放”的,也就是说屏幕显示的第一行存放在最后,屏幕显示的最后一行存放在前面,所以用ACDSee等看图软件查看尺寸较大的位图时先从下部开始显示就是这个道理。ScanLine[0]: E90BB8
ScanLine[1]: E90000
ScanLine[1]-ScanLine[0]:-3000
从上面的结果可以看出TBitmap的图像数据在内存中是按行倒序连续存放的,通过TBitmap.ScanLine[TBitmap.Height-1]可以取得首地址即图像缓冲区地址。接着我们来实践一下,通过直接对图像缓冲区的读写将图像淡出到黑色:
{====================================================================== 文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持! repeat MessageBox(Handle, 'Done', 'Fadeout', MB_OK); |
1、Bitmap图像缓冲区是双节对齐的,如果把例1中的图像宽度改为999,一个像素行还是占3000个字节。
2、目前Bitmap.PixelFormat有pfDevice、pf1bit、pf4bit、pf8bit、pf15bit、pf16bit、pf24bit、pf32bit、pfCustom共9种,不同格式每个像素所占字节数不同,其中pf4bit和pf8bit格式的图像缓冲区保存的为颜色索引号,真正的颜色值在调色板中,pf15bit、pf16bit格式中RGB所占的位数(Bit)不一定是等长的。有兴趣的可查阅相关资料。
- 获取TBitMap图像缓冲区,提高图像处理速度
- 取得TBitMap图像缓冲区
- 提高VB6.0处理图像的速度的方法
- 使用GPU提高OpenCV的图像处理运算速度
- 图像处理速度计算
- 各种图像处理库的处理速度
- OPENCV图像处理提高(一)图像增强
- OPENCV图像处理提高(二):模糊
- Java:Jpanel 缓冲区 图像
- matlab中处理图像如何加快处理速度?
- 图像处理--图像增强
- 图像处理 图像切割
- 图像处理 - 图像平移
- 图像处理 - 图像旋转
- 图像处理--图像噪声
- 【图像处理】图像标签
- 【图像处理】图像增强
- Delphi图像处理 -- 获取窗口或设备的图像数据
- 哭了
- 精彩总结:★加密网页破解大法★[续]
- qq奥运版
- 为什么不考虑考虑我的心情
- 投身IT业需具备四项基本素质ZZ
- 获取TBitMap图像缓冲区,提高图像处理速度
- My Dell looks longhorn
- 不计成本的项目进展
- Linux编译内核详解
- 谈谈五皇后问题
- Windows XP considers zip as folder, how to disable this?
- 唉,又要重新找工作了
- .Net平台下开发中文语音应用程序
- 串口通信的二进制接收问题