Получение ошибки Jpeg # 51 при загрузке из BLOB с Delphi 2010, отлично с Delphi 2006 - PullRequest
2 голосов
/ 01 сентября 2010

У меня есть старое приложение, разработанное в Delphi 2006, в которое мне теперь нужно было внести некоторые изменения.

В этом приложении я загружаю изображения из поля «image» MsSQL, но когда я компилирую с delphi2010 Я получаю сообщение об ошибке: «поднял класс исключений 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;

Погуглил немногои обнаружил, что ошибка # 51 означает: JERR_NO_QUANT_TABLE, что бы это ни значило.

Когда я компилирую с Delphi 2006, тот же код работает нормально без ошибок, так что же происходит с D2010?

Ответы [ 4 ]

3 голосов
/ 01 сентября 2010

Вы используете довольно неудобный способ сохранить поле большого двоичного объекта в поток.Почему вы не используете TBlobField.SaveToStream ?

3 голосов
/ 01 сентября 2010

В D2010 Char изменился с Ansi на Unicode, что означает, что он занимает два байта вместо одного. Измените ваши переменные в LoadFromBlob на AnsiString и PAnsiChar, и это должно работать.

Обновление: вместо Field.Value (Variant) вам лучше получить доступ к Field.AsAnsiString; Вариант доступа может включать неявное преобразование Unicode-> Ansi, которое приводит к ошибке.

1 голос
/ 01 сентября 2010

Зачем вообще идти по струнам?Как насчет прямой записи в поток?Поле изображения, вероятно, является TBlobField или TGraphicField.У них есть метод SaveToStream, который идеально подойдет вашим потребностям.

1 голос
/ 01 сентября 2010

Сохраните ваш aStream в файл и проверьте его с помощью шестнадцатеричного редактора. Сравните результаты D2006 и D2010. То, что вы там найдете, должно убедить вас, что это не имеет ничего общего с заголовком JPEG, и, скорее всего, это проблема Unicode / Widechar.

...