直接对内存中的图像进行压缩和解压缩,不要用写道文件中的方法。(100分)

  • 主题发起人 主题发起人 lwlnic
  • 开始时间 开始时间
L

lwlnic

Unregistered / Unconfirmed
GUEST, unregistred user!
那位大虾帮我一把
 
如果是Bmp文件,可以在内存中转化成JPG的,
如果已经是JPG的,就没多大压缩余地了。
 
用TMemoryStream不久行了
 
高!真高!
 
具体说说怎么做呀?
 
如果是将BMP转换为JPEG,可以这样:
var Jpg : TJpegImage ;
Bmp : TBitMap ;
JpgStream : TMemoryStream ;
....
Bmp := TBitMap.Create;
Jpg := TJpegImage.Create;
JpgStream := TMemoryStream.Create ;
Bmp.LoadFromFile('c:/test.bmp'); // 假设从c盘中装入BMP文件。
Jpg.assign(Bmp);
Jpg.CompressionQuality := 80 ; // 0 -- 100 之间,数字越大压缩后的图
//象质量越好,但文件也相应增大。
Jpg.compress ;
// 以上两句是控制压缩后图象的质量的。如不须控制也可去掉。
Jpg.SavetoStream(JpgStream);
如另一个image控件需要压缩的结果,则:
var aJpg : TJpegImage;
aJpg := TJpegImage.create ;
aJpg.LoadFromStream(JpgStream);
 
谢!
对不起,我没有说得很清楚:
我的意思是这样的:在内存中的位图数据指针不包括文件头和位图头的信息,
仅仅是所有像素点的rgb值(因为是24位的位图),
windows从位图的左下角开(即从左到右从下到上)逐行扫描位图,将位图的像素值
一一记录下来,这些记录像素质的字节组成了位图阵列,

现在是想对这个阵列直接压缩/解压缩。
请各位各抒己见!
 
这样做有什么一一吗?
 
当然有的啦,压缩以后可以加快网上传输的速度,
直接在内存操作,也可以加快处理的速度。
 
首先.你能从内存里面直接取得图像的流吗? 如果能,用delphi自己的zlib
把流压缩就可以了.
 
我使用VC写的程序,用LPBYTE lpimage保存数据指针。
 
cakk,请说说你的想法!
 
在使用jpeg.lib库压缩中,一般是把bmp图压缩到文件中,我看到的例子中都有这句话:
step2: specify data destination(eg. a file)
jpeg_stdio_dest(&cinfo,outfile);
也就是说可以不压缩到文件中!
我找了n 多的例子,都没有找到补压缩到文件中的方法!
那伟大虾有这方面的例子呢?
 
lwlnic:
你是在做视频会议之类的东西吧,
你可以自己编写压缩代码的呀,
我以前见到过zip的控件,但不知能不能直接对内存中的数据
处理。
如果是连续视频,差分DCT效果不错的
 
yaoyao:
你也是做这个方面的吗?
我用zlib.lib压缩的方法可直接对内存中的数据进行压缩!
给我说说dct!
谢谢!
 
最好的方法是自己从Tstream 继承流
重载Read和Write方法把适时压缩和解压算法写入
 
DCT变换可以自己编写,
用差分是为了使变化原数据尽量多的为0
我没做视频会议,作过远程视频监控
 
yaoyao:
太好了,我也是做远程监控系统!可以向你请教吗?
我使用vc来编程!你呢?
 
接受答案了.
 
后退
顶部