读取图象数据问题 ( 积分: 50 )

  • 主题发起人 主题发起人 wtj
  • 开始时间 开始时间
W

wtj

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库是SQL,图象字段Img,数据类弄为Image,存有标准JPEG格式的数据流,其显示图片程序代码是(参照网上):
procedure TForm1.Button5Click(Sender: TObject);
var
myjpeg:tjpegimage;
mystm:Tmemorystream;
begin
try
if not ADOQuery1.FieldByName('img').IsNull then begin
myjpeg:=tjpegimage.Create;
mystm:=tmemorystream.Create;
tblobfield(ADOQuery1.FieldByName('img')).SaveToStream(mystm);
mystm.Position:=0;
myjpeg.LoadFromStream(mystm);
image1.Picture.Assign(myjpeg);
end
else begin
image1.Picture:=nil;
end;
finally
myjpeg.Free;
mystm.Free;
end;
end;
这行出错 myjpeg.LoadFromStream(mystm), 跳出错误代码是:JPEG error#52
请各位大虾,帮忙指出原因,以及怎么解决?先谢了。分不够再加,对不起我只有那么点分,
 
数据库是SQL,图象字段Img,数据类弄为Image,存有标准JPEG格式的数据流,其显示图片程序代码是(参照网上):
procedure TForm1.Button5Click(Sender: TObject);
var
myjpeg:tjpegimage;
mystm:Tmemorystream;
begin
try
if not ADOQuery1.FieldByName('img').IsNull then begin
myjpeg:=tjpegimage.Create;
mystm:=tmemorystream.Create;
tblobfield(ADOQuery1.FieldByName('img')).SaveToStream(mystm);
mystm.Position:=0;
myjpeg.LoadFromStream(mystm);
image1.Picture.Assign(myjpeg);
end
else begin
image1.Picture:=nil;
end;
finally
myjpeg.Free;
mystm.Free;
end;
end;
这行出错 myjpeg.LoadFromStream(mystm), 跳出错误代码是:JPEG error#52
请各位大虾,帮忙指出原因,以及怎么解决?先谢了。分不够再加,对不起我只有那么点分,
 
怎么没人呢!是不是问题太简单呢?
 
image1.Picture.Assign(myjpeg);改为 Image1.Picture.Bitmap.Assign(myjpeg);
 
我也改过的,但还是跳出错误代码是:JPEG error#52
 
请各位大虾,帮帮忙,解决后加100分
 
1.请确保你的JPEG是标准格式
2.试试下面的方法
const
WMFKey = Integer($9AC6CDD7);
WMFWord = $CDD7;
rc3_StockIcon = 0;
rc3_Icon = 1;
rc3_Cursor = 2;

type
TGraphicHeader = record
Count: Word;
HType: Word;
Size: Longint;
end;

TMetafileHeader = packed record
Key: Longint;
Handle: SmallInt;
Box: TSmallRect;
Inch: Word;
Reserved: Longint;
CheckSum: Word;
end;

TCursorOrIcon = packed record
Reserved: Word;
wType: Word;
Count: Word;
end;

//------------------------------------------------------
// Created: 2005-06-12
// Author: jfyes
// Type: procedure
// Function: DrawFieldGraphic
//------------------------------------------------------
procedure DrawFieldGraphic(BlobField: TBlobField; Picture: TPicture);
var
s: TStream;
pos: Integer;
Header: TGraphicHeader;
BMPHeader: TBitmapFileHeader;
//{$IFDEF JPEG}
JPEGHeader: array[0..1] of Byte;
//{$ENDIF}
EMFHeader: TEnhMetaHeader;
WMFHeader: TMetafileHeader;
ICOHeader: TCursorOrIcon;
NewGraphic: TGraphic;
begin
if BlobField.IsNull then
begin
Picture.Assign(nil);
Exit;
end;
s := nil;
try
S := BlobField.DataSet.CreateBlobStream(BlobField, bmRead);
NewGraphic := nil;
if s = nil then Exit;
if s.Size > 0 then
begin
// skip Delphi blob-image header
if s.Size >= SizeOf(TGraphicHeader) then
begin
s.Read(Header, SizeOf(Header));
if (Header.Count <> 1) or (Header.HType <> $0100) or
(Header.Size <> s.Size - SizeOf(Header)) then
s.Position := 0;
end;
pos := s.Position;

