读书人

windows图像显示原理。该怎么解决

发布时间: 2012-03-21 13:33:14 作者: rapoo

windows图像显示原理。
因为项目的需要,我自己设计了一个图片格式(位图)。支持多通道,和滤镜的。方案有了。可是怎么把图片的流显示到界面上呢?
我想过把我的格式解成一张Tbitmap可是那样好像会变慢很多。怎样做才能最有效率呢?

[解决办法]
记得在DirectDraw中有种方式是通过直接写内存来显示图像,就是将RGB信息按顺序写入画面对应的内存
每个像素按下列规则
16bit占2个字节,24bit占3个字节,32bit占4个字节
我去找找代码
[解决办法]
//以24bit,bitmap为例
var
lplpDDSurface:IDirectDrawSurface7 //DirectDraw屏幕对象
buffer:PByte;
ddsd :TDDSURFACEDESC2;
X,Y:Integer;
pRGB: pRGBTriple;
begin
FillChar( ddsd, SizeOf( ddsd ), 0);
ddsd.dwSize := SizeOf( ddsd );
if not (lplpDDSurface.Lock(nil, ddsd, DDLOCK_WAIT or DDLOCK_SURFACEMEMORYPTR, 0)=DD_OK) then exit;
buffer:=ddsd.lpSurface; //获得屏幕对应的内存指针偏移量
for y:=0 to Bitmap.Height-1 do begin
pRGB := Bitmap.ScanLine[Y];
for x:=0 to Bitmap.Width-1 do begin
buffer^:=pRGB^.rgbtBlue;
Inc(buffer);
buffer^:=pRGB^.rgbtGreen;
Inc(buffer);
buffer^:=pRGB^.rgbtRed;
Inc(buffer);
//32bit
// buffer^:=pRGB^.rgbtBlue;
// Inc(buffer);
// buffer^:=pRGB^.rgbtGreen;
// Inc(buffer);
// buffer^:=pRGB^.rgbtRed;
// Inc(buffer);
// buffer^:=0; //32bit的Alpha位
// Inc(buffer);
inc(pRGB);
end;
end;
if not (lplpDDSurface.Unlock(nil)=DD_OK) then exit;
end
[解决办法]
你看看是把你的格式转成Bitmap慢,还是显示慢啊。

读书人网 >.NET

热点推荐