用控件TVedioCap从摄像头截取下的图片直接由BMP压缩成JPG格式,图片文件务必在10K左右 (50分)

  • 主题发起人 主题发起人 willxue
  • 开始时间 开始时间
W

willxue

Unregistered / Unconfirmed
GUEST, unregistred user!
我从摄像头截取下来的图片默认BMP时为298K,如果直接把SingleFileName属性设成Capture.jpg时为226K,但是,我通过Acdsee压缩Capture.bmp为Capture.jpg后为10K;
请问: 有什么办法可以直接存成10K左右的jpg文件?
 
这个问题要超过 50分才可以的 :)

可以的,随便设置压缩率(默认压缩率80%是不行的)
jpg:=Tjpegimage.Create ;
jpg.compressionQuality:=20 ;
 
我有自己写的压缩算法(可以提供源代码)
封装在DLL中

bmp2jpg

不过分少了点
 
to 楼上: 这个我也懂,我要的是直接存出来,这样的话还得去把capture.bmp删掉
我想TVedioCap是否提供了相应的方法?
 
将视频转为流一定可以搞定啦!
TVedioCap控件我没有,给个我啦,一定帮你解决!
wuyaobin@21cn.com
 
同意楼上的说话,通过流进行中转,比操作文件既快又方便,多用一下流有好处。
 
动态连接库media.dll 共有7个接口,具体调用方法如下:

1.Jpg图像转换为bmp过程调用说明:

procedure jpg2bmp(const source,dest:string);far;stdcall;external’ media.dll’;
note:
//source为输入的jpg文件名,包括完整的路径;例:’d:/zqt/t1.jpg’
//dest为输出的bmp文件名,包括完整的路径;例:’d:/zqt/t1.bmp’

2.bmp图像转换为jpg过程调用说明:

procedure bmp2jpg(const source,dest:string;const quality:integer);
far;stdcall;external’ media.dll’;
note:
//source为输入的bmp文件名,包括完整的路径;例:’d:/zqt/t1.bmp’
//dest为输出的jpg文件名,包括完整的路径;例:’d:/zqt/t1.jpg’
//quality为bmp文件的压缩量,建议取50;

3.两幅bmp格式的图形合成后保存为预订的一幅bmp格式的图形(其中第二幅图的位置由程序控制):
procedure convertimage(const bmp1path:string;const bmp2path:string;
const x:integer;const y:integer;const bmp3path:string);
far;stdcall;external’ media.dll’;
note:
//bmp1path为第一副bmp图形的文件名,包括完整的路径;
//bmp2path为第二副bmp图形的文件名,包括完整的路径;
//x为第二副bmp图形的左边距,它的值不能超过第一幅图的右边界;
//y为第二副bmp图形的上边距,它的值不能超过第一幅图的下边界;
//bmp3path为合成后bmp图形的文件名,包括完整的路径;

4.在第一副图上产生由程序控制的输出文字的过程调用说明:
procedure textoutput(const bmp1path:string;const x:integer;const y:integer;
const displaytext:string);far;stdcall;external’ media.dll’;
note:
//bmp1path为要显示文字的位图文件名,包括完整路径;
//x为输出文字的左边距;
//y为输出文字的上边距;
//displaytext为要输出的文字注意取为常量字符串;






5.两幅bmp格式的图形合成后保存为预订的一幅bmp格式的图形(其中第二幅图的位置由用户用鼠标控制):
procedure mousemov(const i:integer); far;stdcall;external’ media.dll’;
note:
{当常参I=1时,该过程执行预订功能,否则I<>1时,过程中止。}

6. 视频采集:
procedure capture(phandle:Thandle); stdcall;external' media.dll ';
{提供一个控件句柄即可捕获到视频。如:panel1.Handle }

7. 提供一个完整路径的bmp或jpg文件名即可存取当前显示的画面到该文件中:
procedure savebmp(pfilename:string);stdcall;external' media.dll ';
{如:pfilename:= 'd:/lz/new1.bmp'; }
 
我曾经试验过 压缩成文件 和 流压后 直接保存到 数据库,

发觉对文件操作反而比 对流操作快 不少 , 对流操作耗费的 资源较多
所以我选择对文件操作,几乎感觉不到延时,对于 奔腾 2 以前的计算机更为有效,
你不妨试一试 。
 
to zhbj: 您说的和mfksoft好像正好相反,能谈谈流操作的方法么,我想自己试试看,多谢了
to mfksoft: 控件在家里,晚上发给你
 
willxue老兄:
能给我也发一份,找这个控件已经很久了
谢谢!
zjwyyh@163.net
 
能给我一份这个控件吗?
先谢谢了,正在学做图像捕捉!!!

lzj@sina.com
 
楼主,你当晚没寄控件给我,而我第二天就出差了呀,一个多星期才回来.这控件竟不能在D6下用.......

>我从摄像头截取下来的图片默认BMP时为298K,如果直接把SingleFileName属性
>设成Capture.jpg时为226K

这点你搞错了,无论把SingleFileName设成什么文件名,它的大小都是不会变的!你所指的298K和226K应该是把图象分辨率分别设成了352 x 288和320 x 240,这种情况下所保存的文件大小当然不同了.
以下这些代码是可以实现你的要求,jpg设为55约为10K(352x288),你可以改进一下.
代码:
//保存为bmp记得uses jpeg;
//调用示例:SaveToJpg(strtoint(Edit2.Text),'C:/TVideoCap/DEMO1/captest.jpg');
procedure SaveToJpg(Quality: Integer; FileName: string);
var
  DC: HDC;
  bmp: TBitmap;
  jpg: TJpegImage;
  W, H: Integer;
begin
  bmp:=TBitmap.Create;
  jpg:=TJpegImage.Create;
  DC:=GetDC(Main.VideoCap1.Handle);
  W:=Main.VideoCap1.BitmapInfo.bmiHeader.biWidth;
  H:=Main.VideoCap1.BitmapInfo.bmiHeader.biHeight;
  try
    jpg.PixelFormat:=jf24Bit;
    bmp.PixelFormat:=pf24bit;
    bmp.Width:=W;
    bmp.Height:=H;
    BitBlt(bmp.Canvas.Handle, 0, 0, W, H, DC, 0, 0, SRCCOPY);
    jpg.CompressionQuality:=Quality;
    jpg.Assign(bmp);
    jpg.SaveToFile(FileName);
  finally
    bmp.Free;
    jpg.Free;
    ReleaseDC(Main.VideoCap1.Handle, DC);
  end;
end;
 
接受答案了.
 
后退
顶部