图片显示问题 我真不明白....(20分)

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

xhcxhc200

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Tmainfrm.ListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
var
tpstream:tmemorystream;
jpegfile:tjpegimage;
begin
if listview1.Selected<>nil then
begin
with datamodule1.ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('select * from 菜谱表 where 菜名=:A');
Parameters.ParamByName('A').Value:=listview1.Selected.Caption;
open;
try
tpstream:=tmemorystream.Create;
jpegfile:=tjpegimage.Create;
tblobfield(fieldbyname('图片')).SaveToStream(tpstream);
tpstream.Position:=0;
Image1.Picture.Graphic:= nil;
jpegfile.LoadFromStream(tpstream);
image1.Picture.Graphic.assign(jpegfile);
finally
tpstream.Free;
jpegfile.Free;
end;
end;
end;
end;
在运行时候总出现
JPEG ERROR #53
我用ACCESS,数据格式是OLE
请问哪里错误了
 
图片格式问题,你检查一下你数据库里面存放图片字段,存放的是不是JPG格式。你存入是是否用JPG格式。如果不是,你先转换。
 
我是用ACCESS做的,数据格式是OLE
 
我是用ACCESS做的,数据格式是OLE
 
你试着以BMP格式先读出来,看正常显示不。或者你存一幅JPG进去,再读出来,还出现这样问题不嘛。
 
我已经在里面存入JPG图片了,我现在就是在读取图片到IMAGE上...
 
这样吧,我看以前我写的源码还在不在。如果在发给你。请提供邮箱。
 
xuehongcheng@126.com
 
最好是用ADOQUERY组件的代码
 
我把代码贴在这上面行了
----------------------
procedure TfrmMain.TreeView1Click(Sender: TObject);
var
MMID: string;
MStream: TMemoryStream;
MyJPG: TJPEGImage;
begin
if TreeView1.Items.Count = 0 then
abort;

if Assigned(TreeView1.Selected) then
StatusBar1.Panels[2].Text := TreeView1.Selected.Text;

