紧急求助:怎样将JPG图片存入数据表字段中?(100分)

  • 主题发起人 主题发起人 无名爱好者
  • 开始时间 开始时间

无名爱好者

Unregistered / Unconfirmed
GUEST, unregistred user!
在利用DBIMAGE控件将图片存入数据表中时,发现只能保存BMP图片,不能保存JPG图片,
我编写如下代码进行保存时没有错误提示,但实际没有将JPG图片保存到:
dbimage1.Picture.Graphic:=TJPEGImage.Create;
dbimage1.Picture.LoadFromFile('d:/bird.jpg');
[?][?][?]
 
引用 JPEG单元即可
 
我用的是DELPHI 6.0,没看到有JPEG单元?
 
在use 声明中加入JPEG
 
TBlobField(DsPersonal.DataSet.FieldByName('Emp_Photo')).LoadFromFile(OpenPictureDlg.FileName);
OpenPictureDlg是TOpenPictureDlg控件﹗試試很爽的﹗
 
多谢humanc2d4指点,我先试一下再给答覆!
 
to:humanc2d4
在声明中加入JPEG后,运行不会出错,但图片未保存到相应字段中,不知何故,请继续指点!
to:mark_du
按照你的代码,运行时会出现错误:"Bitmap image is not valid"
 
1)存储jpg图片
procedure TMainForm.btnYesClick(Sender: TObject);
var
MyJPEG: TJPEGImage;
MS: TMemoryStream;
begin
MyJpeg := TJpegImage.Create;
try
MyJpeg.Assign(image1.Picture.Graphic)
Ms := TMeMoryStream.Create;
MyJpeg.SaveToStream(Ms);
Ms.Position := 0;

adoqrytest.Edit;
adoqrytest['id'] := '1';
TBlobField(adoqrytest.FieldByName('picture')).LoadFromStream(MS);
adoqrytest.Post;
finally
MyJpeg.Free;
Ms.Free;
end;
end;
2)读取jpg图片
procedure TMainForm.FormShow(Sender: TObject);
var
tempStream: TStringStream;
tempJpeg: TJpegImage;
begin
try
tempStream := TStringStream.Create('');
TBlobField(adoqrytest.FieldByName('picture')).SaveToStream(tempStream);
tempJpeg := TJpegImage.Create;
tempJpeg.LoadFromStream(tempStream);
tempstream.position:=0
DBImage1.Picture.Bitmap.Assign(tempJpeg);
finally
tempStream.Free;
tempJpeg.Free;
end;
end;
 
TBlobField(DsPersonal.DataSet.FieldByName('Emp_Photo')).LoadFromFile(OpenPictureDlg.FileName);
应该是没问题的,你在使用前同样要Uses JPEG,因为OpenPictureDlg默认并不认识JPG...
 
//加载目标
procedure TForm1.btnTargetClick(Sender: TObject);
var
sFileName:String;

function BlobContentToString(const FileName:String):String;
begin
with TFileStream.Create(FileName,fmOpenRead) do
try
SetLength(Result,Size);
Read(Pointer(Result)^,Size);
finally
Free;
end;
end;
begin
if (OpenDialog1.Execute) then
begin
sFileName:=OpenDialog1.FileName;
ADODataSet1.Edit;
ADODataSet1.FieldByName('PicInfo').AsString:=
BlobContentToString(sFileName);
ADODataSet1.Post;
end;
end;

//显示Blob内容
procedure TForm1.btnShowBlobsClick(Sender: TObject);
var
sFileName:String;
BS:TADOBlobStream;
begin
BS:=TADOBlobStream.Create(TBlobField(ADODataSet1.FieldByName('PicInfo')),bmRead);
try
sFileName:=ExtractFilePath(Application.ExeName)+'tmpBlob';
sFileName:=sFileName + '.' + ADODataSet1.FieldByName('PicInfo').AsString;
BS.SaveToFile(sFileName);
OleContainer1.CreateObjectFromFile(sFileName,False);
finally
BS.Free;
end;
end;

end.
 
to:美国提子、昱昱
我按照你们的代码,用ADO连接SQL 7.0数据库,运行时也会出现错误提示:
"Bitmap image is not valid"
我的完整测试代码如下,请继续指点:
unit photops;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, DBCtrls, DB, ADODB, ExtDlgs,jpeg;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
DataSource1: TDataSource;
DBImage1: TDBImage;
DBNavigator1: TDBNavigator;
BitBtn1: TBitBtn;
OpenPictureDialog1: TOpenPictureDialog;
OpenDialog1: TOpenDialog;
procedure BitBtn1Click(Sender: TObject);

private
// function BlobContentToString(const FileName:String):String;

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation
var
sFileName:String;

function BlobContentToString(const FileName:String):String;
begin
with TFileStream.Create(FileName,fmOpenRead) do
try
SetLength(Result,Size);
Read(Pointer(Result)^,Size);
finally
Free;
end;
end;

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
adotable1.Open;
opendialog1.Filter:='*.jpg|*.jpg';
if (OpenDialog1.Execute) then
begin
sFileName:=OpenDialog1.FileName;
ADOtable1.Insert;
ADOtable1.FieldByName('photo').AsString:=BlobContentToString(sFileName);
adotable1.Post;
end;

end;
end.
 
to:美国提子
按照你的代码,可以保存JPG图片了,谢谢!但读取图片到DBIMAGE控件中时按你的代码运行会出现如下错误提示:
"Project phototest.exe raised exception class EJEPG with message 'JPEG error #41'"
能否再指点一下!!
 
我的方法只是針對JPG格式的圖片﹗
"Bitmap image is not valid"這個錯誤的原因是你打開的文件是BMP的原故﹗
如果只是存入JPG的話﹐我的方法絕對可行﹐并且代碼簡短﹗速度也比較快﹗
如果不是要求同時存入BMP與JPG格式的圖片的話﹐不需要用流﹗
我試過DFW以前的方法﹐但好像都有些問題﹗
 
美国提子:
图片保存问题是帮我解决了,但保存后用DBIMAGE控件显示图片仍不行,大虾,帮人帮到底嘛!分数一定会给你的!
 
to:mark_du
我需要的可以让用户自行选择BMP图片或JPG图片,所以会发现上述问题,我会再试一下。
 
这可能是DBIMAGE不支持JPEG格式,
那只有用IMAGE控件。
先把数据库中的图片保存到硬盘中,再从硬盘加载到IMAGE。
或把数据库中的图片保存成内存流,再从内存流加载到IMAGE。
应该可以
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部