在线等,散分啦!SQL数据库能不能存JPG格式图片?如何做啊??

xjb258 2003-08-21 05:37:48
在线等,散分啦!SQL数据库能不能存JPG格式图片?如何做啊??
...全文
107 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
DELPHI存取JPEG文件到SQL Server数据库
                           高红岩(ghyghost)
 
  近日笔者书写一个小型的学生管理系统时,需要用到ADO控件存取SQL Server数据库图片,查看资料发现基本都是针对BMP文件进行操作(巨增数据库大小),但发现了★eagletian★高手翻译的ADO英文技术文档,里面涉及到了数据库存取JPEG文件的关键技术,在win98+sql server桌面版中测试通过,运行良好,现于源码公开如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB,jpeg, StdCtrls,dbtables;
{一定要USES JPEG单元,使能存储JPG文件格式}
type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Image1: TImage;
savebutton: TButton;
showbutton: TButton;
OpenDialog1: TOpenDialog;
ADOQuery1id: TIntegerField;
ADOQuery1pic: TBlobField;
procedure savebuttonClick(Sender: TObject);
procedure showbuttonClick(Sender: TObject);
procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function JpegStartsInBlob(PicField:TBlobField):integer;
var
ghy: TADOBlobstream;
buffer:Word;
hx: string;
begin
Result := -1;
ghy := TADOBlobstream.Create(PicField, bmRead);
try
while (Result = -1) and (ghy.Position + 1 < ghy.Size) do
begin
ghy.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
ghy.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := ghy.Position - 2
else if hx = 'FF' then
ghy.Position := ghy.Position-1;
end; //if
end; //while
finally
ghy.Free
end; //try
end;


procedure TForm1.savebuttonClick(Sender: TObject);
var
picstream:tadoblobstream;
begin
adoquery1.edit;
picstream:=tadoblobstream.Create(tblobfield(adoquery1.fields[1]),bmWrite);
if form1.opendialog1.execute then
begin
picstream.LoadFromFile(opendialog1.filename);
picstream.Position:=0;
adoquery1.edit;
tblobfield(adoquery1.Fields[1]).loadfromstream(picstream);
adoquery1.post;
end;


end;

procedure TForm1.showbuttonClick(Sender: TObject);
var
ghy:TADOBlobstream;
pic:tjpegimage;
begin
ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
try
ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(ghy);
Image1.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
ghy.Free
end;
end;

procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
if button in [nbFirst, nbPrior, nbNext, nbLast] then showbutton.Click;
end;

end.

如果数据库中要存储的是BMP文件,则在procedure TForm1.showbuttonClick(Sender: TObject);过程中代码更改如下即可存储显示BMP文件格式的操作。
procedure TForm1.showbuttonClick(Sender: TObject);
var
ghy:TADOBlobstream;
pic:tbitmap;
begin
ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
try
{ ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);}
Pic:=Tbitmap.Create;
try
Pic.LoadFromStream(ghy);
Image1.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
ghy.Free
end;
end;
  到此用DELPHI存取JPEG文件到SQL Server数据库中的具体操作已经叙述完毕。
zhptj 2003-09-27
  • 打赏
  • 举报
回复
好文

xah_JD 2003-09-27
  • 打赏
  • 举报
回复
DBinmage,不是就能吗
jiangshi99 2003-09-26
  • 打赏
  • 举报
回复
gz
happy20032003 2003-09-26
  • 打赏
  • 举报
回复
当然可以,up
hmily1688 2003-09-26
  • 打赏
  • 举报