if TreeView1.Selected.Level = 1 then
begin
MMID := PField(TreeView1.Selected.Data).MID;
ADOQuery4.Close;
ADOQuery4.SQL.Clear;
ADOQuery4.SQL.Text := 'select * from MainTable where MID='''+MMID+'''';
ADOQuery4.Open;

//~~~显示图片
if ADOQuery4.FieldByName('Flg').AsString = 'G' then
begin
MStream := TMemoryStream.Create;
TBlobField(ADOQuery4.FieldByName('NR')).SaveToStream(MStream);
if MStream.Size > 0 then
begin
MyJPG := TJPEGImage.Create;
MStream.Position := 0;
MyJPG.LoadFromStream(MStream);
Image1.Picture.Graphic := MyJPG;
MyJPG.Free;
end;
MStream.Free;
end;
end;
end;
 
我看了你的代码后,还是出问题,可能是我数据库出问题了 能问一下吗?
ACCESS中有个图片字段, 我能不能通过插入对象 把JPG图象 放到该字段的记录上
 
ACCESS中,要存图片,那么就是存到OLE字段里面,OLE只能装二进制数据,所以要以流格式存进去,如:TBlobField(ADOQuery1.FieldByName('图片')).LoadFromStream(TempStream);
-----------------------------
这样吧,你在tblobfield(fieldbyname('图片')).SaveToStream(tpstream);这句话下面
ShowMessage(IntToStr(tpstream.size));
看流的大小和你要存的图片大小相同不,比较一下,再找出原因。
 
恩,我知道了,你能不能发个添加图片的代码吧给我,我好象数据库中没有图片,我加了你那句话 显示的是20097,
 
代码有点乱,你随便参考一下了。(添加图片)
---------------------------------------------
procedure TfrmFangAnAdd.AddImage;
var
FilePath, Flgs, ItmName, ItmType, ExtName: string;
id: TGUID;
TempStream: TMemoryStream;
P: PAField;
iBMP: TBitmap;
iJPG: TJPEGImage;
begin
FilePath := Trim(LabeledEdit1.Text);
if RadioButton2.Checked then
Flgs := 'G';

ItmName := Trim(LabeledEdit2.Text);
ItmType := Trim(ComboBox1.Text);

CreateGUID(id);

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'select * from MainTable';
ADOQuery1.Open;
ADOQuery1.Append;
ADOQuery1.FieldByName('MID').AsString := GUIDToString(id);
ADOQuery1.FieldByName('Flg').AsString := Flgs;
ADOQuery1.FieldByName('Typ').AsString := ItmType;

ExtName := ExtractFileExt(FilePath);
ExtName := AnsiStrLower(pchar(ExtName));

//处理BMP
if ExtName = '.bmp' then
begin
TempStream := TMemoryStream.Create;
iBMP := TBitmap.Create;
iJPG := TJPEGImage.Create;
iBMP.LoadFromFile(FilePath);
iJPG.Assign(iBMP);
iJpg.CompressionQuality := 60;
iJpg.Compress;
iJPG.SaveToStream(TempStream);
TempStream.Position := 0;
TBlobField(ADOQuery1.FieldByName('NR')).LoadFromStream(TempStream);
ADOQuery1.Post;
TempStream.Free;
iBMP.Free;
iJPG.Free;
end;


//处理JPG
if ExtName = '.jpg' then
begin
TempStream := TMemoryStream.Create;
iJPG := TJPEGImage.Create;
iJPG.LoadFromFile(FilePath);
// iJpg.CompressionQuality := 60;
// iJpg.Compress;
iJPG.SaveToStream(TempStream);
TempStream.Position := 0;
TBlobField(ADOQuery1.FieldByName('NR')).LoadFromStream(TempStream);
ADOQuery1.Post;
TempStream.Free;
iJPG.Free;
end;


ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'select * from PTree';
ADOQuery1.Open;
ADOQuery1.Append;
ADOQuery1.FieldByName('PID').AsString := TMID;
ADOQuery1.FieldByName('PName').AsString := ItmName + ' (' + ItmType + '(图片型类)' + ')';
ADOQuery1.FieldByName('MID').AsString := GUIDToString(id);
ADOQuery1.Post;

New(P);
P.PID := TMID;
P.PName := ItmName + ' (' + ItmType + '(图片型类)' + ')';
P.MID := GUIDToString(id);
frmMain.TreeView1.Items.AddChildObjectFirst(frmMain.TreeView1.Selected, P.PName, P);

LabeledEdit1.Text := '';
LabeledEdit2.Text := '';
RadioButton1.Checked := false;
RadioButton2.Checked := false;
ComboBox1.ItemIndex := -1;
end;
 
能不能帮我看一下我的代码怎么老出错,而且我都不知道错在哪里?
 
procedure Ttianjiafrm.Button3Click(Sender: TObject);
var
tpstream:tmemorystream;
jpegfile:tjpegimage;
begin
if edit1.Text=' ' then
showmessage('菜名不能为空!');
with datamodule1.ADOQrytianjia do
begin
connection:=datamodule1.ADOConnection1;
close;
sql.Clear;
if combobox1.Text='' then
datamodule1.ADOQrytianjia.FieldByName('功能').IsNull;
if combobox2.Text='' then
datamodule1.ADOQrytianjia.FieldByName('主料类别').IsNull;
if combobox3.Text='' then
datamodule1.ADOQrytianjia.FieldByName('适合人群').IsNull;
if combobox4.Text='' then
datamodule1.ADOQrytianjia.FieldByName('菜系').IsNull;
if combobox5.Text='' then
datamodule1.ADOQrytianjia.FieldByName('味道').IsNull;
if combobox6.Text='' then
datamodule1.ADOQrytianjia.FieldByName('烹调类别').IsNull;
if combobox1.Text='' then
datamodule1.ADOQrytianjia.FieldByName('适宜季节').IsNull;
begin
sql.Add('insert into 菜谱表 (菜名,菜系,功能,味道,主料类别,烹调类别,适合人群,适宜季节) values (:A,:B,:C,:D,:E,:F,:G,:H)');
Parameters.ParamByName('A').Value:=edit1.Text;
Parameters.ParamByName('B').Value:=combobox4.Text;
Parameters.ParamByName('C').Value:=combobox1.Text;
Parameters.ParamByName('D').Value:=combobox5.Text;
Parameters.ParamByName('E').Value:=combobox2.Text;
Parameters.ParamByName('F').Value:=combobox6.Text;
Parameters.ParamByName('G').Value:=combobox3.Text;
Parameters.ParamByName('H').Value:=combobox7.Text;
open;
end;
if image1.Picture.Graphic<>nil then
begin
close;
sql.Clear;
sql.Add('select * from 菜谱表');
open;
append;
tpstream:=tmemorystream.Create;
jpegfile:=tjpegimage.Create;
jpegfile.SaveToStream(tpstream);
tpstream.Position:=0;
tblobfield(fieldbyname('图片')).LoadFromStream(tpstream);
jpegfile.Free;
tpstream.free;
post;
end;
close;
sql.Clear;
sql.Add('select * from 菜谱表 ');
open;
mainfrm.OnShow(sender);
end;
tianjiafrm.Close;
end;
 
错误是 当前提供程序不支持单一执行返回多个记录集
 
jpegfile:=tjpegimage.Create;
jpegfile.SaveToStream(tpstream);
tpstream.Position:=0;
你的jpegfile里面根本没有内容呀。


如果方便,你把你的程序发到我邮箱来,我试帮你调试看
wallysw@163.com
 
现在不是很方便,能帮我远程调试吗?
虽然只是小软件但是还是要保密的,希望理解
 
好的。你QQ多少?
 
后退
顶部