我有一个用 Delphi 2006 开发的旧应用程序,我现在需要对其进行一些更改。
在这个应用程序中,我从 MsSQL“图像”字段加载图像 但是当我用 delphi 2010 编译时出现错误: “引发异常类 EJPEG,消息为‘JPEG 错误 #51’。”
从数据库中获取图像的代码:
aStream := TMemoryStream.Create;
Try
If LoadFromBlob(FieldByName('Picture'), aStream) then
begin
Pic:=TJpegImage.Create;
try
Try
Pic.LoadFromStream(aStream);
Picture.Assign(Pic); // <------ JPEG Error #51 here w D2010
Except
//something went wrong loading
HandleImageError();
End;
finally
Pic.Free;
end;
end;
Finally
aStream.Free;
End;
// ............
function LoadFromBlob(const AField: TField; const Stream: TStream): boolean;
var
ResultStr: string;
PResultStr: PChar;
begin
Result := false;
if (Assigned(AField)) and (Assigned(Stream)) then begin
try
ResultStr := AField.Value;
If ResultStr <> '' then
begin
PResultStr := PChar(ResultStr);
Stream.Write(PResultStr^, Length(ResultStr));
Stream.Seek(0,0);
Result := true;
end;
except
end;
end;
end;
用 Google 搜索了一下,发现错误 #51 的意思是:JERR_NO_QUANT_TABLE,不管它是什么意思。
当我用 Delphi 2006 编译时,相同的代码可以正常工作,没有错误,那么 D2010 是怎么回事?
最佳答案
在 D2010 中,Char 从 Ansi 更改为 Unicode,这意味着它占用两个字节而不是一个字节。 将 LoadFromBlob 中的变量更改为 AnsiString 和 PAnsiChar,它应该可以工作。
更新:您最好访问 Field.AsAnsiString,而不是 Field.Value(变体);变体访问可能包括引入错误的隐式 Unicode->Ansi 转换。
关于database - 使用 Delphi 2010 从 BLOB 加载时出现 Jpeg 错误 #51,在 Delphi 2006 中正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618252/