DELPHI SQL 二进制流读取存储图片出现错误

everstar1984 2018-10-01 04:58:16
image控件实现数据流形式保存图片时出现错误,提示JPEG ERROR #53,已经写了use jpeg,请大神们帮忙看下是什么问题。
具体代码如下:
procedure Tfrm_cztz.Image1Click(Sender: TObject); //image1控件单击调入图像
var
myjpeg : TJPEGImage;
oldmybmp,newmybmp :TBitmap;
oldw,oldh,neww,newh:integer;
oMemoStream : TMemoryStream;
begin
myjpeg := TJPEGImage.Create;
oldmybmp := TBitmap.Create;
newmybmp := TBitmap.Create;
oMemoStream := TMemoryStream.Create;
neww := 200;
newh := 200;
try
With OpenDialog1 do
begin
if Execute then
begin
cztz.Edit; //数据集置编辑状态,不然后面无法给数据集赋值
myjpeg.LoadFromFile(FileName);
//以下为按新尺寸进行缩放
oldmybmp.Assign(myjpeg);
oldw:= oldmybmp.Width;
oldh:= oldmybmp.Height;
newmybmp.Width := oldw * neww div oldw;
newmybmp.Height:= oldh * newh div oldH;
SetStretchBltMode(newmybmp.Canvas.Handle,HalfTone);
StretchBlt(newmybmp.Canvas.Handle,0,0,neww,newh,
oldmybmp.Canvas.Handle,0,0,oldw,oldh,SRCCOPY);
myjpeg.Assign(newmybmp);
//按新的图像质量进行压缩
myjpeg.CompressionQuality:= 90; //以质量90进行压缩
myjpeg.Compress;
//显示处理过的图片
image1.Picture.Assign(myjpeg);
//以流的方式进行处理,避免存储成文件
image1.Picture.Graphic.SaveToStream(oMemoStream);
oMemoStream.Position :=0;
TBlobField(cztz.FieldbyName('截图')).LoadFromStream(oMemoStream);
cztz.Post;
messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
end
else
exit;
end;
finally
//释放
myjpeg.Free;
oldmybmp.Free;
newmybmp.Free;
oMemoStream.Free;
end;
end;



procedure TFrm_cztz.ADOQueryAfterScroll(DataSet: TDataSet);//SQL显示JPEG方法
var
oMemoStream : TMemoryStream;
pic:tjpegimage;
begin
oMemoStream := TMemoryStream.Create;
pic := TJpegimage.Create;
try
if not cztz.FieldByName('截图').IsNull then
begin
TBlobField(cztz.FieldByName('截图')).SaveToStream(oMemoStream);
oMemoStream.Position :=0;
pic.LoadFromStream(oMemoStream);
Image1.Picture.Graphic:= pic;
end
else
begin
Image1.Picture:= nil;
end;
finally
oMemoStream.Free;
pic.Free;
end;
end;
...全文
561 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2018-11-15
  • 打赏
  • 举报
回复
myjpeg.Assign(newmybmp);
//按新的图像质量进行压缩
myjpeg.CompressionQuality:= 90; //以质量90进行压缩
myjpeg.Compress;
//显示处理过的图片
image1.Picture.Assign(myjpeg);

在此处调试看一下myjpeg是否为空值
rslxy 2018-11-10
  • 打赏
  • 举报
回复
兄弟,你这句错了:
//以流的方式进行处理,避免存储成文件
image1.Picture.Graphic.SaveToStream(oMemoStream);

这里会保存成为BMP格式图片数据,而你在后面的数据库读取代码时,又是直接用jpg去读,肯定会出现Jpeg error 53

TGpegImage(pic).LoadFromStream(oMemoStream);


因此,需要修改这里:
myjpeg.Compress;
//显示处理过的图片
image1.Picture.Assign(myjpeg);
//以流的方式进行处理,避免存储成文件
//注销这句
// image1.Picture.Graphic.SaveToStream(oMemoStream);
//修改成这样
myjpeg.SaveToStream(oMemoStream);
oMemoStream.Position :=0;



ptvbs 2018-11-07
  • 打赏
  • 举报
回复
声明中加入jpeg,用image也一样没问题
ynquan 2018-11-06
  • 打赏
  • 举报
回复
通过二进制数据流的方式,读写图片,把图片存入数据库
ynquan 2018-11-06
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
这通常是流处理过程中的错误。

正解。
kenlewis 2018-11-06
  • 打赏
  • 举报
回复
我的印象中,这个跟流处理没有关系,好像就是Image控件与jpeg的问题。
处理流还是同样的代码,但是我把Image控件换成ImageEN控件就没这个问题了。

Buf := TMemoryStream.Create;
with qryTech do
begin
TBlobField(qryTech.FieldByName('Pic1')).SaveToStream(Buf);
Buf.Position :=0;
try
ImageEn1.IEBitmap.Read(Buf);
finally
end;
Buf.Clear;
TBlobField(qryTech.FieldByName('Pic2')).SaveToStream(Buf);
Buf.Position :=0;
try
ImageEn2.IEBitmap.Read(Buf);
finally
end;
lyhoo163 2018-10-01
  • 打赏
  • 举报
回复
这通常是流处理过程中的错误。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