// try bmp header
s.ReadBuffer(BMPHeader, SizeOf(BMPHeader));
s.Position := pos;
if BMPHeader.bfType = $4D42 then
NewGraphic := TBitmap.Create
else
begin
//{$IFDEF JPEG}
// try jpeg header
s.ReadBuffer(JPEGHeader, SizeOf(JPEGHeader));
s.Position := pos;
if (JPEGHeader[0] = $FF) and (JPEGHeader[1] = $D8) then
NewGraphic := TJPEGImage.Create
else
//{$ENDIF}
begin
// try wmf header
s.ReadBuffer(WMFHeader, SizeOf(WMFHeader));
s.Position := pos;
if WMFHeader.Key = WMFKEY then
NewGraphic := TMetafile.Create
else
begin
// try emf header
s.ReadBuffer(EMFHeader, SizeOf(EMFHeader));
s.Position := pos;
if EMFHeader.dSignature = ENHMETA_SIGNATURE then
NewGraphic := TMetafile.Create
else
begin
// try icon header
s.ReadBuffer(ICOHeader, SizeOf(ICOHeader));
s.Position := pos;
if ICOHeader.wType in [RC3_STOCKICON, RC3_ICON] then
NewGraphic := TIcon.Create;
end;
end;
end;
end;
end;

if NewGraphic <> nil then
begin
Picture.Graphic := NewGraphic;
NewGraphic.Free;
Picture.Graphic.LoadFromStream(s);
end
else
Picture.Assign(nil);
finally
if s <> nil then
s.Free;
end;
end;
 
上面过程Image.Picture是可以读取它支持的文件格式:All (*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf)
 
to jfyes
确定是标准jpeg格式 用你的方法,编辑和运行都没问题,可是没显示出图象来,不知兄台是怎么调用。
我的调用如下:DrawFieldGraphic(tblobfield(ADOQuery1.FieldByName('img')),Image1.Picture);
 
是这样的.
1.Image1组件是不是在最上层,有没有其他控件把它盖住.
2.设置断点跟踪一下看看有没有执行到这个过程,就知道了.
 
因为你报的是JPEG没有找到引用的错!我想你可能在interface处没有引用JPEG单元
在uses 处加一个JPEG试试!
 
interface引用有JPEG啊,动行也通过的。
image1组件是在最上面的。运行时只显示的图片一个象小窗口的窗体(里面什么都没有)。可惜这里页面不能显示图片,要不然我传出来给大家看。
 
TO jfyes
你可否有QQ,我可以发给你,运行结果,显示的图片。
 
QQ很少上, 348677065
你发到我邮箱来,jf_yes@163.com
 
to wtj,请问你保存的图片到数据库的时候是不是以内存流的形式保存的?
即:
procedure TForm1.Button1Click(Sender: TObject);
var
testStream:TMemoryStream;
begin
try
testStream := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(testStream);
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add('Insert into picture(photo) values (:photo)');
adoQuery1.Parameters.ParamByName('photo').LoadFromStre(testStream,ftBlob);
adoquery1.ExecSQL;
finally
testStream.Free;
end;
end;
 
是另外一方保存图片到SQL200数据库里的,用的是VB编写程序,给我提供的信息是:存在数库里面的数据是标准的JPEG格式的数据。我想应该是流的形式存入的。
 
问题可能就出在这里。
我写的那个存入图片的程序是跟你那个显示图片的程序是想对应的。
你是用vb写的程序存进去,我估计是读不出来的!
 
to: wtj
您好!您的邮件我收到.
就那张小图片,看不到什么.
====>>另外一方VB编写程序
可能别人的在保存之前将流压缩保存到数据库,读取时在解出,
如果是这样你没有他的解压缩算法是没法读取的.如果是标准的没有经过处理的流,
应该能读取,你可尝试多种方法,上面也有其他大富翁的方法.
不知你有没有FastReport3.0的报表组件,里页有个TfrxPictureView
上面我的方法就是按TfrxPictureView的方法.
如里你有我发个TXDBGrid组件给你,是专操作Bolb字段的.
 
to feiwolf
我试用了delphi程序存图片,用我读取的程序是能显示图片的。但我想都是以流的形式存在数据库里,应该能以流的形式读出来,我想问题可能出在我不知道数据里的头文件的存在形式。
 
if (JPEGHeader[0] = $FF) and (JPEGHeader[1] = $D8) then
这是分辨JPEGHeader
 
后退
顶部