表结构:
CREATE TABLE [pt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[p] [image] NULL
) GO注:q :ADOQuery.
保存图片到数据库中
procedure TForm1.savepictureClick(Sender: TObject);
var
s :string;
ms : TMemoryStream;
jpeg : TJPEGImage;
begin
s := 'delete from pt where 1=1 ';
q.Close;
q.SQL.Clear;
q.SQL.Add(s);
q.ExecSQL;
ms := TMemoryStream.Create;
jpeg := TJPEGImage.Create;
try
jpeg.Assign(cxImage2.Picture.Bitmap);
jpeg.SaveToStream(ms);
ms.Position := 0;
s := 'insert into pt(p) values(:p)';
q.Close;
q.SQL.Clear;
q.SQL.Add(s);
q.Parameters.ParamByName('p').LoadFromStream(ms,ftBlob);
//q.Parameters.ParamByName('p').Assign(cxImage2.Picture.Bitmap);
q.ExecSQL;
self.Caption := 'save';
finally
FreeAndNil(ms);
FreeAndNil(jpeg);
end;
end;
读出图片
procedure TForm1.readpictureClick(Sender: TObject);
var
s,s1 : string;
ms : TMemoryStream;
jpeg : TJPEGImage;
begin
//在添加的时候我先删除所有,只会存在一条记录所以直接取了。
s := 'select * from pt ';
with q do
begin
close;
SQL.Clear;
sql.Add(s);
open;
end;
ms := TMemoryStream.Create;
jpeg := TJPEGImage.Create;
try
{ TBlobField(q.FieldByName('p')).SaveToStream(ms);
ms.Position := 0;
jpeg.SaveToStream(ms);
cxImage1.Picture.Bitmap.Assign(jpeg);
}
//使用这个方法产生的图片只有0字节
s1 := 'c:\jzl.jpg';
TBlobField(q.FieldByName('p')).SaveToFile(s1);
cxImage1.Picture.LoadFromFile(s1); //这句会出错 finally
FreeAndNil(ms);
FreeAndNil(jpeg);
end;
end;当读取图片时出错:
---------------------------
Project1
---------------------------
JPEG error #42.
---------------------------
确定
---------------------------
请大家给看看。
CREATE TABLE [pt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[p] [image] NULL
) GO注:q :ADOQuery.
保存图片到数据库中
procedure TForm1.savepictureClick(Sender: TObject);
var
s :string;
ms : TMemoryStream;
jpeg : TJPEGImage;
begin
s := 'delete from pt where 1=1 ';
q.Close;
q.SQL.Clear;
q.SQL.Add(s);
q.ExecSQL;
ms := TMemoryStream.Create;
jpeg := TJPEGImage.Create;
try
jpeg.Assign(cxImage2.Picture.Bitmap);
jpeg.SaveToStream(ms);
ms.Position := 0;
s := 'insert into pt(p) values(:p)';
q.Close;
q.SQL.Clear;
q.SQL.Add(s);
q.Parameters.ParamByName('p').LoadFromStream(ms,ftBlob);
//q.Parameters.ParamByName('p').Assign(cxImage2.Picture.Bitmap);
q.ExecSQL;
self.Caption := 'save';
finally
FreeAndNil(ms);
FreeAndNil(jpeg);
end;
end;
读出图片
procedure TForm1.readpictureClick(Sender: TObject);
var
s,s1 : string;
ms : TMemoryStream;
jpeg : TJPEGImage;
begin
//在添加的时候我先删除所有,只会存在一条记录所以直接取了。
s := 'select * from pt ';
with q do
begin
close;
SQL.Clear;
sql.Add(s);
open;
end;
ms := TMemoryStream.Create;
jpeg := TJPEGImage.Create;
try
{ TBlobField(q.FieldByName('p')).SaveToStream(ms);
ms.Position := 0;
jpeg.SaveToStream(ms);
cxImage1.Picture.Bitmap.Assign(jpeg);
}
//使用这个方法产生的图片只有0字节
s1 := 'c:\jzl.jpg';
TBlobField(q.FieldByName('p')).SaveToFile(s1);
cxImage1.Picture.LoadFromFile(s1); //这句会出错 finally
FreeAndNil(ms);
FreeAndNil(jpeg);
end;
end;当读取图片时出错:
---------------------------
Project1
---------------------------
JPEG error #42.
---------------------------
确定
---------------------------
请大家给看看。
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('photo')).SaveToStream(mStream); //顯示的轉換為BlobFiled並保存至內存流
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;
我试过了。F7可以走完。但是一回到界面还是会出错。
---------------------------
Project1
---------------------------
JPEG error #42.
---------------------------
确定
---------------------------
to:Mrkang(谁比我菜我不愿意)
我试过了。也在网上,CSDN上找了以前的帖子。目前还没有解决。
//存储图片
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image1.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
TBlobField(FieldbyName('图片')).LoadFromStream(MS);
end;
finally
MyJPEG.Free;
end;
try
Post;
except
showmessage('数据无法提交');读取图片的代码:
if ef_adoquery.RecordCount<>0 then
begin
try
tempstream:=TmemoryStream.Create();
//将图像字段保存到流中
TBlobField(mainform.ef_ADOQuery.FieldByName('图片')).SaveToStream(tempstream);
////给留定位
tempstream.Position:=0;
//省城临时image
tempjpeg:=TJPEGImage.Create;
//存留信息
tempjpeg.LoadFromStream(tempstream);
//显示图像
Image1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
可能由于你用的不是JPG格式的,我刚才试了下,用JPG格式就不报这错,BMP格式试了下就报错,
我用的也是jpg文件。
文件的类型是:JPEG(这个信息是鼠标移动图片上时显示的。)
我用的是xp系统。就是这里的图片。
C:\WINDOWS\Help\Tours\htmlTour
比如:
q.sql.text := 'insert into pt (p) values (0x'+BufferToHexString(buffer)+')';自己写一个BufferToHexString,将一块Buffer转成16进制数字字符串。这块buffer可以用TStringStream代替,还可以用zlib的TCompressionStream压缩后传输。经过实际应用经验,压缩后百多k的数据用这个方法没有问题。读取的话用网上泛滥的那种解决方案也就是用TBlobStream即可。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
testStream:TMemoryStream;
begin
//保存图片到SQL SERVER 2000 数据库中 格式为 .JPG
if not Assigned(Image1.Picture.Graphic) then exit;
try
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('delete from test');
ExecSQL; testStream := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(testStream); Close;
SQL.Clear;
SQL.Add('Insert into test (photo) values (:photo)');
Parameters.ParamByName('photo').LoadFromStream(testStream,ftBlob);
ExecSQL;
end;
finally
testStream.Free;
END;
end;
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
//读取数据库中的.JPG图片显示在界面上
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from test ');
Open;
if not FieldByName('photo').IsNull then begin ;
mStream:=TMemoryStream.Create ;
JpgFile:=TjpegImage.Create ;
TBlobField(FieldByName('photo')).SaveToStream(mStream);
mStream.Position :=0;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture :=nil;
end;
end;
end;