Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу вытащить из поля типа TBlobField иконку в Gif формате [D6]


ksushishka ©   (2003-03-18 18:23:00) 

Уже битый час пытаюсь вытащить из поля типа TBlobField иконку,а она в формате Gif. Что мне делать? Пыталась с помощью TBlobField.SaveToStream не получается. Помогите пожалуйста


ksushishka   (2003-03-20 17:20:00) [1]

Приятно осознавать, что на свете есть добрые люди


y-soft   (2003-03-20 17:02:00) [2]

>ksushishka © (20.03.03 17:00)

Рады за Вас:)


ksushishka   (2003-03-20 17:00:00) [3]

Спасибо большое за советы, они мне очень помогли. У меня все получилось


y-soft   (2003-03-20 13:47:00) [4]

>ksushishka © (20.03.03 13:09)
Можно и так. Просто в проекте, откуда выдран код, TMemoryStream был удобней. Из-за дефицита времени код не был оптимизирован после удаления не относящихся к subj частей, хотелось показать лишь общий принцип...

procedure LoadPicture(Blob : TBlobField; Picture : TPicture);
var
S : TBlobStream;
MF : TGraphic;
GClass : TGraphicClass;
begin
if not Blob.IsNull then
begin
S := TBlobStream.Create(Blob, bmRead);
try
S.Seek(0, 0);
if S.Size > 1 then
begin
S.Seek(0, 0);
GClass := StreamGraphicClass(S);
if assigned(GClass) then
begin
MF := GClass.Create;
try
MF.LoadFromStream(S);
if not MF.Empty then
Picture.Assign(MF);
finally
MF.Free;
end;
end;
end;
finally
S.Free;
end;
end;
end;


ksushishka   (2003-03-20 13:09:00) [5]

Слушай, он эту строчку проглотил Stream := TBLOBStream.Create(BlobField, bmRead);


Clickmaker   (2003-03-20 12:38:00) [6]

Может быть Blob не проинициализирована или Dataset не открыт. Blob то не равен nil случайно?

Есть и такой способ выкачивания данных из блобов

var Stream: TBlobStream;

Stream := TBLOBStream.Create(BlobField, bmRead);
try
...
MF.LoadFromStream(Stream);
...
finally
Stream.Free;
end;


ksushishka   (2003-03-20 12:29:00) [7]

Access violation at adress 004ACFCE in modal ...REad of adress 000000088. Вот


Clickmaker   (2003-03-20 12:17:00) [8]

Если б ты еще написала само ругательство... Странно, вроде все законно. Или в 6 дельфи пропал метод TBloField.SaveToStream? Но чего-то не верится...


ksushishka   (2003-03-20 12:03:00) [9]

ДА, на это. Как я по другому могу вытащить информацию из этого поля?


Clickmaker   (2003-03-20 11:58:00) [10]

TBlobField.SaveToStream(S)?!

var Blob: TBlobField;

Blob.SaveToStream(S);

Не не это ругается?


ksushishka   (2003-03-20 11:49:00) [11]

Все было бы неплохо, но делфя ругается на строчку TBlobField.SaveToStream(S) Как мне ее обойти?


ksushishka   (2003-03-19 18:59:00) [12]

СПАСИБО ОГГГГРРРРРООООМНОЕ


y-soft   (2003-03-19 13:43:00) [13]

Вот рабочий пример:

