delphi +sql server2000 怎样存储(保存+显示).jpeg图片? 急呀!(100分)

  • 主题发起人 主题发起人 xiaodp
  • 开始时间 开始时间
X

xiaodp

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi5,能保存进出,可就是显示不出来,装了个delphi7,可还是不行。急死人了!
 
修改TDBImage的源码,改:
procedure TDBImage.LoadPicture;
type TGraphicFmt=(gfUnKnown,gfBitmap,gfJpg);
var BlobStrm: TStream;
GraphicFmt: TGraphicFmt;
procedure getGraphicClass;
var b1,b2,b3: Byte;
begin
//Bmp:42 4d Jpg:FF D8 Gif: 47 49 46 wmf: D7 CD Ico:00 00 01
BlobStrm.Seek(0,0);
BlobStrm.Read(B1,1);
BlobStrm.Read(B2,1);
BlobStrm.Read(B3,1);
GraphicFmt:=gfUnknown;
if (B1=$42) and (B2=$4d) then GraphicFmt:=gfBitmap
else if (B1=$FF) and (B2=$D8) then GraphicFmt:=gfJpg;
end;
begin
if not FPictureLoaded and (not Assigned(FDataLink.Field) or
FDataLink.Field.IsBlob) then
// Picture.Assign(FDataLink.Field);
begin
if Assigned(FDataLink.Field) and(not FDataLink.Field.IsNull) then
begin
BlobStrm:=FDataLink.DataSet.CreateBlobStream(FDataLink.Field, bmRead);
try
GraphicFmt:=gfUnknown;
if BlobStrm.Size > 10 then getGraphicClass;
case GraphicFmt of
gfJpg:begin
if (Picture.Graphic=nil)or(not (Picture.Graphic is TJpegImage)) then
begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=TJpegImage.Create;
end;
end;
gfBitmap:begin
if (Picture.Graphic=nil)or(not (Picture.Graphic is TBitmap)) then
begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=TBitmap.Create;
end;
end;
else begin
if Picture.Graphic<>nil then Picture.Graphic.Free;
Picture.Graphic:=nil;
end;
end;
if Picture.Graphic<>nil then
begin
BlobStrm.Seek(0,0);
Picture.Graphic.LoadFromStream(BlobStrm);
end else Paint;
finally
BlobStrm.Free;
end;
end
else Picture.Bitmap.Assign(nil);
end;
end;
procedure TDBImage.UpdateData(Sender: TObject);
var BlobStrm: TStream;
begin
//if Picture.Graphic is TBitmap then
// FDataLink.Field.Assign(Picture.Graphic) else
if Picture.Graphic<>nil then
begin
BlobStrm := FDataLink.DataSet.CreateBlobStream(FDataLink.Field, bmWrite);
try
Picture.Graphic.SaveToStream(BlobStrm);
finally
BlobStrm.Free;
end;
end else
FDataLink.Field.Clear;
end;


 
if ExtractFileExt(OpenPictureDialog1.FileName)='.jpg' then
begin
jp:=tjpegimage.create;
bi:=TBitmap.Create;
jp.LoadFromFile(OpenPictureDialog1.FileName);
bi.Assign(jp);
ms:=TMemoryStream.Create;
bi.SaveToStream(ms);
ms.Position:=0;
Edit;
TBlobField(FieldByName('photo')).LoadFromStream(ms);
Post;
ms.free;
end else
begin
ms:=Tfilestream.create(OpenPictureDialog1.FileName,fmopenread);
ms.Position:=0;
Edit;
TBlobField(FieldByName('photo')).LoadFromStream(ms);
Post;
ms.free;
end;
end;

二种都可以。
 
to 无头骑士
保存没问题,就是显示不出来。
 
这是保存:BMP,jpg都行.
procedure TInputResultForm.SpeedButton1Click(Sender: TObject);
var
JPeg: TJPegImage;
Bmp: TBitmap;
ff: Tgraphicfield; //存放bmp的字段
mm: tmemorystream;
begin
inherited;
try
Bmp := TBitmap.Create;
JPeg := TJPegimage.Create;
mm:=Tmemorystream.create;
DM.adoExeAttch.Edit;
if OpenDialog1.Execute then
if UpperCase(copy(Opendialog1.FileName,length(Opendialog1.FileName)-2,3))='BMP' then begin
Bmp.LoadFromFile(Opendialog1.FileName);
JPeg.Assign(Bmp);
JPeg.savetostream(mm);
TBlobField(DM.adoExeAttch.FieldByName('Image1')).LoadFromStream(mm);
end else begin
JPeg.LoadFromFile(Opendialog1.FileName);
TBlobField(DM.adoExeAttch.FieldByName('Image1')).loadfromfile(Opendialog1.FileName);
end;
Image1.Picture.Assign(jpeg);
finally
JPeg.Free;
mm.free;
Bmp.Free;
end;
end;

这是显示:
procedure TInputResultForm.SpeedButton2Click(Sender: TObject);
var
m:TMemoryStream;
jpg:TJpegImage;
begin
inherited;
m := TmemoryStream.Create;
if TBlobField(DM.adoExeAttch.FieldByName('Image1')).BlobSize>0 then
try
(DM.adoExeAttchImage1 as TBlobField).SaveToStream(m);
jpg := TJpegImage.Create;
m.Position := 0;
jpg.LoadFromStream(m);
Image1.Picture.Assign(jpg);
jpg.Free;
except
showmessage('供应商上传的图片格式不正确,无法浏览!')
end else
Image1.Picture.Assign(nil);
m.Free;
end;
 
to jianguobu,
显示是错误提示:‘JPEG error #41 ’。
 
uers Jpeg单元.
 
已经加入单元 jpeg 了,否则无法编译。
 
没理由,我这边都能运行机的.你单步调试看哪里出错.
 
错在:Image1.Picture.Assign(jpg);
 
说白了就是在保存前将JPG格式换成BMP格式吧。DELPHI支持这两种格式的转换。
 
你是不是用的DBimage ,如果是的话那告诉你:DBimage 现在还不支持JPEG的图片,
如果说要use jpeg 是骗人的那是一个假的接口。
如果实在要它支持的话,你可以把JPEG 转换BMP的才行但是这里又面对一个新的问题,把JPEG转换成BMP的话,会变得很大,显示会很慢的,但我可以给你方法函数
但如果是IMAGE控件的话,它本身就是支持的,
 
直接用IMAGE。放一个openpicturedialog.(以下代码完全测试通过。)
USES JPEG;
procedure Tfm_goods.BitBtn1Click(Sender: TObject);
var
msmem:TmemoryStream;
jpg:TJpegImage;
begin
try
openpicturedialog1.Execute;
if openpicturedialog1.FileName <> '' then
Image2.Picture.LoadFromFile(openpicturedialog1.FileName);
try
msmem:=TmemoryStream.Create;
jpg:=TjpegImage.Create;
jpg.Assign(Image2.Picture.Graphic);
jpg.SaveToStream(msmem) ;
q_goods.Edit;
msmem.Position :=0;
TBlobField(q_goods.FieldByName('goods_picture')).LoadFromStream(msmem);
except
end;
finally
Msmem.Free ;
jpg.free;
end;
end;

其中IMAGE2为IMAGE控件,q_goods ,为adoquery 控件,你改为adotable,也可以的。
然后加上一个保存按钮,
q_goods.post,就可以了。
完全测试通过,正在用的。
 
伊天笑,sunny3super,保存没问题,就是显示不出来。
 
to xiaodp:
按我得方法,修改一下Delphi的源码试试。
 
下面给出显示的方法:
procedure Tfm_goods.DBNavigator1Click(Sender: TObject;
Button: TNavigateBtn);
var
ms:TStringStream;
Jpg:TJpegImage;
begin
try
//image2.Picture.Assign(nil); //显示
ms:=TstringStream.Create('');
Jpg:=TJpegImage.Create;
TBlobField(q_goods.FieldByName('goods_picture')).SaveToStream(ms);
//jpg.LoadFromStream(ms);
ms.Position :=0;
Jpg.LoadFromStream(ms);
// Form2.Image1.Picture.Bitmap.LoadFromStream(ms);
Image2.Picture.Assign(jpg); //如果JpegImage是从一个文件中load的话(loadfromstream),图像就可以正常显示,
finally
ms.Free;
jpg.Free;
end;
end.
在用DBNavigator浏览时,按上一条,下一条时就会在IMAGE2总出现相应的图片 ,句绝对通过。如果再不明白,给我发EMAIL:SUNNY3SUPER@163.COM,给你一个例子。
 
用imageEn得了,很不錯的東東,可直接打印和另存等等,方便死了
 
我的方法可以,完全测试通过了。
建一个表,有一个字段为GOODS_PRCTURE,真的完全通过的。你试一下呀,就是用流的方法呀。你仔细看看我的代码就明白了。
 
谢谢各位了。
 
后退
顶部