Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Вниз

Как загрузить 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
3-8277
denmin
2003-10-13 11:19
2003.11.03
Помогите. Печать структуры Paradox.


8-8546
LK
2003-06-29 15:37
2003.11.03
Запись музыки


1-8355
Endi
2003-10-22 22:22
2003.11.03
Запись и чтение в файл.


1-8525
dolphin1
2003-10-23 16:45
2003.11.03
Start up programs


1-8379
Lena19
2003-10-22 23:14
2003.11.03
где взять модуль SusUtils





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский