求救:Image中的加载的Bmp图片非常大,如何用图片分割技术实现整幅图片的浏览?(200分)

  • 主题发起人 主题发起人 anlen
  • 开始时间 开始时间
A

anlen

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]我在form上加了一个Image控件,当Image中加载的bitmap非常大的时候,系统显示存储区域
不够,无法显示。以前好像听说过采用分割技术实现大图片的浏览,不知道具体怎么操作,
请大虾指点。//bow
 
显示100X100范围的图像:
tt:=TBitmap.Create;
tt.LoadFromFile('D:/临时/ALPHA通道/b2.bmp');
tt.Width:=100;tt.Height:=100;
Image1.Picture.Bitmap.Assign(tt);
 
int x,y;
TBitmap Bitmap = new TBitmap->creatz();
HDC MemDC = CreateCompatibleDC(GetDC (NULL));
HBITMAP HMap = Bitmap->Handle;
HBITMAP HTem = (HBITMAP)SelectObject(MemDC, HMap);
BitBlt(MemDC, 0, 0, x, y, hdc, 0, 0, SRCCOPY);
关键是BitBlt函数你想考多大就考多大非常方便.上面是我以前做过的程序
截取了一部分有,不明白的地方在问我.
 
to :胖的
你这个也是在内存里开辟一块区域,我现在有一个10000x10000的真彩色位图,
而你的内存只有256M,你怎么处理?
 
[:(] 没有人知道吗?
 
晕 只有256MB?
再买几根256的用DDR好了,这个对于图象来说好点
 
要自己对位图的文件进行操作,读入局部信息然后显示出来.
const
ClipLeft = 0; //裁剪区的左侧
ClipTop = 0; //裁剪区的上侧
ClipWidth = 100; //裁剪区的宽度
ClipHeight = 100; //裁剪区的高度
ByteCount = 3; //如果是24位色,则设3;32位设4;8位设1
var
FileHeader: TBitmapFileHeader;
InfoHeader: TBitmapInfoHeader;
Stream: TFileStream;
LocalBmp: TBitmap;
LineLen, i: Integer;
begin
Stream := TFileStream.Create(BitmapFileName,
fmOpenRead or fmShareDenyWrite);
LocalBmp := TBitmap.Create; //裁剪出来的位图
try
//读文件头
Stream.Read(FileHeader, SizeOf(TBitmapFileHeader));
Stream.Read(InfoHeader, SizeOf(TBitmapInfoHeader));

//初始化裁剪位图
LocalBmp.Width := ClipWidth;
LocalBmp.Height := ClipHeight;
LocalBmp.PixelFormat := pf24Bit;//适当设置

//读取位图信息
LineLen := (ByteCount * InfoHeader.biWidth + 3) shr 2 shl 2;
for i := ClipTop to ClipTop + ClipHeight - 1 do begin
Stream.Position := FileHeader.bfOffBits
+ LineLen * (InfoHeader.biHeight - 1 - i)
+ ByteCount * ClipLeft;
Stream.Read(LocalBmp.ScanLine[i - ClipTop]^, ClipWidth * ByteCount);
end;

//对裁剪出来的位图进行处理,我这里只是用一个Image显示出来
Image1.Picture.Bitmap.Assign(nil);
Image1.Picture.Bitmap.Assign(LocalBmp);
finally
LocalBmp.Free;
Stream.Free;
end;
end;
 
关注进展!
 
>> Stream := TFileStream.Create(BitmapFileName,
>> fmOpenRead or fmShareDenyWrite);
用文件流的方式是否可行?我觉得还是用内存映射文件方式的比较好!不受物理内存的限制
而且速度很快,获取了位图文件的头指针以后在用 StretchDIBits函数分块拷贝出来
 
只要你硬盘剩余空间足够大就可以。
 
To huazai:
文件流方式当然可以.创建文件流并不表示已把文件中的所有信息读入了内存,文件的信息
仍然保留在磁盘中,在内存中只有一个文件句柄和一个文件指针.
只有通过Stream.Read等方法尝试读文件时,才真正把文件的信息读入内存.
>>我觉得还是用内存映射文件方式的比较好!不受物理内存的限制而且速度很快
如果是一个比较大的图像,正如10000*10000*24bit的图像,文件大小有300M,假设机器有
256M内存.明显物理内存吃不消,系统只能使用虚拟内存,使用虚拟内存的代价是不断地去写
和读磁盘,众所周知,读和写磁盘的速度是相当慢的,当数据在内存和磁盘之间大量交换时,
怎么谈得上一个"快"字呢?
 
to JohnsonGuo:
同意,以后多指教,呵呵!
 
后退
顶部