Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизКак определить, какая картинка в Stream? Найти похожие ветки
← →
AndrewK (2003-10-09 17:56) [0]Доброго времени суток.
Работаю с базой данных MS SQL. Сохраняю картинку в блоб поле, затем читаю его в TImage.
Читаю так:
CommonData.Photo.Picture.Assign(TBlobField(FieldByName("Photo")));
Записываю так:
MStream := TMemoryStream.Create;
SP := TADOStoredProc.Create(nil);
try
CardCompany.CommonData.TradeMark.Picture.Graphic.SaveToStream(MStream);
SP.Connection := DM.dbConn;
SP.ProcedureName := "TradeMarkSET";
SPParam := SP.Parameters.AddParameter;
SPParam.Value := ID;
SPParam := SP.Parameters.AddParameter;
SPParam.LoadFromStream(MStream, ftBlob);
SP.ExecProc;
finally
SP.Free;
MStream.Free;
end;
С BMP все проходит хорошо, только большие они очень. Добавил модуль JPEG для работы с jpg.
Сохраняется нормально, читать уже не получается. BMP читаются нормально, а на JPG вылетает ошибка.
Как можно определить, какой формат находится в потоке, и как его засунуть в TImage? Может есть другой способ чтения картинок из базы.
Работать с Edit - Post нельзя - используется клиент-серверная технология.
Работаю на ADO c MS SQL 2000.
← →
Brahman (2003-10-09 18:06) [1]В блоб находится то, что положил.
Поэтому и алгоритм чтения на тебе.
Если кладешь jpg то и читать должен jpg
Либо введи дополнительное поле-тип содержимого
← →
Romkin (2003-10-09 18:09) [2]По сигнатуре. Для bmp - первые два байта всегда BM
jpeg - смотри по смещению JFIF
wmf - тоже есть :)
Не тестировано, так, заглушка
function GetStreamImgType(Stream: TStream): TClass;
var
StreamPos: int64;
ImgSign: string;
begin
StreamPos := Stream.Position;
try
//BMP если не определено
Result := Graphics.TBitmap;
//JPEG
SetLength(ImgSign, 16);
Stream.Read(ImgSign[1], 16);
if pos("JFIF", ImgSign) > 0 then
Result := Jpeg.TJPEGImage;
//WMF
Stream.Position := StreamPos;
SetLength(ImgSign, 4);
Stream.Read(ImgSign[1],4);
if ImgSign = #$D7#$CD#$C6#$9A then
Result := Graphics.TMetafile;
finally
Stream.Position := StreamPos;
end;
end;
procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
Img: TGraphic;
StreamPos: int64;
begin
StreamPos := Stream.Position;
Img := TGraphicClass(GetStreamImgType(Stream)).Create;
try
Stream.Position := StreamPos;
Img.LoadFromStream(Stream);
Picture.Graphic := Img;
finally
Img.Free;
end;
end;
← →
Arm79 (2003-10-09 18:10) [3]Проблема, уверен, в том, что картинка отображается в DBImage. Отображай картинку вручную черех Image через Image.Picture.Graphic:=JpegImage.
← →
Danilka (2003-10-10 08:36) [4]Вообще-то, я делал примерно так, у меня работает:
jp:TJPEGImage;
Stream : TStream;
Blob : TBlobField;
begin
...
jp := TJpegImage.Create;
...
Stream := TBlobStream.Create(Blob, bmRead);
...
try
jp.LoadFromStream(Stream);
Image1.Picture.Bitmap.assign(jp);
Разве картинку раскодировать из джипега необязательно?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c