bmp中的数据提取出后怎么画? ( 积分: 50 )

  • 主题发起人 主题发起人 funxu
  • 开始时间 开始时间
F

funxu

Unregistered / Unconfirmed
GUEST, unregistred user!
我将bmp中的数据提取出后,想要画在画布上,但是经过计算却多出了770字节,所以不知道怎么计算目标画布的行宽和列高,我的bmp是24bit的,文件大小557534,位图大小557480,位图宽482高385,水平和垂直分辨率3780
 
我将bmp中的数据提取出后,想要画在画布上,但是经过计算却多出了770字节,所以不知道怎么计算目标画布的行宽和列高,我的bmp是24bit的,文件大小557534,位图大小557480,位图宽482高385,水平和垂直分辨率3780
 
参考TBitmap的画法
 
Canvas.Draw(x,y,graphic);
只要坐标就行了
 
我知道Canvas.Draw(x,y,graphic);,但是x和y是要自己计算的,24bit里面存的是像素,需要自己计算行列画图
 
拿下面的函数,想怎么画就怎么画。
StretchBlt
说明
将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。这个函数会在设备场景中定义一个目标矩形,并在位图中定义一个源图象。源矩形会根据需要进行伸缩,以便与目标矩形的大小相符
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,目标设备场景
x,y Long,目标矩形左上角的x,y坐标,以逻辑坐标表示
nWidth,nHeight Long,目标矩形的宽度和高度,以逻辑坐标表示
hSrcDC Long,源设备场景。如光栅运算未指定一个源,则这个参数应为零
xSrc,ySrc Long,用源DC的逻辑坐标表示的源矩形左上角位置
nSrcWidth,nSrcHeight Long,分别指定用逻辑单位(以源DC为基础)传输的一幅图象的宽度和高度。如其中有一个参数的符号(指正负号)与对应的目标参数不符,位图就会在对应的轴上作镜像转换处理
dwRop Long,传输过程中进行的光栅运算。如刷子属于光栅运算的一部分,就使用选入目标DC的刷子
注解
可用GetDeviceCaps函数判断特定的设备场景是否支持此函数
不可选择对源位图进行剪切或旋转处理,源位图也不能是一个图元文件设备场景

 
24bit的图像大小还和压缩率有关。
 
9494,我现在需要的不是封装好的bmp画图,是需要将bmp里的图像数据部分取出处理后再画到自己的画布上,我已经取出了图像数据也知道三个像素一个点,好像是每行保证是4的倍数,不足补零但是计算出的字节数不对,也不知到怎么计算行列进行画图,请高手指教
 
wyj19802004兄的介绍我看了,但是现在我手里的是数据需要一个一个点的分析画图,我虽然知道图像宽高,但是按照24bit图像换算后不对,所以画出的图也是乱的
 
bmp的文件头里有文件的长宽,大小,压缩率等数据,读出来看看。另外bmp数据存放和显示的数据是反的
 
我都读出来了,而且我知道左下右上反方向画图,我现在只是不知到怎么把像素按照行列进行计算,就是一行应该多少个点,补足多少个点,因为按照读出的进行补足后多了770字节
 
其实这是一个不太难的问题,主要是你要了解位图格式,主要是设备无关位图
 
可惜我是菜鸟啦,不太难的问题也变得难了
 
求人不如求自己,终于搞定了,换算错误是因为bmp采用了压缩算法,现在未压缩已经搞定,但是一点一点的画速度太慢,不知道delphi的image是怎么搞定的,谁能告诉我怎么将数据画在image的canvas上和image载入图片一样快就结分
 
最快的估计是 DIRECTX 了 :)
然后就是 SetDIBitsToDevice/StretchBlt, 都得自己生成 BITMAPINFO 位图头。
 
我想问的是,delphi中有特殊的bmp文件头格式,当我读出数据头,数据部分后,怎么画才会像image一样快
 
StretchBlt 是在两个设备场景进行画图,可是我手里是一堆数据怎么画啊,delphi的image控件的画图部分好像有一个graphi什么的方法读取数据,至于怎么读,怎么画我查不到
 
上面抄错了,是这个 StretchDIBits :)
在 WINDOWS 下使用 GDI 绘图还是得做成 BITMAP 格式最快了。
下面是我从内存中(不是设备环境中)绘制一个 DIB 数据时用的函数:

procedure TDIB.Draw(DC: HDC; X, Y: Integer; Stretched: Boolean = False;
DstWidth: Integer = 0; DstHeight: Integer = 0);
begin
if Stretched then
StretchDIBits(DC, X, Y, DstWidth, DstHeight, 0, 0, FWidth, FHeight,
FPBits, FPBitmapInfo^, DIB_RGB_COLORS, SRCCOPY)
else
SetDIBitsToDevice(DC, X, Y, FWidth, FHeight, 0, 0, 0, FHeight, FPBits,
FPBitmapInfo^, DIB_RGB_COLORS);
end;
 
多人接受答案了。
 
后退
顶部