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

Вниз

Как сделать LoadFromStream для TPicture ?   Найти похожие ветки 

 
Графиг   (2005-07-15 01:26) [0]

В модуле Graphics.pas есть процедура загрузки из файла.

procedure TPicture.LoadFromFile(const Filename: string);
var
 Ext: string;
 NewGraphic: TGraphic;
 GraphicClass: TGraphicClass;
begin
 Ext := ExtractFileExt(Filename);
 Delete(Ext, 1, 1);
 GraphicClass := FileFormats.FindExt(Ext);
 if GraphicClass = nil then
   raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]);

 NewGraphic := GraphicClass.Create;
 try
   NewGraphic.OnProgress := Progress;
   NewGraphic.LoadFromFile(Filename);
 except
   NewGraphic.Free;
   raise;
 end;
 FGraphic.Free;
 FGraphic := NewGraphic;
 FGraphic.OnChange := Changed;
 Changed(Self);
end;


А мне нужно тоже самое, но только из потока. Как это можно сделать иди переделать ? А то у меня чего то не получается.


 
Defunct ©   (2005-07-15 01:36) [1]

> Графиг   (15.07.05 01:26)  

типа такого проще всего:

procedure TPicture.LoadFromStream( AStream : TStream );
begin
 AStream.SaveToFile(TempFileName);
 LoadFromFile(TempFileName)
end;


Проблема-то в том, что из стрима нельзя определить тип рисунка. Поэтому для TPicture и нет метода загрузки из стрима. Пользуйтесь лучше TBitmap/TJPEGImage вместо TPicture.


 
Графиг   (2005-07-15 01:38) [2]


> Defunct ©   (15.07.05 01:36) [1]
> > Графиг   (15.07.05 01:26)  
>
> типа такого проще всего:
>
> procedure TPicture.LoadFromStream( AStream : TStream );
> begin
>  AStream.SaveToFile(TempFileName);
>  LoadFromFile(TempFileName)
> end;


Я знаю. Только насиловать жёсткий диск огромным файлом - это не уровень мастеров Дельфи.


> Проблема-то в том, что из стрима нельзя определить тип рисунка.

Я его могу указать в качестве дополнительного параметра.


 
Defunct ©   (2005-07-15 01:52) [3]

> Графиг   (15.07.05 01:38) [2]
> Только насиловать жёсткий диск огромным файлом - это не уровень мастеров Дельфи.

Да уж.. по Вашему лучше насиловать ВАП копией "огромного" файла?

> Я его могу указать в качестве дополнительного параметра.

Imho это будет не очень красивое решение, но вполне работоспособное.

PS: зачем именно Picture? почему бы (раз вы знаете тип рисунка) не работать с конкретным типизированным рисунком?


 
ЮЮ ©   (2005-07-15 04:55) [4]

>GraphicClass := FileFormats.FindExt(Ext);

Всего-то и делов, подставить вместо Ext-а из имени файла твой тот самый параметр, дабы получить првильный GraphicClass


 
Джо ©   (2005-07-15 05:17) [5]


> [4] ЮЮ ©   (15.07.05 04:55)
> Всего-то и делов, подставить вместо Ext-а из имени файла
> твой тот самый параметр, дабы получить првильный GraphicClass

Не откажу себе в удовольствии произнести сакраментальную фразу: "А ты попробуй", не правя оригинальный Graphics.pas ;-)


 
ЮЮ ©   (2005-07-15 10:39) [6]

И впрямь, дл списка зарегестрированных типов хрен доберешься.
Однако стандартный настолько скуп, что не трудно и перечистлить их в споей процедуре, типа

procedure LoadPictureFromStream(AStream: TStream; Picture: TPicture; Ext: string);
var
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
if Ext = "wmf" then GraphicClass := TMetafile
else if Ext = "ico" then GraphicClass := TIcon
else if Ext = "bmp" then GraphicClass := TBitmap
 // здесь расширяем при подключении соответствующих модулей
else if Ext = "jpg" then GraphicClass := TJPEGImage
 //
else GraphicClass := nil;
if GraphicClass <> nil then begin
  NewGraphic := GraphicClass.Create;
  try
    NewGraphic.LoadFromStream(AStream);
    APicture.Assign(NewGraphic);
  finally
    NewGraphic.Free;
  end;
end;  

end;


 
Графиг   (2005-07-17 01:28) [7]


> ЮЮ ©   (15.07.05 10:39) [6]
> Однако стандартный настолько скуп, что не трудно и перечистлить
> их


Не так уж и скуп. Список форматов подерживаемых GraphicEx :
http://www.lischke-online.de/GraphicEx.php

