- 浏览: 2074254 次
- 性别:
- 来自: 厦门
-
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
转自:http://hi.baidu.com/xa110/blog/item/bc6bb6cb4c683d1bbe09e6b1.html
下面通过详细的例子来讲述如何在delphi中处理sql server中的image、text字段。因为实际开发的需要, 我们需要处理的是text类型的字段,包括读和写。网上很多相关的文章都是讲述的对image的读写操作,下面首先介绍如何将图象存储在sql server的image字段。
其中 DataMConn为一个针对数据库操作的单元,放置一个ADOConnection,一个ADOQuery //image to database
procedure TfrmText.Button1Click(Sender: TObject);
var
bm:tbitmap;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
bm:=TBitmap.Create;
bm.Assign(image1.Picture.Bitmap);
bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//show image
procedure TfrmText.Button2Click(Sender: TObject);
var
Stream:TStream;
bm:tbitmap;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');
Try
Open;
stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
bm:=TBitmap.Create;
bm.LoadFromStream(stream);
image2.Picture.bitmap.Assign(bm);
stream.Free;
except
begin
ShowMessage('Error!');
Exit;
end;
end;//try
end;
end;
下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str
//text to stream
procedure TfrmText.Button3Click(Sender: TObject);
var
str : WideString;
ss:TStringStream;
i : integer;
begin
str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';
for i := 1 to 10000 do
begin
str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr'; //43万多个字节
end;
str := str + 'E';
ss := TStringStream.Create(str);
//bm:=TBitmap.Create;
//bm.Assign(image1.Picture.Bitmap);
//bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//read text to a TDBMemo
procedure TfrmText.Button4Click(Sender: TObject);
var
stream : TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
stream.Position := 0;
AMemo.Lines.LoadFromStream(stream);
stream.Free;
end;
end;
end;
//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ks
procedure TfrmText.Button5Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); //Make room for the buffer's null terminator.
Buffer := AllocMem(MemSize); //Allocate the memory.
try
Stream.Read(Buffer^, MemSize); //Read TempPackage field into buffer.
str := Buffer;
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
end;
end;
其中 DataMConn为一个针对数据库操作的单元,放置一个ADOConnection,一个ADOQuery //image to database
procedure TfrmText.Button1Click(Sender: TObject);
var
bm:tbitmap;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
bm:=TBitmap.Create;
bm.Assign(image1.Picture.Bitmap);
bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//show image
procedure TfrmText.Button2Click(Sender: TObject);
var
Stream:TStream;
bm:tbitmap;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');
Try
Open;
stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
bm:=TBitmap.Create;
bm.LoadFromStream(stream);
image2.Picture.bitmap.Assign(bm);
stream.Free;
except
begin
ShowMessage('Error!');
Exit;
end;
end;//try
end;
end;
下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str
//text to stream
procedure TfrmText.Button3Click(Sender: TObject);
var
str : WideString;
ss:TStringStream;
i : integer;
begin
str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';
for i := 1 to 10000 do
begin
str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr'; //43万多个字节
end;
str := str + 'E';
ss := TStringStream.Create(str);
//bm:=TBitmap.Create;
//bm.Assign(image1.Picture.Bitmap);
//bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//read text to a TDBMemo
procedure TfrmText.Button4Click(Sender: TObject);
var
stream : TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
stream.Position := 0;
AMemo.Lines.LoadFromStream(stream);
stream.Free;
end;
end;
end;
//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ks
procedure TfrmText.Button5Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); //Make room for the buffer's null terminator.
Buffer := AllocMem(MemSize); //Allocate the memory.
try
Stream.Read(Buffer^, MemSize); //Read TempPackage field into buffer.
str := Buffer;
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
end;
end;
如何用流的方法向SQLServer数据库中读写blob的image字段
var
TempStream: TMemoryStream;
begin
//Read
TempStream := TMemoryStream.Create;
try
TBlobField(FieldByName('ImageField')).SaveToStream;
TempStream.Position := 0;
Memo1.Lines.LoadFromStream(TempStream);
Finally
TempStream.Free;
end;
//Write
TempStream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(TempStream);
//Image1.Picture.Bitmap.LoadFromStream(TempStream);
TBlobField(FieldByName('ImageField')).LoadFromStream;
Finally
TempStream.Free;
end;
end;
var
aStream1 : TStream;
jpg : tjpegimage; //在uses 加入 jpeg,db 单元
插入
jpg := tjpegimage.Create();
try
dm.Query_image.open;
dm.query_image.insert;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'),bmReadWrite);
jpg.LoadFromFile(name);
jpg.SaveToStream(aStream1);
aStream1.Free;
dm.query_image.Post;
finally
jpg.Free;
end;
取出
if dm.query_image.State <> dsBrowse then exit;
if dm.query_image.FieldByName('content').IsNull then Exit; //判断状态,content是我表里存放jpeg的field
dm.query_image.open;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'), bmRead);
try
aStream1.Position := 0;
jpg:= tjpegimage.Create();
try
jpg.LoadFromStream(aStream1);
jpg.SaveToFile(ipath); //ipath:string 存放路径与文件名
finally
jpg.Free;
end;
finally
aStream1.Free;
end;
end;
文件写入字段:
SQLstr:='INSERT INTO 表名 (...,Image字段名,...)VALUES (...,:Image,...)';
Query.SQL.Add(SQLstr);
Query.SQL.ParamByName('Image').LoadFromFile(图象文件名);
Query.ExecSQL;
从字段写入文件:
SQLstr:='SELECT ...,Image字段名,... FROM 表名 WHERE...';
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQLstr);
Query.Open;
(Query.FieldByName(Image字段名) as TBlobField).SaveToFile(文件名);
//或TBlobField(Query.FieldByName(Image字段名)).SaveToFile(文件名);
TempStream: TMemoryStream;
begin
//Read
TempStream := TMemoryStream.Create;
try
TBlobField(FieldByName('ImageField')).SaveToStream;
TempStream.Position := 0;
Memo1.Lines.LoadFromStream(TempStream);
Finally
TempStream.Free;
end;
//Write
TempStream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(TempStream);
//Image1.Picture.Bitmap.LoadFromStream(TempStream);
TBlobField(FieldByName('ImageField')).LoadFromStream;
Finally
TempStream.Free;
end;
end;
var
aStream1 : TStream;
jpg : tjpegimage; //在uses 加入 jpeg,db 单元
插入
jpg := tjpegimage.Create();
try
dm.Query_image.open;
dm.query_image.insert;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'),bmReadWrite);
jpg.LoadFromFile(name);
jpg.SaveToStream(aStream1);
aStream1.Free;
dm.query_image.Post;
finally
jpg.Free;
end;
取出
if dm.query_image.State <> dsBrowse then exit;
if dm.query_image.FieldByName('content').IsNull then Exit; //判断状态,content是我表里存放jpeg的field
dm.query_image.open;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'), bmRead);
try
aStream1.Position := 0;
jpg:= tjpegimage.Create();
try
jpg.LoadFromStream(aStream1);
jpg.SaveToFile(ipath); //ipath:string 存放路径与文件名
finally
jpg.Free;
end;
finally
aStream1.Free;
end;
end;
文件写入字段:
SQLstr:='INSERT INTO 表名 (...,Image字段名,...)VALUES (...,:Image,...)';
Query.SQL.Add(SQLstr);
Query.SQL.ParamByName('Image').LoadFromFile(图象文件名);
Query.ExecSQL;
从字段写入文件:
SQLstr:='SELECT ...,Image字段名,... FROM 表名 WHERE...';
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQLstr);
Query.Open;
(Query.FieldByName(Image字段名) as TBlobField).SaveToFile(文件名);
//或TBlobField(Query.FieldByName(Image字段名)).SaveToFile(文件名);
向SQL Server插入带有Image字段的记录
向SQL Server插入记录相信大家都会做,但是如果表中带有Image字段就不好弄了,这里有一个例子,非常安全,同时也向大家展示动态生成控件的技巧!
在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
openpicturedialog1.execute;
image1.picture.loadfromfile(openpicturedialog1.filename);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
graphic1:Timage;
begin
graphic1:=Timage.Create(self);
graphic1.picture.loadfromfile(openpicturedialog1.filename);
table1.Open;
table1.insert;
table1.fieldbyname(’id’).asstring:=’121’;
table1.fields[1].assign(graphic1.Picture);
table1.post;
table1.close;
graphic1.free;
end;
显示可用:
DBIMAGE控件显示!
在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
openpicturedialog1.execute;
image1.picture.loadfromfile(openpicturedialog1.filename);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
graphic1:Timage;
begin
graphic1:=Timage.Create(self);
graphic1.picture.loadfromfile(openpicturedialog1.filename);
table1.Open;
table1.insert;
table1.fieldbyname(’id’).asstring:=’121’;
table1.fields[1].assign(graphic1.Picture);
table1.post;
table1.close;
graphic1.free;
end;
显示可用:
DBIMAGE控件显示!
DELPHI存取JPEG文件到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;
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;
![发贴心情](http://www.oebiz.com/bbs/skins/Default/topicface/face1.gif)
var
Ind,i:Integer;
FName:string;
AJPeg:TJPEGImage;
temp:TBitmap;
begin
if opd1.Execute then
begin
btnAdd.Enabled:=False;
Ind:=Opd1.Files.Count;
for i:=0 to Ind-1 do
begin
FName:=opd1.Files.Strings;
Application.ProcessMessages;
tbl1.Append;
tblPictureName.AsString:=FName;
if UpperCase(Copy(FName,Length(Fname)-3,4))=’.JPG’ then
begin
AJpeg:=TJPEGImage.Create;
AJpeg.LoadFromFile(FName);
Temp:=TBitmap.Create;
Image1.Height:=Ajpeg.Height;
Image1.Width:=Ajpeg.Width;
Image1.Picture:=nil;
Image1.Canvas.Draw(0,0,Ajpeg);
DBImage1.Picture:=Image1.Picture;
AJpeg.Free;
end
else
tblPicture.LoadFromFile(FName);
tbl1.Post;
end;
end;
说明:
tbl1:TADOQuery;
opd1:TOpenPictureDialog;
tblPicture是tbl1的字段,OLE型。
uses
JPEG;
Ind,i:Integer;
FName:string;
AJPeg:TJPEGImage;
temp:TBitmap;
begin
if opd1.Execute then
begin
btnAdd.Enabled:=False;
Ind:=Opd1.Files.Count;
for i:=0 to Ind-1 do
begin
FName:=opd1.Files.Strings;
Application.ProcessMessages;
tbl1.Append;
tblPictureName.AsString:=FName;
if UpperCase(Copy(FName,Length(Fname)-3,4))=’.JPG’ then
begin
AJpeg:=TJPEGImage.Create;
AJpeg.LoadFromFile(FName);
Temp:=TBitmap.Create;
Image1.Height:=Ajpeg.Height;
Image1.Width:=Ajpeg.Width;
Image1.Picture:=nil;
Image1.Canvas.Draw(0,0,Ajpeg);
DBImage1.Picture:=Image1.Picture;
AJpeg.Free;
end
else
tblPicture.LoadFromFile(FName);
tbl1.Post;
end;
end;
说明:
tbl1:TADOQuery;
opd1:TOpenPictureDialog;
tblPicture是tbl1的字段,OLE型。
uses
JPEG;
![发贴心情](http://www.oebiz.com/bbs/skins/Default/topicface/face1.gif)
一、 原理介绍--流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:
1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create('');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,
然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给
TDBImage.Picture.Bitmap。
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create('');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,
然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给
TDBImage.Picture.Bitmap。
BMP格式转化为JPEG格式uses Jpeg;
procedure CopyBmpToJpeg(BmpFile,JpegFile:string);
var
Bmp:TBitmap;
Jpeg:TJPEGImage;
begin
Bmp:=TBitmap.create;
Jpeg:= TJpegImage.Create;
try
Bmp.LoadFromFile(BmpFile);
Jpeg.Assign(Bmp);
Jpeg.SaveToFile(JpegFile);
finally
Bmp.Free;
Jpeg.Free;
end;
end;
2003-10-7 14:28:34 图片缩放Var B:Tbitmap; //临时位图
Begin
B:=Tbitmap.Create; //建立临时位图
B.Assign(YourBitmap); //采用相同色彩深度
With B do
Begin
Width:=90; //临时位图的大小为90x90
Height:=90;
End;
B.canvas.StretchDraw(B.canvas.Cliprect,YourBitmap); //缩放适应
B.SavetoFile(YourFileName); //保存
B.Free;
End; //搞定
procedure CopyBmpToJpeg(BmpFile,JpegFile:string);
var
Bmp:TBitmap;
Jpeg:TJPEGImage;
begin
Bmp:=TBitmap.create;
Jpeg:= TJpegImage.Create;
try
Bmp.LoadFromFile(BmpFile);
Jpeg.Assign(Bmp);
Jpeg.SaveToFile(JpegFile);
finally
Bmp.Free;
Jpeg.Free;
end;
end;
2003-10-7 14:28:34 图片缩放Var B:Tbitmap; //临时位图
Begin
B:=Tbitmap.Create; //建立临时位图
B.Assign(YourBitmap); //采用相同色彩深度
With B do
Begin
Width:=90; //临时位图的大小为90x90
Height:=90;
End;
B.canvas.StretchDraw(B.canvas.Cliprect,YourBitmap); //缩放适应
B.SavetoFile(YourFileName); //保存
B.Free;
End; //搞定
JPEG和BMP同时存入,两种不同的方法,文件流和内存流procedure TForm1.Button1Click(Sender: TObject);
var
fs:TFileStream;
MS: TMemoryStream;
Bmp:TBitmap;
MYJpeg:TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
if ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' then
begin
Bmp:=TBitmap.create;
MYJpeg:= TJpegImage.Create;
MS:=TMemoryStream.create;
try
Bmp.LoadFromFile(OpenPictureDialog1.FileName);
with MYJpeg do
begin
Assign(Bmp);
MS.Position:=0;
SaveToStream(MS);
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(MS);
Table1.Post;
end;
finally
Bmp.Free;
MYJpeg.Free;
MS.Free;
end;
end
else
begin
fs:=TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);
Try
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(fs);
Table1.Post;
Finally
fs.free;
end;
end;
end;
2003-11-13 21:03:18 图片的缩放procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;
if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;
//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);
with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);
nb.Free;
end;
b.Free;
end;
var
fs:TFileStream;
MS: TMemoryStream;
Bmp:TBitmap;
MYJpeg:TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
if ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' then
begin
Bmp:=TBitmap.create;
MYJpeg:= TJpegImage.Create;
MS:=TMemoryStream.create;
try
Bmp.LoadFromFile(OpenPictureDialog1.FileName);
with MYJpeg do
begin
Assign(Bmp);
MS.Position:=0;
SaveToStream(MS);
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(MS);
Table1.Post;
end;
finally
Bmp.Free;
MYJpeg.Free;
MS.Free;
end;
end
else
begin
fs:=TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);
Try
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(fs);
Table1.Post;
Finally
fs.free;
end;
end;
end;
2003-11-13 21:03:18 图片的缩放procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;
if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;
//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);
with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);
nb.Free;
end;
b.Free;
end;
下面通过详细的例子来讲述如何在delphi中处理sql server中的image、text字段。因为实际开发的需要, 我们需要处理的是text类型的字段,包括读和写。网上很多相关的文章都是讲述的对image的读写操作,下面首先介绍如何将图象存储在sql server的image字段。
其中 DataMConn为一个针对数据库操作的单元,放置一个ADOConnection,一个ADOQuery //image to database
procedure TfrmText.Button1Click(Sender: TObject);
var
bm:tbitmap;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
bm:=TBitmap.Create;
bm.Assign(image1.Picture.Bitmap);
bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//show image
procedure TfrmText.Button2Click(Sender: TObject);
var
Stream:TStream;
bm:tbitmap;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');
Try
Open;
stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
bm:=TBitmap.Create;
bm.LoadFromStream(stream);
image2.Picture.bitmap.Assign(bm);
stream.Free;
except
begin
ShowMessage('Error!');
Exit;
end;
end;//try
end;
end;
下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str
//text to stream
procedure TfrmText.Button3Click(Sender: TObject);
var
str : WideString;
ss:TStringStream;
i : integer;
begin
str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';
for i := 1 to 10000 do
begin
str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr'; //43万多个字节
end;
str := str + 'E';
ss := TStringStream.Create(str);
//bm:=TBitmap.Create;
//bm.Assign(image1.Picture.Bitmap);
//bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//read text to a TDBMemo
procedure TfrmText.Button4Click(Sender: TObject);
var
stream : TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
stream.Position := 0;
AMemo.Lines.LoadFromStream(stream);
stream.Free;
end;
end;
end;
//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ks
procedure TfrmText.Button5Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); //Make room for the buffer's null terminator.
Buffer := AllocMem(MemSize); //Allocate the memory.
try
Stream.Read(Buffer^, MemSize); //Read TempPackage field into buffer.
str := Buffer;
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
end;
end;
其中 DataMConn为一个针对数据库操作的单元,放置一个ADOConnection,一个ADOQuery //image to database
procedure TfrmText.Button1Click(Sender: TObject);
var
bm:tbitmap;
ms:TMemoryStream;
begin
ms:=TMemoryStream.Create;
bm:=TBitmap.Create;
bm.Assign(image1.Picture.Bitmap);
bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO Package(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ms,ftBlob);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//show image
procedure TfrmText.Button2Click(Sender: TObject);
var
Stream:TStream;
bm:tbitmap;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Package WHERE packageID= ''aaaaa''');
Try
Open;
stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
bm:=TBitmap.Create;
bm.LoadFromStream(stream);
image2.Picture.bitmap.Assign(bm);
stream.Free;
except
begin
ShowMessage('Error!');
Exit;
end;
end;//try
end;
end;
下面的两个例子是如何处理text类型的字段,其中读取的时候,利用了一个TDBMemo控件,来加载读取的流数据,然后赋值给一个WideString类型的变量str
//text to stream
procedure TfrmText.Button3Click(Sender: TObject);
var
str : WideString;
ss:TStringStream;
i : integer;
begin
str := 'sstrstrststrstrststrstrstrsttrstrstrrstrstr';
for i := 1 to 10000 do
begin
str := str + 'sstrstrststrstrststrstrstrsttrstrstrrstrstr'; //43万多个字节
end;
str := str + 'E';
ss := TStringStream.Create(str);
//bm:=TBitmap.Create;
//bm.Assign(image1.Picture.Bitmap);
//bm.SaveToStream(ms);
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO tPackage(PackageID,TempPackage) VALUES(:x,:y)');
Parameters.ParamByName('y').LoadFromStream(ss,ftMemo);
Parameters.ParamByName('x').Value := 'aaaaa';
ExecSQL;
end;
end;
//read text to a TDBMemo
procedure TfrmText.Button4Click(Sender: TObject);
var
stream : TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
stream.Position := 0;
AMemo.Lines.LoadFromStream(stream);
stream.Free;
end;
end;
end;
//下面是把text字段的数据内容直接读到一个WideString中,而不通过TDBMemo,因为在实际中,不知道何种原因,线程读到数据后,只能在第一次处理时正常,然后再用鼠标点应用程序,程序就停了……who knows the reason , pls tell me & 3ks
procedure TfrmText.Button5Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TStream;
str : WideString;
begin
with DataMConn.ADOQHistory do
begin
Close;
SQL.Clear;
SQL.Add('SELECT TempPackage FROM tPackage WHERE packageID= ''aaaaa''');
Open;
if not IsEmpty then
begin
Stream := DataMConn.ADOQHistory.CreateBlobStream(FieldByName('TempPackage'),bmRead);
try
MemSize := Stream.Size;
Inc(MemSize); //Make room for the buffer's null terminator.
Buffer := AllocMem(MemSize); //Allocate the memory.
try
Stream.Read(Buffer^, MemSize); //Read TempPackage field into buffer.
str := Buffer;
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
end;
end;
如何用流的方法向SQLServer数据库中读写blob的image字段
var
TempStream: TMemoryStream;
begin
//Read
TempStream := TMemoryStream.Create;
try
TBlobField(FieldByName('ImageField')).SaveToStream;
TempStream.Position := 0;
Memo1.Lines.LoadFromStream(TempStream);
Finally
TempStream.Free;
end;
//Write
TempStream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(TempStream);
//Image1.Picture.Bitmap.LoadFromStream(TempStream);
TBlobField(FieldByName('ImageField')).LoadFromStream;
Finally
TempStream.Free;
end;
end;
var
aStream1 : TStream;
jpg : tjpegimage; //在uses 加入 jpeg,db 单元
插入
jpg := tjpegimage.Create();
try
dm.Query_image.open;
dm.query_image.insert;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'),bmReadWrite);
jpg.LoadFromFile(name);
jpg.SaveToStream(aStream1);
aStream1.Free;
dm.query_image.Post;
finally
jpg.Free;
end;
取出
if dm.query_image.State <> dsBrowse then exit;
if dm.query_image.FieldByName('content').IsNull then Exit; //判断状态,content是我表里存放jpeg的field
dm.query_image.open;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'), bmRead);
try
aStream1.Position := 0;
jpg:= tjpegimage.Create();
try
jpg.LoadFromStream(aStream1);
jpg.SaveToFile(ipath); //ipath:string 存放路径与文件名
finally
jpg.Free;
end;
finally
aStream1.Free;
end;
end;
文件写入字段:
SQLstr:='INSERT INTO 表名 (...,Image字段名,...)VALUES (...,:Image,...)';
Query.SQL.Add(SQLstr);
Query.SQL.ParamByName('Image').LoadFromFile(图象文件名);
Query.ExecSQL;
从字段写入文件:
SQLstr:='SELECT ...,Image字段名,... FROM 表名 WHERE...';
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQLstr);
Query.Open;
(Query.FieldByName(Image字段名) as TBlobField).SaveToFile(文件名);
//或TBlobField(Query.FieldByName(Image字段名)).SaveToFile(文件名);
TempStream: TMemoryStream;
begin
//Read
TempStream := TMemoryStream.Create;
try
TBlobField(FieldByName('ImageField')).SaveToStream;
TempStream.Position := 0;
Memo1.Lines.LoadFromStream(TempStream);
Finally
TempStream.Free;
end;
//Write
TempStream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(TempStream);
//Image1.Picture.Bitmap.LoadFromStream(TempStream);
TBlobField(FieldByName('ImageField')).LoadFromStream;
Finally
TempStream.Free;
end;
end;
var
aStream1 : TStream;
jpg : tjpegimage; //在uses 加入 jpeg,db 单元
插入
jpg := tjpegimage.Create();
try
dm.Query_image.open;
dm.query_image.insert;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'),bmReadWrite);
jpg.LoadFromFile(name);
jpg.SaveToStream(aStream1);
aStream1.Free;
dm.query_image.Post;
finally
jpg.Free;
end;
取出
if dm.query_image.State <> dsBrowse then exit;
if dm.query_image.FieldByName('content').IsNull then Exit; //判断状态,content是我表里存放jpeg的field
dm.query_image.open;
aStream1 := dm.query_image.CreateBlobStream(dm.query_image.FieldByName('content'), bmRead);
try
aStream1.Position := 0;
jpg:= tjpegimage.Create();
try
jpg.LoadFromStream(aStream1);
jpg.SaveToFile(ipath); //ipath:string 存放路径与文件名
finally
jpg.Free;
end;
finally
aStream1.Free;
end;
end;
文件写入字段:
SQLstr:='INSERT INTO 表名 (...,Image字段名,...)VALUES (...,:Image,...)';
Query.SQL.Add(SQLstr);
Query.SQL.ParamByName('Image').LoadFromFile(图象文件名);
Query.ExecSQL;
从字段写入文件:
SQLstr:='SELECT ...,Image字段名,... FROM 表名 WHERE...';
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQLstr);
Query.Open;
(Query.FieldByName(Image字段名) as TBlobField).SaveToFile(文件名);
//或TBlobField(Query.FieldByName(Image字段名)).SaveToFile(文件名);
向SQL Server插入带有Image字段的记录
向SQL Server插入记录相信大家都会做,但是如果表中带有Image字段就不好弄了,这里有一个例子,非常安全,同时也向大家展示动态生成控件的技巧!
在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
openpicturedialog1.execute;
image1.picture.loadfromfile(openpicturedialog1.filename);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
graphic1:Timage;
begin
graphic1:=Timage.Create(self);
graphic1.picture.loadfromfile(openpicturedialog1.filename);
table1.Open;
table1.insert;
table1.fieldbyname(’id’).asstring:=’121’;
table1.fields[1].assign(graphic1.Picture);
table1.post;
table1.close;
graphic1.free;
end;
显示可用:
DBIMAGE控件显示!
在SQL Server中建立TEST表,两个字段,id varchar(10),photo image(16);
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
openpicturedialog1.execute;
image1.picture.loadfromfile(openpicturedialog1.filename);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
graphic1:Timage;
begin
graphic1:=Timage.Create(self);
graphic1.picture.loadfromfile(openpicturedialog1.filename);
table1.Open;
table1.insert;
table1.fieldbyname(’id’).asstring:=’121’;
table1.fields[1].assign(graphic1.Picture);
table1.post;
table1.close;
graphic1.free;
end;
显示可用:
DBIMAGE控件显示!
DELPHI存取JPEG文件到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;
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;
![发贴心情](http://www.oebiz.com/bbs/skins/Default/topicface/face1.gif)
var
Ind,i:Integer;
FName:string;
AJPeg:TJPEGImage;
temp:TBitmap;
begin
if opd1.Execute then
begin
btnAdd.Enabled:=False;
Ind:=Opd1.Files.Count;
for i:=0 to Ind-1 do
begin
FName:=opd1.Files.Strings;
Application.ProcessMessages;
tbl1.Append;
tblPictureName.AsString:=FName;
if UpperCase(Copy(FName,Length(Fname)-3,4))=’.JPG’ then
begin
AJpeg:=TJPEGImage.Create;
AJpeg.LoadFromFile(FName);
Temp:=TBitmap.Create;
Image1.Height:=Ajpeg.Height;
Image1.Width:=Ajpeg.Width;
Image1.Picture:=nil;
Image1.Canvas.Draw(0,0,Ajpeg);
DBImage1.Picture:=Image1.Picture;
AJpeg.Free;
end
else
tblPicture.LoadFromFile(FName);
tbl1.Post;
end;
end;
说明:
tbl1:TADOQuery;
opd1:TOpenPictureDialog;
tblPicture是tbl1的字段,OLE型。
uses
JPEG;
Ind,i:Integer;
FName:string;
AJPeg:TJPEGImage;
temp:TBitmap;
begin
if opd1.Execute then
begin
btnAdd.Enabled:=False;
Ind:=Opd1.Files.Count;
for i:=0 to Ind-1 do
begin
FName:=opd1.Files.Strings;
Application.ProcessMessages;
tbl1.Append;
tblPictureName.AsString:=FName;
if UpperCase(Copy(FName,Length(Fname)-3,4))=’.JPG’ then
begin
AJpeg:=TJPEGImage.Create;
AJpeg.LoadFromFile(FName);
Temp:=TBitmap.Create;
Image1.Height:=Ajpeg.Height;
Image1.Width:=Ajpeg.Width;
Image1.Picture:=nil;
Image1.Canvas.Draw(0,0,Ajpeg);
DBImage1.Picture:=Image1.Picture;
AJpeg.Free;
end
else
tblPicture.LoadFromFile(FName);
tbl1.Post;
end;
end;
说明:
tbl1:TADOQuery;
opd1:TOpenPictureDialog;
tblPicture是tbl1的字段,OLE型。
uses
JPEG;
![发贴心情](http://www.oebiz.com/bbs/skins/Default/topicface/face1.gif)
一、 原理介绍--流式数据的类型及其应用
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:
在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,
如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、
TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中
2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据
实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法
为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题
第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,
而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了
图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5
中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显
示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在
该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却
是以JPEG格式保存的。
(二)相应的解决方法
为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Bina
ry Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上
是以二进制数据的形式存放的。为了处理BLOB字段,可以借鉴一些可视的桌面数据库的
方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,
大大提高运行效率。
具体的过程和相关的程序代码如下:
1、如何实现在Microsoft Access数据库中的图像存储:
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create('');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,
然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给
TDBImage.Picture.Bitmap。
这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。
下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式
的中间桥梁的作用。
2、如何将图像从Microsoft Access数据库中取出并显示出来:
下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create('');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,
然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,
并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的
数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage
这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能
通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给
TDBImage.Picture.Bitmap。
BMP格式转化为JPEG格式uses Jpeg;
procedure CopyBmpToJpeg(BmpFile,JpegFile:string);
var
Bmp:TBitmap;
Jpeg:TJPEGImage;
begin
Bmp:=TBitmap.create;
Jpeg:= TJpegImage.Create;
try
Bmp.LoadFromFile(BmpFile);
Jpeg.Assign(Bmp);
Jpeg.SaveToFile(JpegFile);
finally
Bmp.Free;
Jpeg.Free;
end;
end;
2003-10-7 14:28:34 图片缩放Var B:Tbitmap; //临时位图
Begin
B:=Tbitmap.Create; //建立临时位图
B.Assign(YourBitmap); //采用相同色彩深度
With B do
Begin
Width:=90; //临时位图的大小为90x90
Height:=90;
End;
B.canvas.StretchDraw(B.canvas.Cliprect,YourBitmap); //缩放适应
B.SavetoFile(YourFileName); //保存
B.Free;
End; //搞定
procedure CopyBmpToJpeg(BmpFile,JpegFile:string);
var
Bmp:TBitmap;
Jpeg:TJPEGImage;
begin
Bmp:=TBitmap.create;
Jpeg:= TJpegImage.Create;
try
Bmp.LoadFromFile(BmpFile);
Jpeg.Assign(Bmp);
Jpeg.SaveToFile(JpegFile);
finally
Bmp.Free;
Jpeg.Free;
end;
end;
2003-10-7 14:28:34 图片缩放Var B:Tbitmap; //临时位图
Begin
B:=Tbitmap.Create; //建立临时位图
B.Assign(YourBitmap); //采用相同色彩深度
With B do
Begin
Width:=90; //临时位图的大小为90x90
Height:=90;
End;
B.canvas.StretchDraw(B.canvas.Cliprect,YourBitmap); //缩放适应
B.SavetoFile(YourFileName); //保存
B.Free;
End; //搞定
JPEG和BMP同时存入,两种不同的方法,文件流和内存流procedure TForm1.Button1Click(Sender: TObject);
var
fs:TFileStream;
MS: TMemoryStream;
Bmp:TBitmap;
MYJpeg:TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
if ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' then
begin
Bmp:=TBitmap.create;
MYJpeg:= TJpegImage.Create;
MS:=TMemoryStream.create;
try
Bmp.LoadFromFile(OpenPictureDialog1.FileName);
with MYJpeg do
begin
Assign(Bmp);
MS.Position:=0;
SaveToStream(MS);
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(MS);
Table1.Post;
end;
finally
Bmp.Free;
MYJpeg.Free;
MS.Free;
end;
end
else
begin
fs:=TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);
Try
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(fs);
Table1.Post;
Finally
fs.free;
end;
end;
end;
2003-11-13 21:03:18 图片的缩放procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;
if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;
//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);
with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);
nb.Free;
end;
b.Free;
end;
var
fs:TFileStream;
MS: TMemoryStream;
Bmp:TBitmap;
MYJpeg:TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
if ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' then
begin
Bmp:=TBitmap.create;
MYJpeg:= TJpegImage.Create;
MS:=TMemoryStream.create;
try
Bmp.LoadFromFile(OpenPictureDialog1.FileName);
with MYJpeg do
begin
Assign(Bmp);
MS.Position:=0;
SaveToStream(MS);
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(MS);
Table1.Post;
end;
finally
Bmp.Free;
MYJpeg.Free;
MS.Free;
end;
end
else
begin
fs:=TFileStream.Create(OpenPictureDialog1.FileName,fmOpenRead);
Try
Table1.Edit;
TBlobField(Table1.FieldByName('ZGZP')).LoadFromStream(fs);
Table1.Post;
Finally
fs.free;
end;
end;
end;
2003-11-13 21:03:18 图片的缩放procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;
if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;
//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);
with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);
nb.Free;
end;
b.Free;
end;
发表评论
-
form打开时的关闭代码
2011-10-25 20:29 1595摘自:http://topic.csdn.n ... -
TUpdateSQL更新问题 提示Update Failed
2011-08-29 20:26 1249摘自:http://topic.csdn.net/u/200 ... -
图解如何用Eurekalog跟踪程序错误
2011-08-12 07:28 952图解如何用Eurekalog跟踪程序错误 摘自:h ... -
VirtualBox 复制VDI 并能创建新的虚拟机
2011-07-21 11:14 2756摘自:http://www.nonabyte.net/how- ... -
截获所有异常 不报错
2011-07-12 16:52 1250摘自:http://media.ccidnet.c ... -
delphi exe程序以及DLL程序如何在模块内部获得各自的路径
2011-07-11 16:38 1315delphi Exe程序以及DLL程序如何在模块内部获得各自的 ... -
Delphi文本文件读写
2011-07-11 14:55 1271Delphi文本文件读写 (2008-10-31 1 ... -
Delphi自定义的消息的使用
2011-05-31 14:12 2326阅:已验证,可通过; 摘自:http://blog.1 ... -
怎么查看OutputDebugString输出的信息?debugview
2011-05-25 16:02 3844网上很多说用debugview查看,我自己写了一个程序,里面用 ... -
Delphi里查看该变量的内存值
2011-05-25 13:32 1141Delphi里查看该变量的内存值:Run==>Evalu ... -
注册表操作 写入autorun启动项,键值为本程序的全路径
2011-05-20 15:40 1837procedure TForm4.Button2Click ... -
报说包frx7和frxdb7都包含了某个单元的错误
2011-05-11 09:59 10481. 问题描述:在安装FastReport3的时候,安装到- ... -
Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
2011-05-03 14:34 1475摘自:http://blog.csdn.net/g ... -
WM_USER的说明 用户消息ID
2011-04-28 10:46 1701WM_USER 摘自:http://baike.bai ... -
ToolButton不能改变大小
2011-04-28 10:38 3473问题描述:ToolButton不能改变大小? 问 ... -
Delphi里TOOLBAR 上的button的caption为什么显示不出来啊
2011-04-20 17:55 1785Delphi里TOOLBAR 上的button的caption ... -
delphi指针简单入门
2011-04-11 21:42 1164摘自:http://topic.csdn.net/t/2003 ... -
Delphi中paramstr的用法 应用程序间传递数据
2011-04-01 14:33 2123Delphi中paramstr的用法 应用程序间传递数据 ... -
Delphi中的THashedStringList对象 --大数据量时
2011-04-01 13:54 5171Delphi中的THashedStringLi ... -
inherited Create(AOwner); 和直接写inherited有区别吗
2011-03-26 15:44 1332摘自:http://zhidao.baidu.com/que ...
相关推荐
### Java读取SQL Server Image字段知识点详解 #### 一、背景与目的 在数据库应用开发过程中,经常会遇到需要存储图片等二进制数据的情况。SQL Server 提供了`IMAGE`类型来存储大容量的二进制数据。然而,如何有效地...
而在SQL SERVER中,IMAGE字段同样用于存储大块的二进制数据,但在SQL SERVER 2005及以后的版本中已被废弃,取而代之的是VARBINARY(MAX)。 要完成这种迁移,我们需要遵循以下步骤: 1. **数据准备**:确保ORACLE...
2. **读取数据库中的Image字段** - 使用`SqlConnection`连接到SQL Server数据库。 - 创建一个`SqlCommand`对象,设置SQL查询语句,如:`SELECT ImageField FROM TableName WHERE Id = @Id`。 - 添加参数(如`@Id`...
python 通过adodbapi读写sqlserver image字段类型。
SQL Server 中 Image 类型数据导出到 Oracle 的 CLOB 字段中 在进行数据库迁移或数据交换时,需要将不同数据库管理系统之间的数据类型进行转换。在本文中,我们将讨论如何将 SQL Server 中的 Image 类型数据导出到 ...
在使用Delphi进行数据库开发时,经常会遇到与SQL Server中的二进制字段类型"image"交互的情况。"image"字段通常用于存储大容量的二进制数据,如图片、文档或任何其他非文本数据。本篇文章将深入探讨如何在Delphi中...
C#操作SQL Server中的Image类型数据 C#操作SQL Server中的Image类型数据 C#操作SQL Server中的Image类型数据 C#操作SQL Server中的Image类型数据 详细介绍请参考: ...
本篇文章将深入探讨如何在SQL Server中对`Image`对象进行操作,包括插入、查询、更新和删除等基本操作,以及优化策略和注意事项。 1. **插入Image数据** 要向数据库表中插入`Image`类型的值,你需要使用`INSERT`...
在SQL Server 2000及之前版本中,用于存储BLOB数据的字段类型是`image`,而在2005及以上版本中,这个角色由`varbinary(MAX)`接替。 `image`字段类型在SQL Server 2000中用于存储任何长度的二进制数据,最大可达2^31...
易写的从SQL SERVER 中导出image 类型文件到本地
一、存储图像到SQL Server的Image字段 1. **准备图像数据** 首先,你需要将图像文件读取为字节数组。可以使用`System.Drawing.Image`类加载图像,并通过`Save`方法将其转换为字节数组。例如: ```csharp using ...
#### 知识点一:SQL Server 2005 数据库操作 1. **数据库选择**: ```sql use ecard_boc; ``` 这行代码指定了将要使用的数据库名为`ecard_boc`。 2. **变量声明**: ```sql declare @name varchar(30); ...
这里需要注意的是,由于`Image`类型在SQL Server 2005之后被推荐替换为`varbinary(max)`,因此在新项目中最好使用`varbinary(max)`。它的使用方式与`Image`类似,但提供了更大的灵活性。 至于标签中提到的其他技术...
### SQL Server 常用字段类型详解 在数据库设计与管理中,选择合适的字段类型对于数据的存储效率、查询性能以及数据完整性至关重要。SQL Server 提供了丰富的数据类型,覆盖了从基本数值到复杂文本、图像等各类数据...
在 Java 中,对数据库的操作需要通过 JDBC(Java Database Connectivity)来实现,而在 JDBC 中,需要将 SQL Server 的数据类型映射到 Java 中的数据类型。下面将详细介绍 SQL Server 数据库类型对应 Java 中的数据...
String url = "jdbc:sqlserver://localhost:1433;databaseName=myDatabase"; String username = "myUsername"; String password = "myPassword"; Connection conn = DriverManager.getConnection(url, username,...
本程序完整地写出了将客户端的图片上传至服务器后再存储到服务器上的sqlserver数据库上,然后再从数据库中读出由response对象的binarywrite方法显示到客户端的浏览器上。中间的技术是需要将图像文件转成字节流上传到...
直接在数据字段中保存与读取图片文件,比较方便应用数据库软件编写。
"sqlserver-image图片导出"这个话题涉及到如何从SQL Server数据库中提取并保存这些图像数据到本地文件系统。下面我们将深入探讨这个过程,以及可能遇到的相关知识点。 1. **BLOB数据类型**: SQL Server中的`image...
在SQL Server数据库中,"image"数据...通过以上步骤,我们可以创建一个工具,从SQL Server的"image"类型字段中导出图片到本地硬盘。尽管"image"类型已不再推荐使用,但理解如何处理遗留系统中的这种数据仍然是必要的。