var
FStream:TStream;
Buffer:Word;
FStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
FStream.ReadBuffer(Buffer,2);
FStream.Position:=0;
if Buffer=$4D42 then
begin
//BMP
end
else if Buffer=$D8FF then
begin
//JPEG
end
else if Buffer=$4947 then
begin
//GIF
end
else if Buffer=$050A then
begin
//PCX
end
else if Buffer=$5089 then
begin
//PNG
end
else if Buffer=$4238 then
begin
//PSD
end
else if Buffer=$A659 then
begin
//RAS
end
else if Buffer=$DA01 then
begin
//SGI
end
else if Buffer=$4949 then
begin
//TIFF
end
else
解决数据库中图片的问题,关键技术如下:
在数据库上使用Image二进制字段保存,使用Stream流的方式。
创建文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
保存到数据库的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
从数据库读取文件到本地硬盘:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
释放文件流:
Word_FileStream.Free;
Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。...
既然你已经用TDBImage控件使用Picture.LoadFromFile装入了图片,
只要该图片字段和TDBimage控件相连了,直接用adodataset.post,就保存到了
数据库。
如果没有相连,可以直接用
Tblobfield(adodataset.fields[字段名]).loadfromfile
从文件中读,或
Tblobfield(adodataset.fields[字段名]).loadfromstream
从stream中读,
要读出该字段内容,用相应的savetofile,savetostream就行了
注意如果是jpeg图片,要引用 jpeg单元,即: uses jpeg;
综合以上,既能识别bmp又识别读jpeg,我把代码修改如下:
(建议用image,不要用dbimage控件,因为该控件只能识别bmp格式图片)
(程序已调试,运行正确 delphi7 + sql server 2000)
我的数据库是这样的:
id varchar(50)
name varchar(50)
pic image(16)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
DBImage1: TDBImage;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses DateUtils,jpeg;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
close;
SQL.Text:= 'select * from Tpic';
ADOQuery1.Open;
end;
//DBImage1.DataSource:= DataSource1;
//DBImage1.DataField:= 'pic';
end;
//显示
procedure TForm1.Button1Click(Sender: TObject);
var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
head: word;
const
bmp = $4D42;
jpeg = $D8FF;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create;
aStream:= TMemoryStream.Create;
try
TBlobField(ADOQuery1.FieldByName('pic')).SaveToStream(aStream);
aStream.Position := 0; //一定要有这句
aStream.Read(head,2);
aStream.Position:= 0;
if head = bmp then
begin
aBitmap.LoadFromStream(aStream);
Image1.Picture.Assign(aBitmap);
end
else if head = jpeg then
begin
aJPEGImage.LoadFromStream(aStream);
Image1.Picture.Assign(aJPEGImage);
end;
finally
aBitmap.Free;
aJPEGImage.Free;
aStream.Free;
end;
end;
//添加
procedure TForm1.Button2Click(Sender: TObject);
var
aBitmap: TBitmap;
aJPEGImage: TJPEGImage;
aStream: TStream;
begin
aBitmap:= TBitmap.Create;
aJPEGImage:= TJPEGImage.Create;
aStream:= TMemoryStream.Create;
try
if OpenDialog1.Execute then
begin
if ExtractFileExt(OpenDialog1.FileName)= '.bmp'then
begin
aBitmap.LoadFromFile(OpenDialog1.FileName);
aBitmap.SaveToStream(aStream);
end
else if (ExtractFileExt(OpenDialog1.FileName)= '.jpg') or (ExtractFileExt(OpenDialog1.FileName)= '.jpeg') then
begin
aJPEGImage.LoadFromFile(OpenDialog1.FileName);;
aJPEGImage.SaveToStream(aStream);
end;
with ADOQuery1 do
begin
Append;
aStream.Position:= 0;
TBlobField(FieldByName('pic')).LoadFromStream(aStream);//出错的地方:原来是因为我用了dbimage控件,该控件只能显示bmp格式图片
Post;
end;
end;
finally
aBitmap.Free;
aJPEGImage.Free;;
aStream.Free;
end;
end;
end.
来自:lisongmagic, 时间:2007-3-10 13:39:53, ID:3679497 | 编辑
图片问题 。
主要有两种思路:
1。图片文件保存到数据库:这种方法是将图片文件以二进制形式保存。这种方法不但可以保存图片还可以保存电影啊优点:保密性强;致命缺点:如果图片很多会造成数据库臃肿。
2。保存图片的绝对路径
这种方法只是保存文件的绝对路径到数据库,在访问时读取路径然后。。
优点:简单,快速 缺点:保密问题比较突出(误操作等)
建议: 如果图片数量不是很大建议内部保存
用DBImage控件只能显示bmp图像,一个图像用bmp格式要用0.5M-几M空间,jpeg格式只有几十至几百kB。如果图片较多,用DBImage控件显示,其程序大小是个问题。
一个程序保密要性强,也要考虑安装问题,保存图片的绝对路径,是否考虑安装的盘符。
强烈建议:用jpeg格式图像,数据库内部保存,image显示。