TIFF images (*.tif; *.tiff), extended base line implementation
1..16 bits per sample
indexed, grayscale, RGB(A), CMYK, L*a*b*
uncompressed, packed bits, LZW, CCITT T.4, Thunderscan, Deflate, new style JPEG
GFI fax images (*.fax), uses TTIFFGraphic to read
SGI images (*.bw, *.rgb, *.rgba, *.sgi)
1..16 bits per sample
indexed, grayscale, RGB(A)
uncompressed, RLE
Autodesk images files (*.cel; *.pic) old style only
8 bits per sample, indexed and uncompressed
Truevision images (*.tga; *.vst; *.icb; *.vda; *.win), write support included
5 and 8 bits per sample
grayscale, indexed, 15 bits RGB (555), 24 bits RGB(A)(888)
uncompressed, RLE
ZSoft Paintbrush images (*.pcx, *.pcc; *.scr)
1..8 bits per sample
grayscale, indexed, RGB
uncompressed, RLE
Kodak Photo-CD images (*.pcd)
8 bits per sample in YCbCr in any resolution (192 x 128 up to 6144 x 4096)
Portable pixel/gray map images (*.ppm, *.pgm, *.pbm)
1 and 8 bits per sample
grayscale, indexed, RGB uncompressed
Dr. Halo images (*.cut, *.pal)
8 bits per sample indexed, RLE compressed
CompuServe images (*.gif)
1, 4, 8 bits per sample indexed, LZW compressed
SGI Alias/Wavefront images (*.rla, *.rpf)
8 bits per sample RGB(A), RLE compressed
Standard Windows bitmap images (*.bmp, *.rle, *.dib)
Photoshop images (*.psd, *.pdd)
1, 8, 16 bits per sample
indexed, RGB, CMYK, CIE L*a*b*
uncompressed and packed bits
Paintshop Pro images (*.psp)
1, 4, 8 bits per sample
indexed, grayscale, RGB
uncompressed, RLE and LZ77
single-layered files only!
Portable network graphic images (*.png)
1, 2, 4, 8, 16 bits per sample
indexed, grayscale alpha, RGB(A), LZ77 compressd

Ну, так, что, никто не знает как взломать Graphics.pas ?


 
Defunct ©   (2005-07-17 03:32) [8]

> Ну, так, что, никто не знает как взломать Graphics.pas ?

Зачем его ломать?
Берите да пишите свой LoadFromStream, тем более пример вам дали - [6].


 
Графиг   (2005-07-17 04:01) [9]


> Defunct ©   (17.07.05 03:32) [8]
> Зачем его ломать?

Это не ответ. Не умеешь так и скажи.
В GLScene есть хак для этого. ( http://delphimaster.net/view/1-1121378499/ ) Только он не у всех работает. Если его довести до ума, то будет нужная функция.


 
Набережных С   (2005-07-17 09:13) [10]

procedure SavePictureToStream(Picture: TPicture; Stream: TStream);
procedure LoadPictureFromStream(Picture: TPicture; Stream: TStream);

implementation

type
 TMPicture = class(TPicture);

 TMReader = class(TReader)
 private
   FStream: TStream;
 public
   constructor Create(Stream: TStream; BufSize: Integer);
   procedure DefineBinaryProperty(const Name: string;
                   ReadData, WriteData: TStreamProc;
                   HasData: Boolean); override;
 end;

 TMWriter = class(TWriter)
 private
   FStream: TStream;
 public
   constructor Create(Stream: TStream; BufSize: Integer);
   procedure DefineBinaryProperty(const Name: string;
                   ReadData, WriteData: TStreamProc;
                   HasData: Boolean); override;
 end;

const
 SErrorParam1 = "Invalid "Stream" parameter!";
 SErrorParam2 = "Invalid "Picture" parameter!";

{ TMWriter }

constructor TMWriter.Create(Stream: TStream; BufSize: Integer);
begin
 inherited;
 FStream:=Stream;
end;

procedure TMWriter.DefineBinaryProperty(const Name: string; ReadData,
 WriteData: TStreamProc; HasData: Boolean);
begin
 WriteData(FStream);
end;

{ TMReader }

constructor TMReader.Create(Stream: TStream; BufSize: Integer);
begin
 inherited;
 FStream:=Stream;
end;

procedure TMReader.DefineBinaryProperty(const Name: string; ReadData,
 WriteData: TStreamProc; HasData: Boolean);
begin
 ReadData(FStream);
end;

procedure SavePictureToStream(Picture: TPicture; Stream: TStream);
var
 Wr:TMWriter;
begin
 if not Assigned(Stream) then
   raise Exception.Create(SErrorParam1);
 if not Assigned(Picture) then
   raise Exception.Create(SErrorParam2);
 Wr:=TMWriter.Create(Stream , 0);
 try
   TMPicture(Picture).DefineProperties(Wr);
 finally
   Wr.Free;
 end;
end;

procedure LoadPictureFromStream(Picture: TPicture; Stream: TStream);
var
 Rd:TMReader;
begin
 if not Assigned(Stream) then
   raise Exception.Create(SErrorParam1);
 if not Assigned(Picture) then
   raise Exception.Create(SErrorParam2);
 Rd:=TMReader.Create(Stream , 0);
 try
   TMPicture(Picture).DefineProperties(Rd);
   TMPicture(Picture).Changed(Picture);
 finally
   Rd.Free;
 end;
end;


 
Defunct ©   (2005-07-17 15:57) [11]

Графиг   (17.07.05 04:01) [9]

Молодой человек, Вы мало того что лентяй, так еще и хам.



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

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

Наверх




Память: 0.5 MB
Время: 0.05 c
3-1119874036
bigcrush
2005-06-27 16:07
2005.08.07
Запрос удаления повторяющихся данных на SQL


14-1120578423
NewWonder
2005-07-05 19:47
2005.08.07
Сделал курсовик и ...


4-1117717537
AlexTregubov
2005-06-02 17:05
2005.08.07
Плоский ComboBox


6-1114407484
GooGoo
2005-04-25 09:38
2005.08.07
Автозаполнение в FireFox


1-1121881713
Андрей Молчанов
2005-07-20 21:48
2005.08.07
Работа с указателями