//Простейшая функция определения графического класса
function StreamGraphicClass(S : TStream) : TGraphicClass;
var
Pos : integer;
function IsBitmap : boolean;
var
BMPHeader : TBitmapFileHeader;
begin
Result := False;
if S.Size >= SizeOf(TBitmapFileHeader) then
begin
Pos := S.Position;
S.Seek(0,soFromBeginning);
S.ReadBuffer(BMPHeader, SizeOf(TBitmapFileHeader));
S.Position := Pos;
Result := BmpHeader.bfType = $4D42;
end;
end;
function IsMetafile : boolean;
type
PMetafileHeader = ^TMetafileHeader;
TMetafileHeader = packed record
Key : Longint;
Handle : SmallInt;
Box : TSmallRect;
Inch : Word;
Reserved : Longint;
CheckSum : Word;
end;
var
MFHeader : TMetafileHeader;
EMFHeader : TEnhMetaHeader;
begin
Result := False;
if S.Size >= SizeOf(TEnhMetaHeader) then
begin
Pos := S.Position;
S.Seek(0,soFromBeginning);
S.ReadBuffer(EMFHeader, SizeOf(TEnhMetaHeader));
S.Position := Pos;
Result := EMFHeader.dSignature = ENHMETA_SIGNATURE;
end;
if not Result and (S.Size >= SizeOf(TMetaFileHeader)) then
begin
Pos := S.Position;
S.Seek(0,soFromBeginning);
S.ReadBuffer(MFHeader, SizeOf(TMetaFileHeader));
S.Position := Pos;
Result := MFHeader.Key = integer($9AC6CDD7);
end;
end;
function IsJpegImage : boolean;
type
TJPGSignature = array[0..9] of Byte;
const
JPGSignature : TJPGSignature =
($FF, $D8, $FF, $E0, $00, $10, $4A, $46, $49, $46);
var
I : integer;
JPGS : TJPGSignature;
begin
Result := False;
if S.Size >= SizeOf(JPGSignature) then
begin
Pos := S.Position;
S.Seek(0,soFromBeginning);
S.ReadBuffer(JPGS, SizeOf(TJPGSignature));
S.Position := Pos;
for I := Low(JPGSignature) to High(JPGSignature) do
if JPGSignature[I] <> JPGS[I] then
exit;
Result := True;
end;
end;
function IsGifImage : boolean;
type
TGIFVersionRec = array[0..2] of char;
TGIFHeaderRec = packed record
Signature : array[0..2] of char; { contains "GIF" }
Version : TGIFVersionRec; { "87a" or "89a" }
end;
var
GIFHeader : TGIFHeaderRec;
begin
Result := False;
if S.Size >= SizeOf(TGIFHeader) then
begin
Pos := S.Position;
S.Seek(0,soFromBeginning);
S.ReadBuffer(GIFHeader, SizeOf(TGIFHeader));
S.Position := Pos;
Result := UpperCase(GIFHeader.Signature) = "GIF";
end;
end;
begin
if IsMetafile then
Result := TMetafile
else if IsGIFImage then
Result := TGifImage
else if IsBitmap then
Result := TBitmap
else if IsJPEGImage then
Result := TJPEGImage
else
Result := nil;
end;

//Загрузка графики из BLOB
procedure LoadPicture(Blob : TBlobField; Picture : TPicture);
var
S : TMemoryStream;
MF : TGraphic;
GClass : TGraphicClass;
begin
S := TMemoryStream.Create;
S.Seek(0, 0);
if not Blob.IsNull then
try
Blob.SaveToStream(S);
S.Seek(0, 0);
GClass := StreamGraphicClass(S);
if assigned(GClass) then
begin
if GClass = TGifImage then
MF := TGifImage.Create
else
MF := GClass.Create;
end;
if S.Size > 1 then
MF.LoadFromStream(S);
if not MF.Empty then
Picture.Assign(MF);
finally
S.Free;
MF.Free;
end;
end;


y-soft   (2003-03-19 13:27:00) [14]

Попробуйте этот вариант TGIFImage, мне больше нравится, чем тот, что в RX. Там и примеры есть...
http://finn.mobilixnet.dk/delphi/


Clickmaker   (2003-03-19 13:04:00) [15]

В библиотеке RxLib есть компонент TGIFImage. Поюзай его - не пожалеешь!


ksushishka   (2003-03-19 12:49:00) [16]

Это тоже самое, я попробовала ничего не вышло. Он не понимает формата Gif. Jpeg же читает


Problem   (2003-03-18 19:04:00) [17]

Не по моему это ты не понял, или не поняла !!
Дело в том, что тебе надо не сохранять в поток а создать его, а потом в него записать само содержание этого поля. Примера с картинками у меня нет. За то есть пример с RTF форматом, который мало чем для потока отличаеться !!!
var RCHStr : TsTREAM;
begin
RCHStr := TsTREAM.Create; // Создаешь поток

RCHStr := TBl.CreateBlobStream(<Считываемое поле>,bmRead); // Считываешь поток

RichEdit1.Lines.LoadFromStream(RCHStr); // А вот тут загружаешь его в нужный компонент

RCHStr.Free; // Освобождаешь поток

Десь так !! :)


ksushishka   (2003-03-18 18:55:00) [18]

Ты не понял. Картинки из базы в DBGridе не отображаются, поэтому я хочу сначала сохранить в поток, а потом уже отобразить, а именно в поток он сохранять и не хочет


Problem   (2003-03-18 18:46:00) [19]

Слушай, мне так кажеться, что ты немного чего то напутал
TBlobField.SaveToStream сохраняет в блоб поле, тебе надо что то типа
RCHStr := .. .CreateBlobStream(Field,bmRead) а далее
.. .LoadFromStream(RCHStr)
Так ты будешь считывать !!


Наверх

Титульная страница Поиск, карта сайта Написать письмо