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

Вниз

Как загрузить JPEG из массива ?   Найти похожие ветки 

 
Кен ©   (2003-10-22 01:54) [0]

Есть массив и TJPEGImage :
var
JpegFile : array[1..1000000] of byte;
JpegImage : TJPEGImage;

В JpegFile находится картинка в формате *.jpg, мне надо запихнуть её в JpegImage. Как это лучше сделать ?

Проще всего сохранить JpegFile во временный файл, а потом :
JPEG := TJPEGImage.Create;
JPEG.LoadFromFile("temp.jpg");


Но по-моему делать загрузку через временные файлы - это делать через ж**у. Это будет тормозить, да и зачем насиловать диск ? Можно ли как-нибудь этого избежать ?


 
Думкин ©   (2003-10-22 04:46) [1]

LoadFromStream?


 
Кен ©   (2003-10-22 05:11) [2]


> Думкин © (22.10.03 04:46) [1]
> LoadFromStream?

А как конкретно ?

Вот массив :
var
JpegFile : array[1..1000000] of byte;


Вот стрим :
var
Stream1 : TStream;
begin
Stream1 := TStream.Create;


Вот ЖПГ :
var
JpegImage : TJPEGImage;
begin
JPEG := TJPEGImage.Create;


Как именно это делается ?


 
Кен ©   (2003-10-22 06:09) [3]

Капаясь в модуле Graphics.pas обнаружил что LoadFromFile работает через LoadFromStream .

procedure TGraphic.LoadFromFile(const Filename: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;

Так, что все дороги ведут в стрим.

Как мне запихнуть в стрим TMemoryStream мой массив с картинокой JpegFile : array[1..1000000] of byte; ?


 
Думкин ©   (2003-10-22 06:54) [4]

var M : TMemoryStream;

M := TMemoryStream.Create;
try
M.SetSize(1000000);
M.WriteBuffer(JpegFile[1], 1000000);
.....
finally
M.Free
end


 
Кен ©   (2003-10-22 07:28) [5]


> Думкин © (22.10.03 06:54) [4]

Чего то у меня всё равно никак не получается.

var
JpegFile : array[1..1000000] of byte;
JpegFileSize : Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
JPEG: TJPEGImage;
Bitmap: TBitmap;
Stream : TMemoryStream;
begin
JPEG := TJPEGImage.Create;
try
Stream := TMemoryStream.Create;
try
//JPEG.LoadFromFile("test.jpg");
Stream.SetSize(JpegFileSize);
Stream.WriteBuffer(JpegFile[1], JpegFileSize);
JPEG.LoadFromStream(Stream);
finally
Stream.Free;
end;
Image1.Picture.Assign(JPEG);
finally
JPEG.Free;
end;
end;
end;


Пишет "JPEG Error #42" .
Если использовать JPEG.LoadFromFile("test.jpg");, то всё работает.


 
MBo ©   (2003-10-22 08:05) [6]

намёк - твой жипег занимает именно 1000000 байт?


 
icWasya ©   (2003-10-22 09:22) [7]


......
Stream.WriteBuffer(JpegFile[1], JpegFileSize);
Stream.Seek(0,0);
JPEG.LoadFromStream(Stream);
.....


 
Думкин ©   (2003-10-22 11:15) [8]


> [6] MBo © (22.10.03 08:05)

Зверь. Ну - он хотел, он получил. А что там в этих 1000000 - его проблемы.
Если все встает на уши - ну так. :=))


 
Amoeba   (2003-10-22 15:36) [9]

А с какой высоконаучной целью этот злосчастный JPEG был засунут в данный массив??? Ради чего нужно было создавать себе проблему чтобы потом мучаться с ее решением?


 
Кен ©   (2003-10-23 02:09) [10]


> MBo © (22.10.03 08:05) [6]
> намёк - твой жипег занимает именно 1000000 байт?

Нет. Это я отвожу под него такой массив,
var
JpegFile : array[1..1000000] of byte;

а потом записываю в него Жпг. Длина жпг в отдельной переменной.
Конечно надо бы подровнять массив под длину Жпг, каким нибудь Alloc, ReAlloc, но у меня на это выдавались ошибки и я поленился разбираться с этим. Ибо непринципиально.

