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;
uj5u.com熱心網友回復:
這通常是流處理程序中的錯誤。uj5u.com熱心網友回復:
正解。
uj5u.com熱心網友回復:
通過二進制資料流的方式,讀寫圖片,把圖片存入資料庫uj5u.com熱心網友回復:
我的印象中,這個跟流處理沒有關系,好像就是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;
uj5u.com熱心網友回復:
宣告中加入jpeg,用image也一樣沒問題uj5u.com熱心網友回復:
兄弟,你這句錯了://以流的方式進行處理,避免存盤成檔案
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;
uj5u.com熱心網友回復:
myjpeg.Assign(newmybmp);//按新的影像質量進行壓縮
myjpeg.CompressionQuality:= 90; //以質量90進行壓縮
myjpeg.Compress;
//顯示處理過的圖片
image1.Picture.Assign(myjpeg);
在此處除錯看一下myjpeg是否為空值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36014.html
標籤:VCL組件開發及應用
