Текущий архив: 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