将JPEG文件(和数据)保存到数据库的一个误区(200分)

  • 主题发起人 主题发起人 donkey
  • 开始时间 开始时间
D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我查了一下BBS关于保存JPEG文件到数据库的帖子
保存Jpeg文件到数据库的代码通常如下:
var
img:TJPEGImage;
......
begin
img:=TJpegImage.Create;
Img.LoadFormFile(filename);
ADOTable1.Edit;
DbImage1.Picture.Graphic.Assign(img);
ADOTable1.Post;
end;

不知各位大侠注意到没有,本来将jpeg文件而不是BMP文件保存到数据库的
目的是为了节省存储空间,缩短调用时间,但是上面代码使数据库迅速增大,
我把一个70K的Jpeg文件保存到数据库,结果增大600k,增加一个JPeg文件,
就等比例增大大约600k。

请问各位:
怎样保存jpeg文件到数据库才能即节省空间又方便显示?
 
不直接将图片保存入数据库表,
而是只保存图片文件的文件名,
在DataSet的相关事件中动态载入,
具体什么的事件就看你的需要了.
 
还有就是直接将JPG图片文件做为一个文件流写到一个BLOB字段中,
这样就是直接保存成JPEG格式了,但使用与前述一样,也得自己写相关事件
 
我发现了一个问题,不知是不是我的access出了问题?
当我插入图片时(图片57k * 3),数据库大小成倍增加(400k-4100k),
但是删除所有纪录后,数据库大小竟然不减小(4100k),
这是为什么?
 
to Tide_Liu:
在Access中,记录删除后,记录原来占的空间不会自动释放,所以大小没有减下来。
这时候就要压缩数据库了!这样空间就释放了。关于压缩你可以查查已答问题,很多的。

Btw:
搭车问问题不太好吧?
 
放心,一定送分的!
刚才回答我的关于dialog的initialdir的问题上我会再加分的!
我只是想起一个问一个!多谢!
 
>>放心,一定送分的!

不是分的问题,如果是你开的贴子,你是不是愿意别人在上面讨论些不相关的东西?
将心比心,我想这只是对别人的一种尊重。
上大富翁的人大多数是为解决问题,大家都是在相互帮助,可能你不知道而我知道的
我回答了你,但是我不知道而你知道的,你也可以回答我。大富翁上的分数除了显示你帮
助别人的多少外能有什么用?同样的问题,那怕你开的是零分的贴也会有人回答的。因为
大家都在互相帮助!
 
OK!小弟知道了!
刚来,不动规矩,还请老兄多多提携才是!
下次一定不敢了!
 
我已经可以把JPEG文件保存到Access里了,而且数据库文件的大小大约只增加80k/图,
但是无法在FastReport中显示出错。
保存代码如下:
procedure SavePicture(img:TImage);
var
JPGImg: TJPEGImage;
ADOData: TADOBlobStream;
begin
JPGImg := TJPEGImage.Create;
ADOData :=
TADOBlobStream.Create(TBlobField(DataModule1.PatientInfoTable.FieldByName('图像1')), bmWrite);
try
JPGImg.Assign(img.Picture.Bitmap);
JpgImg.SaveToStream(ADOData);
finally
JPgImg.Free;
ADOData.Free;
end;
end;

读取代码如下:
procedure LoadPicture(img: TImage);
var
PicFieldName: string;
PicData: TADOBlobStream;
Pic: TJPEGImage;
begin
case img.Tag of
0: PicFieldName := '图像1';
1: PicFieldName := '图像2';
2: PicFieldName := '图像3';
3: PicFieldName := '图像4';
end;
if not DataModule1.PatientInfoTable.FieldByName(PicFieldName).isNUll then
begin
PicData :=
TADOBlobStream.Create(TBlobField(DataModule1.PatientInfoTable.FieldByName(PicFieldName)), bmRead);
//重点在下面
pic := TJPEGImage.Create;
try
pic.LoadFromStream(PicData);
img.Picture.Assign(pic);
finally
PicData.Free;
pic.Free;
end;
end
else
img.Picture.Assign (nil);
end;

各位可有什么好建议?意见?
 
Sorry,我只会QrReport
如果是Qr可以在DetailBand的BeforePrint事件中将Img付给一个QrImage!
我想FastReport可能与之类似吧?
 
它是支持JPEG格式的。
我下午还看了它的源代码,读取的方法和我的差不多,暂时没有发现原因
to 杜宝:
改用FastReport吧,非常好用的,功能极其强大,而且有源代码,我就根据我的
要求改了源代码。
 
接受答案了.
 
后退
顶部