如何存取图片到sql server图片格式最好是jpg的。 DBIMage好象不能直接支持JPG格式?! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用流来解决,然后判断流的起始标识符号,然后建立相应的显示图片的类,最后将图片转入到DBImage即可! unit Ffactwin;interfaceuses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, DBCtrls, DBGrids, DB, DBTables, Buttons, Grids, ExtCtrls, Menus, ExtDlgs, Dialogs;type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; DBLabel1: TDBText; DBMemo1: TDBMemo; DataSource1: TDataSource; Table1: TTable; Table1Common_Name: TStringField; Table1Graphic: TBlobField; DBGrid1: TDBGrid; BitBtn1: TBitBtn; Table1Category: TStringField; Table1SpeciesName: TStringField; Table1Lengthcm: TFloatField; Table1Length_In: TFloatField; Table1Notes: TMemoField; ImageFish: TImage; PopupMenuImage: TPopupMenu; MenuImageLoad: TMenuItem; N2: TMenuItem; MenuImageConvertBitmap: TMenuItem; MenuImageConvertGIF: TMenuItem; MenuImageConvertJPEG: TMenuItem; OpenPictureDialog: TOpenPictureDialog; procedure DataSource1DataChange(Sender: TObject; Field: TField); procedure MenuImageConvertBitmapClick(Sender: TObject); procedure MenuImageConvertGIFClick(Sender: TObject); procedure MenuImageConvertJPEGClick(Sender: TObject); procedure MenuImageLoadClick(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure UpdateField(Graphic: TGraphic); public end;var Form1: TForm1;implementation{$R *.DFM}uses GIFImage, JPEG, ClipBrd;{ Paradox graphic BLOB header - from db.pas }type TGraphicHeader = record Count: Word; { Fixed at 1 } HType: Word; { Fixed at $0100 } Size: Longint; { Size not including header } end; TGraphicHack = class(TGraphic); TGraphicHackClass = class of TGraphicHack; TImageSignature = record ImageType: TGraphicClass; Name: string; Signature: string; end;const Signatures: array[0..2] of TImageSignature = ((ImageType: TBitmap; Name: 'Bitmap'; Signature: 'BM'), (ImageType: TGIFImage; Name: 'GIF'; Signature: 'GIF'), (ImageType: TJPEGImage; Name: 'JPEG'; Signature: chr($FF)+chr($D8)+chr($FF)+chr($E0)+chr($00)+chr($10)+'JFIF'));procedure TForm1.FormCreate(Sender: TObject);begin Table1.Open;end;procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);var Stream : TStream; Size : integer; Header : TGraphicHeader; Signature : pointer; i : integer; Image : TGraphic; Name : string;begin if ((Field <> nil) and (Field <> Table1Graphic)) or (Table1Graphic.DataSet.State <> dsBrowse) then exit; Image := nil; // Database cursor has moved - Update image Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmRead); try // Skip paradox image header Size := Stream.Size; if (Size >= SizeOf(TGraphicHeader)) then begin Stream.Read(Header, SizeOf(Header)); if (Header.Count <> 1) or (Header.HType <> $0100) or (Header.Size <> Size - SizeOf(Header)) then Stream.Seek(-SizeOf(Header), soFromCurrent); end; try // Determine image type from file signature for i := low(Signatures) to high(Signatures) do begin if (length(Signatures[i].Signature) > Size) then continue; // Read signature GetMem(Signature, length(Signatures[i].Signature)); try Stream.Read(Signature^, length(Signatures[i].Signature)); // Reposition stream cursor Stream.Seek(-length(Signatures[i].Signature), soFromCurrent); // Compare signatures if (CompareMem(Signature, @Signatures[i].Signature[1], length(Signatures[i].Signature))) then begin Image := TGraphicHackClass(Signatures[i].ImageType).Create; Name := Signatures[i].Name; break; end; finally Freemem(Signature); end; end; // Force TImage to desired graphic type ImageFish.Picture.Graphic := Image; // Load image from stream if (ImageFish.Picture.Graphic <> nil) then begin ImageFish.Picture.Graphic.LoadFromStream(Stream); Caption := format('FISH FACTS - %s image, %d bytes', [Name, Size]); end else Caption := 'FISH FACTS'; finally Image.Free; end; finally Stream.Free; end;end;// Write the specified image to the BLOB fieldprocedure TForm1.UpdateField(Graphic: TGraphic);var Stream : TStream; Header : TGraphicHeader;begin Table1Graphic.DataSet.Edit; Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmWrite); try // TBitmaps are saved in a special format which is compatible with // the TDBImage component... if (Graphic is TBitmap) and ((Table1Graphic.DataType = ftGraphic) or (Table1Graphic.DataType = ftTypedBinary)) then begin Stream.Write(Header, SizeOf(Header)); Graphic.SaveToStream(Stream); Header.Count := 1; Header.HType := $0100; Header.Size := Stream.Position - SizeOf(Header); Stream.Position := 0; Stream.Write(Header, SizeOf(Header)); end else // ...all other image formats are just saved to the BLOB stream Graphic.SaveToStream(Stream); finally Stream.Free; end; Table1Graphic.DataSet.Refresh;end;procedure TForm1.MenuImageConvertBitmapClick(Sender: TObject);var Bitmap : TBitmap;begin Bitmap := TBitmap.Create; try Bitmap.Assign(ImageFish.Picture.Graphic); UpdateField(Bitmap); finally Bitmap.Free; end;end;procedure TForm1.MenuImageConvertGIFClick(Sender: TObject);var GIF : TGIFImage;begin GIF := TGIFImage.Create; try GIF.ColorReduction := rmQuantize; GIF.DitherMode := dmFloydSteinberg; GIF.Assign(ImageFish.Picture.Graphic); UpdateField(GIF); finally GIF.Free; end;end;procedure TForm1.MenuImageConvertJPEGClick(Sender: TObject);var JPEG : TJPEGImage; Bitmap : TBitmap;begin JPEG := TJPEGImage.Create; try // TJPEGImage can only assign from TBitmap and TJPEGImage, so we // need to convert the TGIFImage to a TBitmap before it can be // converted to a TJPEGImage if (ImageFish.Picture.Graphic is TGIFImage) then begin Bitmap := TBitmap.Create; try Bitmap.Assign(ImageFish.Picture.Graphic); JPEG.Assign(Bitmap); finally Bitmap.Free; end; end else JPEG.Assign(ImageFish.Picture.Graphic); JPEG.CompressionQuality := 80; JPEG.Compress; UpdateField(JPEG); finally JPEG.Free; end;end;procedure TForm1.MenuImageLoadClick(Sender: TObject);begin if (OpenPictureDialog.Execute) then begin ImageFish.Picture.LoadFromFile(OpenPictureDialog.FileName); UpdateField(ImageFish.Picture.Graphic); end;end;end. 用二进制方式打开文件,直接写入数据库,字段类型也是Image的。 谢谢星星农场,不过你用的是TABLE控件,我特别说了,我不用TABLE控件,我用的是QUERY,我想知道为什么把TSTREAM类通过QUERY.PARAMABYNAME.LOADSTREAM装入后执行SQL就报错。 可以式式Query1.Params[n].ASBlob:=Buffer;或Query1.Params[n].LoadfromStream;再不行就Query1.Params[n].setBolbData;应该都可以注意要把Query1.Params[n].DataType设成你的类型,比如ftBlob或ftGraphic 我已经解决问题,程序如下:use jpegvar tp_stream: tmemorystream;begin tp_stream.create; query1.close; ......... image.picture.savetostream(tp_stream); query1.parambyname(':变量名').loadstream:=tp_stream; query1.sql.execsql; query1.close;end; 上面的程序有敲错的地方,大家在DELPHI里会自动给出的。 delphi中Edit1输入数值更新SQL表中某一字段类型为money label的显示 关于三层连接的速度问题 用Query组件连接SQL数据库 sql语句问题 喜欢打格斗的人一定要来看哦~~~ (: 我是菜鸟,想问有关如何编写控制执行程序 如何更改IdUDPServer的监听端口? 从Tpanel继承一个组件,其中用到的一个组件有onbuttonclick事件,我怎样在我的组件中发布这个事件 这是一个相对来说比较难的问题(对我而言),望能得到大虾的指点! 怎样改写TForm的Create过程,使其能传递一个自己的参数。 用TQuickRep控件如何显示多行文本?
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, StdCtrls, DBCtrls, DBGrids, DB, DBTables, Buttons, Grids, ExtCtrls,
Menus, ExtDlgs, Dialogs;type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
DBLabel1: TDBText;
DBMemo1: TDBMemo;
DataSource1: TDataSource;
Table1: TTable;
Table1Common_Name: TStringField;
Table1Graphic: TBlobField;
DBGrid1: TDBGrid;
BitBtn1: TBitBtn;
Table1Category: TStringField;
Table1SpeciesName: TStringField;
Table1Lengthcm: TFloatField;
Table1Length_In: TFloatField;
Table1Notes: TMemoField;
ImageFish: TImage;
PopupMenuImage: TPopupMenu;
MenuImageLoad: TMenuItem;
N2: TMenuItem;
MenuImageConvertBitmap: TMenuItem;
MenuImageConvertGIF: TMenuItem;
MenuImageConvertJPEG: TMenuItem;
OpenPictureDialog: TOpenPictureDialog;
procedure DataSource1DataChange(Sender: TObject; Field: TField);
procedure MenuImageConvertBitmapClick(Sender: TObject);
procedure MenuImageConvertGIFClick(Sender: TObject);
procedure MenuImageConvertJPEGClick(Sender: TObject);
procedure MenuImageLoadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure UpdateField(Graphic: TGraphic);
public
end;var
Form1: TForm1;implementation{$R *.DFM}uses
GIFImage,
JPEG,
ClipBrd;{ Paradox graphic BLOB header - from db.pas }type
TGraphicHeader = record
Count: Word; { Fixed at 1 }
HType: Word; { Fixed at $0100 }
Size: Longint; { Size not including header }
end; TGraphicHack = class(TGraphic);
TGraphicHackClass = class of TGraphicHack; TImageSignature = record
ImageType: TGraphicClass;
Name: string;
Signature: string;
end;const
Signatures: array[0..2] of TImageSignature
= ((ImageType: TBitmap; Name: 'Bitmap'; Signature: 'BM'),
(ImageType: TGIFImage; Name: 'GIF'; Signature: 'GIF'),
(ImageType: TJPEGImage; Name: 'JPEG';
Signature: chr($FF)+chr($D8)+chr($FF)+chr($E0)+chr($00)+chr($10)+'JFIF'));procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Open;
end;procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
Stream : TStream;
Size : integer;
Header : TGraphicHeader;
Signature : pointer;
i : integer;
Image : TGraphic;
Name : string;
begin
if ((Field <> nil) and (Field <> Table1Graphic)) or
(Table1Graphic.DataSet.State <> dsBrowse) then
exit; Image := nil; // Database cursor has moved - Update image
Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmRead);
try
// Skip paradox image header
Size := Stream.Size;
if (Size >= SizeOf(TGraphicHeader)) then
begin
Stream.Read(Header, SizeOf(Header));
if (Header.Count <> 1) or (Header.HType <> $0100) or
(Header.Size <> Size - SizeOf(Header)) then
Stream.Seek(-SizeOf(Header), soFromCurrent);
end; try
// Determine image type from file signature
for i := low(Signatures) to high(Signatures) do
begin
if (length(Signatures[i].Signature) > Size) then
continue;
// Read signature
GetMem(Signature, length(Signatures[i].Signature));
try
Stream.Read(Signature^, length(Signatures[i].Signature));
// Reposition stream cursor
Stream.Seek(-length(Signatures[i].Signature), soFromCurrent);
// Compare signatures
if (CompareMem(Signature, @Signatures[i].Signature[1], length(Signatures[i].Signature))) then
begin
Image := TGraphicHackClass(Signatures[i].ImageType).Create;
Name := Signatures[i].Name;
break;
end;
finally
Freemem(Signature);
end;
end; // Force TImage to desired graphic type
ImageFish.Picture.Graphic := Image; // Load image from stream
if (ImageFish.Picture.Graphic <> nil) then
begin
ImageFish.Picture.Graphic.LoadFromStream(Stream);
Caption := format('FISH FACTS - %s image, %d bytes', [Name, Size]);
end else
Caption := 'FISH FACTS'; finally
Image.Free;
end;
finally
Stream.Free;
end;
end;// Write the specified image to the BLOB field
procedure TForm1.UpdateField(Graphic: TGraphic);
var
Stream : TStream;
Header : TGraphicHeader;
begin
Table1Graphic.DataSet.Edit;
Stream := Table1Graphic.DataSet.CreateBlobStream(Table1Graphic, bmWrite);
try
// TBitmaps are saved in a special format which is compatible with
// the TDBImage component...
if (Graphic is TBitmap) and
((Table1Graphic.DataType = ftGraphic) or (Table1Graphic.DataType = ftTypedBinary)) then
begin
Stream.Write(Header, SizeOf(Header));
Graphic.SaveToStream(Stream);
Header.Count := 1;
Header.HType := $0100;
Header.Size := Stream.Position - SizeOf(Header);
Stream.Position := 0;
Stream.Write(Header, SizeOf(Header));
end else
// ...all other image formats are just saved to the BLOB stream
Graphic.SaveToStream(Stream);
finally
Stream.Free;
end;
Table1Graphic.DataSet.Refresh;
end;procedure TForm1.MenuImageConvertBitmapClick(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(ImageFish.Picture.Graphic);
UpdateField(Bitmap);
finally
Bitmap.Free;
end;
end;procedure TForm1.MenuImageConvertGIFClick(Sender: TObject);
var
GIF : TGIFImage;
begin
GIF := TGIFImage.Create;
try
GIF.ColorReduction := rmQuantize;
GIF.DitherMode := dmFloydSteinberg;
GIF.Assign(ImageFish.Picture.Graphic);
UpdateField(GIF);
finally
GIF.Free;
end;
end;procedure TForm1.MenuImageConvertJPEGClick(Sender: TObject);
var
JPEG : TJPEGImage;
Bitmap : TBitmap;
begin
JPEG := TJPEGImage.Create;
try
// TJPEGImage can only assign from TBitmap and TJPEGImage, so we
// need to convert the TGIFImage to a TBitmap before it can be
// converted to a TJPEGImage
if (ImageFish.Picture.Graphic is TGIFImage) then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(ImageFish.Picture.Graphic);
JPEG.Assign(Bitmap);
finally
Bitmap.Free;
end;
end else
JPEG.Assign(ImageFish.Picture.Graphic);
JPEG.CompressionQuality := 80;
JPEG.Compress;
UpdateField(JPEG);
finally
JPEG.Free;
end;
end;procedure TForm1.MenuImageLoadClick(Sender: TObject);
begin
if (OpenPictureDialog.Execute) then
begin
ImageFish.Picture.LoadFromFile(OpenPictureDialog.FileName);
UpdateField(ImageFish.Picture.Graphic);
end;
end;end.
Query1.Params[n].ASBlob:=Buffer;
或
Query1.Params[n].LoadfromStream;
再不行就
Query1.Params[n].setBolbData;
应该都可以
注意要把
Query1.Params[n].DataType设成你的类型,比如ftBlob或ftGraphic
use jpeg
var
tp_stream: tmemorystream;
begin
tp_stream.create;
query1.close;
.........
image.picture.savetostream(tp_stream);
query1.parambyname(':变量名').loadstream:=tp_stream;
query1.sql.execsql;
query1.close;
end;