Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Работа с графикой

Автор: -=Cherry=- 14.01.2007 13:55

Есть такая задача: Строится некоторое изображение
Запоминается его определенная область с помощью SetViewPort
Затем некоторый диалог с пользователем в текстовом режиме
Возврат в графический режим и попытка вернуть на экран изображение, которое запомнилось в SetViewPort, c помoщью GetViewSettings.

Суть вопроса заключается в том,чтобы правильно указать данные для этой процедуры (не очень понятно как использовать параметр ViewInfo)
Буду очень признательна,если приведете конкретный пример)


SetViewPort(10,10,110,110,Clipon);
...
...
...
GetViewSettings(??????)
Заранее спасибо)

Автор: volvo 14.01.2007 14:15

Ну, начнем с того, что SetViewPort ничего не запоминает, эта процедура просто напросто устанавливает размеры текущего вьюпорта... Запоминание делать так:

var
Buffer: Pointer;
size: integer;
...
size := ImageSize(x1, y1, x2, y2); { <--- размеры области }
{
!!!!!
Если размер картинки из области, которую ты хочешь сохранить
будет больше 64К, то size будет = 0, и GetResult (сразу после вызова ImageSize)
вернет значение grError, потому, что ты все равно не сможешь выделить кусок памяти
такого размера... Тогда придется разбивать изображение на части...
}

GetMem(Buffer, size);
GetImage(x1, y1, x2, y2, Buffer^);
{ В принципе, можно и в файл записать... Для надежности }

... { <-- Здесь делаешь, что тебе надо }

{ Восстанавливаем картинку: }
PutImage(x1, y1, Buffer^, NormalPut);
FreeMem(Buffer, size); { <--- Освобождаем буфер }
...


Автор: -=Cherry=- 14.01.2007 14:23

Buffer^ - это обращение через динамическую память?
А для чего тогда вообще нужен GetViewSettings?
Он просто возвращает значения?

Автор: Гость 14.01.2007 14:26

А еще хотела спросить FreeMem и GetMem - это стандартые процедуры? Pointer - что это за тип? unsure.gif

Автор: volvo 14.01.2007 14:42

Цитата
Он просто возвращает значения?
yes2.gif Он просто запоминает установки (размеры и признак clipping-а) для текущего вьюпорта, но никак не его содержимое...

Цитата
FreeMem и GetMem - это стандартые процедуры?
yes2.gif
Цитата
Pointer - что это за тип?
Указатель, что же еще может быть... Помощь (Ctrl+F1) в твоем Паскале что, отсутствует?

Автор: -=Cherry=- 14.01.2007 14:46

Разве может Help (пусть даже и мега -полноценный,что само по себе малореально) заменить непосредственное (пусть и интерактивное) общение?
Спасибо большое за ответы) give_rose.gif

Автор: -=АнЮтА=- 17.01.2007 18:35

Хочу спросить, а как можно сохранить в файл и как потом вызвать оттуда изображение? Не в буфер сохранять, а в файл? Просто указать путь к файлу? blink.gif

Просто хочется попробовать сохранить в файл! Помогите пожалуйста!!! unsure.gif

Автор: volvo 17.01.2007 19:33

После GetImage делаешь

Assign(f, 'pic.dat');
rewrite(f, size); { <--- size - то значение, которое вернулось из ImageSize }
blockwrite(f, Buffer^, 1);
close(f);


Чтобы прочесть картинку из файла:
Assign(f, 'pic.dat');
reset(f, 1);
getmem(buffer, filesize(f));
blockread(f, buffer^, filesize(f));
close(f);
...
{ и потом уже этот буфер записываешь на нужное место экрана с помощью PutImage }


Набирал прямо здесь - могут быть какие-то несоответствия, но идея - именно такая...

Автор: -=АнЮтА=- 17.01.2007 19:39

Спасибо, щас попробую)

Автор: -=АнЮтА=- 17.01.2007 19:59

а что значит 1,когда открываем на чтение файл и какого размера можно записать изображение в файл? Не более 64 также? Потому что Imagesize не вернет значение более 64 Кб,да?

Автор: volvo 17.01.2007 20:12

Если ты про второй параметр Reset/Rewrite, то это размер блока данных... Он важен потом, при чтении/записи данных через BlockRead или BlockWrite... Можно сказать, что это - минимальный размер блока данных, который можно записать в файл... Если, например, открыть файл через Rewrite(f, 3), то один байт в него записать уже не получится - только группами по 3 байта...

Цитата
какого размера можно записать изображение в файл?
Любого... Если читать картинку кусками, и записывать в файл порциями, а не всю сразу, то в принципе можно сохранять экраны любой сложности... Правда потом будет не так просто это прочитать, но это уже другой вопрос... smile.gif

Кстати, у нас на форуме выложены процедуры (в модуле) для снятия скриншотов, сохраняющие экран в файл формата BMP/PCX, вот тут точно не возникнет проблем при сохранении любого изображения, и при его восстановлении тоже... Если тебя это заинтересует - дам ссылку

Автор: -=АнЮтА=- 17.01.2007 20:19


Да, была бы очень признательна за ссылку)

Автор: volvo 17.01.2007 20:21

Здесь:
http://forum.pascal.net.ru/index.php?s=&showtopic=4533&view=findpost&p=38204

Автор: -=АнЮтА=- 17.01.2007 20:43

give_rose.gif Спасибо Вам за помощь! good.gif Все работает и я фьсьо поняла rolleyes.gif