Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

Как определить, какая картинка в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
1-98620
RoLeX
2003-10-17 14:41
2003.10.30
Как сделать, чтобы форма показывалась поверх всех окон???


1-98732
real_fatboy
2003-10-21 16:58
2003.10.30
Подскажите пож. как новое окошко создать... :)


1-98636
off
2003-10-17 12:24
2003.10.30
Как сохранить данные?


1-98741
jack128
2003-10-20 14:41
2003.10.30
Обработка исключений в разных потоках


8-98744
Dankin
2003-07-01 03:28
2003.10.30
Как побороть мерцание?