Кстати, как правильно подравнять длинну ?


> icWasya © (22.10.03 09:22) [7]
>
> ......
> Stream.WriteBuffer(JpegFile[1], JpegFileSize);
> Stream.Seek(0,0);
> JPEG.LoadFromStream(Stream);
> .....

Да, правильно. Я кстати, пока уходил тоже нашёл это решение. Только в другой форме :
Stream.Position := 0;
В принципе всё одно и тоже.


> Думкин © (22.10.03 11:15) [8]
>
> > [6] MBo © (22.10.03 08:05)
>
> Зверь. Ну - он хотел, он получил. А что там в этих 1000000
> - его проблемы.

А в чём проблема то ? Жалко одного мегабайта из пятьсотдвенадцати что-ли ?


> Amoeba (22.10.03 15:36) [9]
> А с какой высоконаучной целью этот злосчастный JPEG был
> засунут в данный массив??? Ради чего нужно было создавать
> себе проблему чтобы потом мучаться с ее решением?

Чтобы не держать кучу мелких файлов в одной папке, ( это сильно увеличивает занимаемый ими объём за счёт кластеризации, и неудобно когда много файлов ) они были помещеры в один большой файл из которого их можно извлечь в массив оф байт. Плюс возможность шифровки.


 
ЮЮ ©   (2003-10-23 09:30) [11]

На один большой файл тоже можно натравить TFileStream и устанавливая соответстыующий Position делать JPEG.LoadFromStream(FileStream). Зачем целый 1М из жалких 512 забивать балластом?


 
Думкин ©   (2003-10-23 09:46) [12]


> [11] ЮЮ © (23.10.03 09:30)

Проблема кривых рук. ИМХО.


 
Amoeba   (2003-10-23 11:54) [13]

Кен © (23.10.03 02:09) [10]
См. ЮЮ
или можно отобразив этот файл в память работать с ним как с байтовым массивом. И нечего этот файл целиком грузить в память.


 
Anatoly Podgoretsky ©   (2003-10-23 12:06) [14]

Думкин © (23.10.03 09:46) [12]
Руки?


 
Кен ©   (2003-10-24 02:01) [15]


> ЮЮ © (23.10.03 09:30) [11]
> На один большой файл тоже можно натравить TFileStream и
> устанавливая соответстыующий Position делать JPEG.LoadFromStream(FileStream).

Из большого файла, что на диске, считывается только нужная часть
Assign ... Seek ... BlockRead ...


> Зачем целый 1М из жалких 512 забивать балластом?

Ладно, хорошо.
var
JpegFile : array of byte;
...
SetLength(JpegFile, JpegFileSize);


Кстати, по ходу возник вопрос. Как ПРОСТО определить размер файла на диске ?
В справке какой то бред приводится :

procedure TForm1.Button1Click(Sender: TObject);
var
f: file of Byte;
size: Longint;
S: string;
y: Integer;
begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
try
size := FileSize(f);
S := "File size in bytes: " + IntToStr(size);
y := 10;
Canvas.TextOut(5, y, S);
finally
CloseFile(f);
end;
end;

Мне бы чего попроще. В виде одной функции, без этих Assign, ресет и прочего.


 
wnew ©   (2003-10-24 03:05) [16]


Unit
Sysutils

type
TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

function FileGetAttr(const FileName: string): Integer;

Но, для того, что бы воспользоваться этой функцией, файл всё равно нужно открыть для чтения.


 
wnew ©   (2003-10-24 04:15) [17]

Нет, чушь, прошу прощения:)
Проще всего, всё-таки через Reset и FileSize, а можно ещё FindFirst использовать без открытия файла. И в выше приведёном списке есть вся информация о файле.



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

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

Наверх




Память: 0.51 MB
Время: 0.025 c
7-8705
OlegV
2003-08-25 15:18
2003.11.03
Копирование файлов


14-8637
Davinchi
2003-10-14 14:28
2003.11.03
Запуск приложения и получение его заголовка и класса


1-8343
Talla2k
2003-10-22 21:42
2003.11.03
поиск компонента


1-8352
DimaK
2003-10-24 16:32
2003.11.03
RichEdit


6-8561
KMI
2003-09-08 11:09
2003.11.03
TWebBrouser