Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

JPEG большого размера [D6, Win95/98]


Страницы:   1 2

danja12 ©   (2003-09-05 10:42:00) 

Необходимо копировать в TImage произвольные прямоугольные куски JPEG-файла размером от 2-х до 3-х Mb. (соответствующий BMP 40-50 Mb)

BMP := TBitMap.Create;
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(NP);
BMP.Assign(JPG);
Image1.Canvas.CopyRect(RWP , BMP.Canvas, RPP);
Jpg.Free;
BMP.Free;

В момент BMP.Assign(JPG) выдается ошибка EOutOfResurces : Параметр задан неверно.  Причем иногда отрабатывает, а иногда нет. Добавление BMP.Dormant; BMP.FreeImage; не помогает.

Можно ли в пинципе работать с такими объемами?


danja12   (2003-09-10 13:54:00) [21]

Копаю дальше: нет никакой разницы между двумя вариантами 1) когда Jpeg - создается, используется и уничтожается в прцедуре, т.е. является локальной переменной и 2) когда он создается в главной форме, уничтожается при ее закрытии, а в проседуре только гружу в него из файла и копирую его в канву, тогда он глобальная переменная и в проседуре нет никаких Jprg.Free.


dzmitry_   (2003-09-10 13:09:00) [22]

вот почему код падает, это не ясно... тут надо глядеть исходник, что бы сказать точно... может утечка какая неприметная...
среди компонентов я нашёл только вывод больших битмап в 256 цветов... исходник пока гляну, но вот я не смог сгененрировать самостоятельно картинку размером больше 15 на 15 тыс... я больше встречал, но то делал не я... не такая уж и простая задачка оказывается


danja12   (2003-09-10 12:20:00) [23]

> ZEE ©  (10.09.03 10:21) [14]
То что железо не причем, по Вашему мнению, это радует ! (А вот у меня был случай еще на первых Делфях, что программа выводила иконки на принтер только если видяха S3 и никакая другая.)
И, нет монитор у меня обычный и видео обычное - я на всякий случай спросил.

> dzmitry_  (10.09.03 11:26) [15]
Спасибо, было бы интересно.

А по теме - вот: Код грохается на 4-й раз, даже если Битмап размером 100 на 100, а картинку из JPEG'а я в него кидаю методом StretchDraw, т.е. за ошибку отвечает именно JPEG. Может надо использовать второй компонент модуля: TJPEGData?


dzmitry_   (2003-09-10 11:26:00) [24]

а интересно, существует ли компонент/класс по работе с изображениями, но не загружающие сразу всё в оперативку... буду искать, о результатах сообщу...


ZEE   (2003-09-10 10:21:00) [25]

[13] - не в видяхе дело, если ты это в памяти все делаешь, но если конечно ты это все например в Image1.Picture.Bitmap прям на видимой форме пихаешь - то может и видяха, хотя нет все-равно на экран все 3947х3947 не влезут (или у тебя супер навороченый монитор с охрененным разрешением...)


danja12   (2003-09-10 10:14:00) [26]

> Александр-И ©  (09.09.03 01:56) [12]
Александр, уточнили бы на каком этапе Вы устанавливаете размеры ImageBMP У меня как только ImageBMP.Height := 3947; ImageBMP.Width := 3947;так сразу OutOfResource! А если не устанавливаете или Stretch = True, так отчего бы и не работать.
То же самое dzmitry_ : 1024 * 768 может и прокатит, да не может, а точно, а вот четыре на четыре тысячи - нет.
Вот чего не знаю, так может опцию в проекте какую поставить, или в видяхе дело - сам сталкивался с такими глюками ?


Александр-И   (2003-09-09 01:56:00) [27]

А если так:

 jpgTMP := TJPEGImage.Create;
 jpgTMP.LoadFromFile('Foto.jpg');
 ImageBMP.Canvas.Draw(-2000,-800,jpgTMP);

//ImageBMP : TImage - т.е. не TBitMap

