Erhalten Jpeg Fehler # 51 beim Laden von BLOB mit Delphi 2010, fein w Delphi 2006
-
26-09-2019 - |
Frage
Ich habe eine alte Anwendung entwickelt in Delphi 2006, dass ich jetzt benötigt, um einige Änderungen in machen.
In dieser App, bin ich das Laden von Bildern von einem MsSQL „Bild“ -Feld aber wenn ich mit Delphi 2010 kompilieren bekomme ich die Fehlermeldung: "Angehoben Ausnahmeklasse EJPEG mit Meldung 'JPEG-Fehler # 51'."
Der Code, der get ist das Bild aus der Datenbank:
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;
gegoogelt um ein wenig und fand heraus, dass Fehler # 51 bedeutet:. JERR_NO_QUANT_TABLE, was immer das bedeutet
Wenn ich mit Delphi 2006 zu kompilieren, der gleiche Code funktioniert ohne Fehler, so was falsch läuft mit D2010?
Lösung
In D2010 Char geändert von Ansi in Unicode, dh es zwei Bytes statt eines einnimmt. Ändern Sie Ihre Variablen in LoadFromBlob zu Ansistring und PAnsiChar und es sollte funktionieren.
Update: Statt Field.Value (Variant) sollten Sie den Zugriff Field.AsAnsiString verbessern; Die Variante Zugang könnte eine implizite Unicode-> Ansi Umwandlung umfasst, die den Fehler einführt.
Andere Tipps
Sie verwenden eine eher unangenehme Art und Weise ein BLOB-Feld zu einem Strom zu sparen. Warum sind Sie nicht mit TBlobField.SaveToStream ?
Speichern Sie Ihre AStream in eine Datei aus und mit einem Hex-Editor untersuchen. Vergleichen Sie die D2006 und D2010 Ergebnisse. Was Sie finden dort sollten Sie überzeugen, dass es die nichts mit dem JPEG-Header zu tun, und es ist wahrscheinlich, eine Unicode / WideChar Problem.
Warum geht den Weg über die Saiten überhaupt? Was das Schreiben über direkt an den Strom? Das Bildfeld ist wahrscheinlich ein TBlobField oder TGraphicField. Die haben eine SaveToStream Methode, die Ihre Bedürfnisse perfekt passen würde.