Форум: "Основная";
Текущий архив: 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.009 c