//Исходный размер Foto.jpg - 6500х4500 - больше у меня под рукой не оказалось

Я попробовал - все работает


danja12   (2003-09-08 12:44:00) [28]

Спасибо всем! (Это не значит что я закрываю тему, т.к. положительного результата пока нет :)

> ZEE ©  (08.09.03 11:07) [9]
Прошу прощения за некорректные высказывания и вопросы - мало опыта в таком общении, редко здесь бываю. Вопрос об освобождении памяти у меня пока открыт: программа отрабатывает 3-5 раз, затем нехватает ресурсов. Последнее достижение - не надо перезагружаться, только перезапустить программу (выкинул BMP.Dormant; BMP.FreeImage;).

> dzmitry_  (08.09.03 11:20) [10]
Попробую Ваш вариант, правда у меня BMP.Width:=3947; и
BMP.Height:=3947;
так что шансов немного. Кстати, в соседней ветке, слышал от Вас слово "картография" и, если есть желание или нужда, можем пообмениваться опытом. Я сейчас пытаюсь в свой картографический редактор подсунуть растровую подложку - уперся в объем jpg-файлов планшетов.


dzmitry_   (2003-09-08 11:20:00) [29]

кстати, я исправляюсь... я сделал так, и сработало

BMP.Width:=1024;
BMP.Height:=768;
BMP.Canvas.Draw(-100,-100,JPG);

вывести из JPG в BMP кусок от 100,100 с шириной 1024 и высотой 768


ZEE   (2003-09-08 11:07:00) [30]


> danja12   (08.09.03 09:00) [8]
> Насколько я знаю, Free как раз и вызывает Destroy, предварительно
> проверив не равен ли объект nil

это правильно, просто до этого ж был вопрос "А как уничтожить объект, кроме как Free ?"
так вот Destroy - тоже вариант...
еще есть
procedure FreeAndNil(var Obj);
но это все-равно тоже самое


danja12   (2003-09-08 09:00:00) [31]

Насколько я знаю, Free как раз и вызывает Destroy, предварительно проверив не равен ли объект nil, так что вряд ли это поможет. Мне кажется, я что-то недопонимаю в BMP.Dormant; BMP.FreeImage;
Но все равно, спасибо.


ZEE   (2003-09-05 17:17:00) [32]

Destroy


danja12   (2003-09-05 16:22:00) [33]

Вообще то, освобождение памяти у меня стоит в блоке try-finally.
Я для простоты здесь не привел полный текст, видимо зря - чтобы не возникало лишних вопросов.
А потом, в отладчике когда исполняю пошагово, она выполняется.
А как уничтожить объект, кроме как Free ?


ZEE   (2003-09-05 15:03:00) [34]

а если так
try
 BMP := TBitMap.Create;
 Jpg := TJpegImage.Create;
...

finally
 Jpg.Free;
 BMP.Free;
end;

может просто где-то до Free обработка "срывается" и до освобождения памяти дело не доходит...


danja12   (2003-09-05 13:47:00) [35]

На самом деле, самый интересный вопрос это: почему после перезагрузки машины первые 3 или 4 раза код отрабатывает и только потом грохается. Значит, не смотря на


BMP.ReleaseHandle;
BMP.Free;


память не освобождается! И что поэтому поводу можно сделать?


ZEE   (2003-09-05 12:24:00) [36]

тогда ищи инфу по формату Jpeg, потом залазь в файл и вытаскивай прям из него нужный тебе кусок...
только, подозреваю, это будет гемор...


dzmitry_   (2003-09-05 11:52:00) [37]

угу... круто будет если
JPG.Width:=8000
на
JPG.Height:=6000 - оут оф ресурс...
ещё варианты...


ZEE   (2003-09-05 11:02:00) [38]

вместо
BMP.Assign(JPG);
пиши
BMP.Width:=JPG.Width;
BMP.Height:=JPG.Height;
BMP.Canvas.Draw(0,0,JPG);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо