TBITMAP双缓冲
2004-08-22 20:15
429 查看
首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才 |
移 动∣专 题∣SUN∣IBM∣微 软∣微 创∣精 华∣Donews∣人 邮 |
|
|
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;
[/b]
下面是运行结果:
ScanLine[0]: E90BB8 ScanLine[1]: E90000 ScanLine[1]-ScanLine[0]:-3000 |
从上面的结果可以看出TBitmap的图像数据在内存中是按行倒序连续存放的,通过TBitmap.ScanLine[TBitmap.Height-1]可以取得首地址即图像缓冲区地址。接着我们来实践一下,通过直接对图像缓冲区的读写将图像淡出到黑色:
procedure TForm1.Button1Click(Sender: TObject); const FADEOUT_STEP = 24; //淡出衰减值 FIX_WIDTH = 320; FIX_HEIGHT = 200; var BitMap: TBitmap; hWinDC: HDC; flagAgein: Boolean; lpBuffer: PByte; //图像缓冲区指针 begin BitMap := TBitmap.Create; if not Assigned(BitMap) then Exit; try //设置位图格式、宽度、高度 BitMap.PixelFormat := pf24bit; BitMap.Width := FIX_WIDTH; BitMap.Height := FIX_HEIGHT; //设置Form的宽充、高度,便于显示结果 Button1.Visible := false; ClientWidth := FIX_WIDTH; ClientHeight := FIX_HEIGHT; //拷贝图像到Bitmap中 hWinDC := GetDC(0); if (hWinDC<>NULL) then BitBlt(Bitmap.Canvas.Handle, 0, 0, FIX_WIDTH, FIX_HEIGHT, hWinDC, 0, 0, SRCCOPY) else BitBlt(Bitmap.Canvas.Handle, 0, 0, FIX_WIDTH, FIX_HEIGHT, Canvas.Handle, 0, 0, SRCCOPY); repeat flagAgein := false; lpBuffer := BitMap.ScanLine[FIX_HEIGHT-1]; //取得图像缓冲区首地址 //Integer(BitMap.ScanLine[0]) + FIX_WIDTH*3 为图像缓冲区结束地址 while Integer(lpBuffer) < Integer(BitMap.ScanLine[0]) + FIX_WIDTH*3 do begin if lpBuffer^>FADEOUT_STEP then begin Dec(lpBuffer^, FADEOUT_STEP); flagAgein := true; end else lpBuffer^ :=0; Inc(lpBuffer); Application.ProcessMessages; end; Canvas.Draw(0, 0, BitMap); until (not flagAgein); MessageBox(Handle, 'Done', 'Fadeout', MB_OK); finally if Assigned(BitMap) then FreeAndNil(BitMap); Button1.Visible := true; end; end; |
1、Bitmap图像缓冲区是双节对齐的,如果把例1中的图像宽度改为999,一个像素行还是占3000个字节。
2、目前Bitmap.PixelFormat有pfDevice、pf1bit、pf4bit、pf8bit、pf15bit、pf16bit、pf24bit、pf32bit、pfCustom共9种,不同格式每个像素所占字节数不同,其中pf4bit和pf8bit格式的图像缓冲区保存的为颜色索引号,真正的颜色值在调色板中,pf15bit、pf16bit格式中RGB所占的位数(Bit)不一定是等长的。有兴趣的可查阅相关资料。
作者Blog:http://blog.csdn.net/nhconch/
相关文章
SQL数据库ID备忘录 |
判断密码是不是简单文本的函数 |
获取TBitMap图像缓冲区,提高图像处理速度 |
自定义网页右键弹出菜单 |
ASP的数据库类 |
|
网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式 - English | |
北京百联美达美数码科技有限公司 版权所有 京ICP证020026号 | |
Copyright © CSDN.NET, Inc. All Rights Reserved | |
相关文章推荐
- PHP中刷新输出缓冲
- linux下fork()函数在行缓冲和全缓冲情况下对IO的影响
- linux c printf 的缓冲输出
- stdio和STDIN_FILENO以及带缓冲IO和不带缓冲IO的详细说明
- win32双缓冲技术的实现
- Filter(四)常用应用2---使浏览器不缓冲动态资源
- VC 双缓冲图形刷新技术
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
- mtd块设备缓冲操作---mtdblock.c
- scanf是带缓冲的函数
- printf 缓冲机制的问题
- Android UI——分享一个登录缓冲界面
- PHP输出缓冲(一)-- 缓冲区原理
- java缓冲字节流复制文件,逐个字节读取、写入
- 翻译:libevent参考手册第八章:evbuffer:缓冲IO实用功能 (十) (转)
- Android UI开发第十五篇——分享一个登录缓冲界面
- android Videoview 缓冲图标显示和进度条更新
- 自定义字节缓冲队列
- 一个例子叫你理解缓冲输入与非缓冲输入,以及流的概念:论read与fget open与fopen的区别
- 谈谈战略缓冲谋略的职场运用