回复
数据库类型设为Image类型,var
ms: TStringStream;
File_Type: string;
begin
if not (Shy_qry.eof and Shy_qry.bof) then
begin
ms := TStringStream.Create('');
OpenPictureDialog1.InitialDir := sm_directory;
if (OpenPictureDialog1.Execute) and (trim(OpenPictureDialog1.filename) <> '') then
begin
File_Type := ExtractFileExt(OpenPictureDialog1.filename);
if UpperCase(File_Type) <> '.JPG' then
begin
OpenPictureDialog1.Filename := BmpToJpg(OpenPictureDialog1.filename);
end;
Image1.picture.loadfromfile(OpenPictureDialog1.filename);
Image1.Picture.Graphic.SaveToStream(ms);
if not (Shy_qry.State in [dsedit, dsinsert]) then
begin
Shy_qry.Edit;
end;
Shy_qry.Fieldbyname('photo_type').AsString := Copy(OpenPictureDialog1.filename, length(OpenPictureDialog1.filename) - 2, 3);
Ms.Position := 0;
(Shy_Qry.Fieldbyname('photo') as Tblobfield).LoadFromStream(ms);
if Shy_Qry.State in [dsedit] then
begin
Shy_qry.Post;
end;
end;
ms.Free;
end
else
begin
Application.MessageBox('请先输入数据再提取照片!', '错误', MB_ICONSTOP + MB_OK);
end;
end;
delphiseabird 2003-09-26
  • 打赏
  • 举报
回复
存路径把,在varchar字段里存路径!
bales 2003-09-26
  • 打赏
  • 举报
回复
我的方法:
//将图片格式均转换为jpg进行存入。
pjpg:=TJpegImage.Create;
if extractfileext(openpicture1.dialog.filename)='.bmp' then
pjpg.assign(Carimage.picture.bitmap)
else
if (extractfileext(openpicture1.dialog.filename)='.jpg') or (extractfileext(openpicture1.dialog.filename)='.jpeg') then
pjpg.assign(carimage.picture)
else
exit;
try
pic:=TMemoryStream.Create;
pjpg.SaveToStream(pic);
pic.Position:=0;
TBlobField(DM.CarQuery.fieldbyname ('照片')).LoadFromStream(pic);

finally
pic.Free;
pjpg.free;bmp1.free;
end;

//读取时

try
pjpg:=tjpegimage.Create;
pic:=TMemoryStream.Create;
TBlobField(DM.CarQuery.fieldbyname ('照片')).savetoStream(pic);
if pic.Size=0 then
exit;
pic.position:=0;
pjpg.LoadFromStream(pic);
Carimage.picture.assign(pjpg);
finally
pjpg.Free ;
pic.Free ;
end;
微雪缤纷 2003-08-25
  • 打赏
  • 举报
回复
qwertyasd(昊) 的方法就行。
chinasg 2003-08-25
  • 打赏
  • 举报
回复
BMP 那么大的文件,不合适存储!
XXSingle 2003-08-25
  • 打赏
  • 举报
回复
把jpg格式转成Bmp图片格式再保存,就不会有错了
koma2003 2003-08-25
  • 打赏
  • 举报
回复
网上有很多例子啊
  • 打赏
  • 举报
回复
ado 好像不行
  • 打赏
  • 举报
回复
我用delphi6 + sqlserver 2000 为什么 不能存 jpg格式?
提示“invalid bitmap file format”
kejian 2003-08-23
  • 打赏
  • 举报
回复
delphi 7开始Timage控件不是支持很多图像格式吗?

====================================================================

像和尚的唐僧。。。

====================================================================
bales 2003-08-22
  • 打赏
  • 举报
回复
其实可以把bmp和JPG综合一下呀,最好的方法是把bmp都转换成jpg,然后存进去。读取也很方便。。
d983074 2003-08-22
  • 打赏
  • 举报
回复
如果对图像质量损耗不在乎,可以把非jpg文件格式的图片转换成jpg格式再存入
这样,显示时就不需要分类处理显示,但导出文件时需要再根据要求转换
d983074 2003-08-22
  • 打赏
  • 举报
回复
直接用普通对话框,把文件后缀名也存入数据库,
取出时先判断图片类型,根据类型分类处理

bales 2003-08-22
  • 打赏
  • 举报
回复
qwertyasd(昊) :

你所写的,就只能存取JPG格式的图像。但是在打开图像对话框中,如果在你这种情况下选择BMP格式的就会出错。如果要改成存取BMP格式则又得修改上面的图片类型,那有没有就是不管你的图像是什么格式,就可以很方便地存取进数据库??
Goxu 2003-08-21
  • 打赏
  • 举报
回复
如把字段Text数据类型设成Image
TBlobField(FieldByName('text')).LoadFromFile(‘c;\a.jpg’);
加载更多回复(3)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