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