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

Вниз

Не могу вытащить из поля типа TBlobField иконку в Gif формате   Найти похожие ветки 

 
ksushishka   (2003-03-18 18:23) [0]

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


 
Problem ©   (2003-03-18 18:46) [1]

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


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

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


 
Problem ©   (2003-03-18 19:04) [3]

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

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

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

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

Десь так !! :)


 
ksushishka ©   (2003-03-19 12:49) [4]

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


 
Clickmaker ©   (2003-03-19 13:04) [5]

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


 
y-soft ©   (2003-03-19 13:27) [6]

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


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

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

//Простейшая функция определения графического класса
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;



 
ksushishka ©   (2003-03-19 18:59) [8]

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


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

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


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

TBlobField.SaveToStream(S)?!

var Blob: TBlobField;

Blob.SaveToStream(S);

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


 
ksushishka ©   (2003-03-20 12:03) [11]

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


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

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


 
ksushishka ©   (2003-03-20 12:29) [13]

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


 
Clickmaker ©   (2003-03-20 12:38) [14]

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

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

var Stream: TBlobStream;

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


 
ksushishka ©   (2003-03-20 13:09) [15]

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


 
y-soft ©   (2003-03-20 13:47) [16]

>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 17:00) [17]

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


 
y-soft ©   (2003-03-20 17:02) [18]

>ksushishka © (20.03.03 17:00)

Рады за Вас:)


 
ksushishka ©   (2003-03-20 17:20) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
14-30563
michael_b
2003-03-23 14:03
2003.04.10
Что начать изучать MathCAD, Maple или MatLab?


14-30585
bpv
2003-03-25 10:32
2003.04.10
update pack 1 для delphi 7


3-30237
Timer
2003-03-20 22:04
2003.04.10
Хранение форматированного текста в БД


1-30399
DenisX
2003-03-30 15:30
2003.04.10
Работа с классами


14-30587
Arkady
2003-03-24 08:31
2003.04.10
Дублирование писем. Спам?