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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top