我现在要实现这样一个需求,用户从本地上传一个JPG的图片到数据库。比如图片的大小是(800*600)的,在数据库中要求存储当前图片的缩略图(就是把当前图片压缩到200*100)的大小文件存储到数据库一个叫缩略图的字段里面,同时再把800*600的图片存储到数据库一个叫PHOTO的字段里(存储800*600的我已经实现)。
对于以上需求现在有两个问题:
(1)、如何把800*600的图片压缩成200*100的,在Delphi里面是怎么实现的。
(2)、如果把压缩的图片写入数据库。
(3)、同时在问一个如何获取用户上传jpg图片的大小。
请各位大哥帮帮小弟。
对于以上需求现在有两个问题:
(1)、如何把800*600的图片压缩成200*100的,在Delphi里面是怎么实现的。
(2)、如果把压缩的图片写入数据库。
(3)、同时在问一个如何获取用户上传jpg图片的大小。
请各位大哥帮帮小弟。
你可以使用copyrect,把原图片拷贝到一个200*100的画布上,然后入库
(2)、如果把压缩的图片写入数据库。
和你800×600的图片入库一样的操作。。关于图片入库,可以参考以前的帖子,你在论坛中搜索一个,关于这个问题,N个帖子。
http://topic.csdn.net/t/20051215/18/4461795.html
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ExtDlgs, StdCtrls, ADODB, Grids, DBGrids, ExtCtrls,jpeg,
DBCtrls;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
selectimage: TButton;
savetodb: TButton;
OpenPictureDialog1: TOpenPictureDialog;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
savetofile: TButton;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Bevel1: TBevel;
Bevel2: TBevel;
GroupBox1: TGroupBox;
Image1: TImage;
Label3: TLabel;
Label4: TLabel;
DBImage1: TDBImage;
procedure selectimageClick(Sender: TObject);
procedure savetodbClick(Sender: TObject);
procedure ADOTable1AfterScroll(DataSet: TDataSet);
procedure savetofileClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ADOTable1BeforeScroll(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
uses unit2;
{$R *.dfm}procedure TForm1.selectimageClick(Sender: TObject); //选择图像
begin
if openpicturedialog1.Execute then
image1.Picture.LoadFromFile(openpicturedialog1.FileName );
end; ////如下保存方法only to sql and access'data
procedure TForm1.savetodbClick(Sender: TObject); //保存图像
var
strm:tmemorystream;
ext:string;
begin
if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
begin
ext:=extractfileext(openpicturedialog1.FileName );
strm := tmemorystream.Create ;
try
image1.Picture.Graphic.SaveToStream(strm);
adotable1.Edit ;
strm.Position :=0;
DBImage1.dataField :=''; //dbimage只能显示BMP,否则myimage由BMP变为jpeg时会出错
tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
//如需直接由文件保存 TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
//以下记录保存到数据库的图像格式
if uppercase(ext) = '.BMP' then
begin
adotable1.FieldByName('isbmp').Value := 1;
dbimage1.dataField := 'myimage';
end
else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN
adotable1.FieldByName('isbmp').Value := 0;
adotable1.Post ;
finally
strm.Free ; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
end;
end;
end;
///如下显示方法不适用于paradox中的graphic字段的显示。
procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet); //显示图像
var
strm:tadoblobstream;
jpegimage:tjpegimage;
bitmap:tbitmap;
begin
strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);
try //try1
strm.position :=0;
image1.Picture.Graphic := nil;
DBIMAGE1.DataField := '';
//显示时,BMP、JPEG两种图像数据必需分别处理
if adotable1.fieldbyname('isbmp').asstring ='1' then
begin //begin11
bitmap := tbitmap.Create ;
try //try11
bitmap.LoadFromStream(strm);
image1.Picture.Graphic := bitmap;
DBIMAGE1.DataField := 'myimage';
finally
bitmap.Free;
end; //end try11
end //end begin11
else if adotable1.fieldbyname('isbmp').asstring ='0' then
begin //begin12
jpegimage := tjpegimage.Create ;
try //try12
jpegimage.LoadFromStream(strm);
image1.Picture.Graphic := jpegimage;
finally
jpegimage.Free ;
end; //end try12
end; //end begin12
finally
strm.Free ;
end; //end try1
end;////显示时必须分bmp and jpeg 两种情况处理,而保存可统一。procedure TForm1.savetofileClick(Sender: TObject);
var
tmpstr:string;
begin
if image1.Picture.Graphic <> nil then
begin
tmpstr := openpicturedialog1.Filter;
if adotable1.fieldbyname('isbmp').asstring ='1' then
begin
openpicturedialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
if openpicturedialog1.Execute then
image1.Picture.SaveToFile(openpicturedialog1.FileName+'.bmp');
end
else
begin
openpicturedialog1.Filter := 'JPEG Image File (*.jpg)|*.jpg';
if openpicturedialog1.Execute then
image1.Picture.SaveToFile(openpicturedialog1.FileName+'.jpg');
end;
openpicturedialog1.Filter := tmpstr;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
adoconnection1.Connected := true;
adoconnection1.LoginPrompt := false;
adotable1.Active := true;
end;procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
begin
dbimage1.dataField :=''; //这条语句不能遗漏,不信你试试
end;end.
var
Dir: TSearchRec;
Ret: integer;
Path: string;
begin
Result := 0;
Path := ExtractFilePath(ADirectory);
Ret := Sysutils.FindFirst(ADirectory, faAnyFile, Dir);
if Ret <> NO_ERROR then exit;
try
while ret = NO_ERROR do
begin
inc(Result, Dir.Size);
//如果是目录,且不是'.'或'..'则进行递归调用 if (Dir.Attr in [faDirectory]) and (Dir.Name[1] <> '.') then
Inc(Result, GetDirectorySize(Path + Dir.Name + '\*.*'));
Ret := Sysutils.FindNext(Dir);
end;
finally
Sysutils.FindClose(Dir);
end;end;
function Taddmtsc.GetFileExtension(const sFileName: string): string; //获取文件格式
begin
Result := Copy(sFileName, Length(sFileName) - 2, 3);
end;
procedure Taddmtsc.uploadClick(Sender: TObject);
var
fnOle: string;
function BlobContentToString(const sFileName: string): string;
begin
with TFileStream.Create(sFileName, fmOpenRead) do
begin
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
finally
Free;
end;
end;
end;begin
if (OpenDialog1.Execute) then
begin
if dbedit1.Text = '' then
begin
showmessage('资源信息不完整,上传失败!');
ComboBox4.Enabled := false;
exit;
end
else
if dbedit1.Enabled <> true then
begin
showmessage('操作错误,上传失败!');
ComboBox4.Enabled := false;
exit;
end
else
begin
fnOle := OpenDialog1.FileName;
dm1.ADODataSet1.Edit;
dm1.ADODataSet1.FieldByName('data').AsString := BlobContentToString(fnOle);
dm1.ADODataSet1.FieldByName('subject_3_id').Value := DBEdit1.Text;
dm1.ADODataSet1.FieldByName('format').Value := GetFileExtension(fnOle);
dm1.ADODataSet1.FieldByName('time').Value := Now;
dm1.ADODataSet1.FieldByName('size').Value := GetDirectorySize(fnOle);
dm1.ADODataSet1.FieldByName('kind').Value := ComboBox4.Text;
dm1.ADODataSet1.FieldByName('user').Value := userlogin.Query1name.Text;
dm1.ADODataSet1.Post;
flag:=0;
showmessage('资源上传成功!');
end;
DBMemo1.Enabled := false;
ComboBox1.Enabled := false;
ComboBox2.Enabled := false;
ComboBox3.Enabled := false;
ComboBox4.Enabled := false;
dbedit6.Enabled := false;
dbedit1.Enabled := false;
BitBtn1.Enabled := true;
BitBtn2.Enabled := true;
BitBtn3.Enabled := true;
BitBtn4.Enabled := true;
BitBtn6.Enabled := true;
BitBtn8.Enabled := true;
back1.Enabled := true;
look1.Enabled := true;
addnew.Enabled := true;
end;
end;
以上是本人用过的上传二进制流文件的方法,你可以参考一下(别说图片了,就是影音文件也没问题的)